java - 如何在jsp中的用户代理字符串上使用正则表达式函数?

标签 java jsp jar taglib

我对 Java、JSP 和 Taglib 世界还很陌生,有一个简单的问题困扰着我。我只想检查用户的浏览器代理字符串是否包含“Opera Mini”或旧的 Android 版本,以检查它是否与我的应用程序兼容。

我在 Eclipse 中测试了我的函数,如下所示:

package test.Regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UserAgentRegexTest {
    public static void main(String args[]){
        System.out.println(isCompatible());
    }

    static boolean isCompatible(){
        //String content = "Mozilla/5.0 (Linux; U; Android 4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30";
        //String content = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36";
        //String content = "Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.16823Mod.by.Handler/22.387; U; en) Presto/2.5.25 Version/10.54";
        String content = "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36";

        String patternString = "Android (\\d.\\d)|Opera Mini";
        Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(content);
        if(matcher.find()) {
            if(matcher.group(1) != null){
                double version = Double.parseDouble(matcher.group(1).toString());
                if(version > 4.4){
                    return true;
                }
            }   
            return false;
        }
        return true;
    }
}

现在我想使用这个嵌入为 jar taglib 的函数并在我的 jsp 文件中使用它。我找到了很多自定义标签库的示例,但没有找到仅具有返回 boolean 值的函数的标签库示例。甚至可以使用这样的 taglib jar 吗?我尝试创建一个 jar taglib,但无法使其工作。

根据本页底部的示例:https://docs.oracle.com/javaee/1.4/tutorial/doc/JSPIntro7.html#wp77078似乎有可能。但我想当你为 lib 创建 jar 文件时,-Tag 是必需的。我无法重新创建该示例。这些是 jar 中我的 taglib 描述符的一部分:

...
<uri>http://www.imaginary.url/my_taglib_name</uri>    
<function>
      <name>hello</name>
      <function-class>my.package.Functions</function-class>
      <function-signature>java.lang.String hello(java.lang.String)</function-signature>
</function> 
...

这是类(class):

package my.package;

public class Functions {
   public static String hello(String name) {
     return "Hiya, " + name + ".";
   }
}

我在本地 xampp tomcat 上尝试过。我在 web.xml 中引用了 taglib,并在标签目录中创建了一个 tld 文件。在 jsp 中我引用它:

<%@ taglib prefix="test" uri="http://www.imaginary.url/my_taglib_name" %>
<test:hello("bla") />

这会引发以下异常:在使用前缀“test”导入的标签库中没有定义标签“hello(”

我错过了什么或者我做错了什么。我认为通过运行该示例,我将能够轻松地嵌入我的 user-agent-if-statement。或者有没有更干净/更简单的方法?

最佳答案

如果您不愿意,则不需要为此使用标签库。下面的代码可能有点难看,但它是做你想做的事情最快的方法,而且优雅的恕我直言:

<% if (test.Regexp.UserAgentRegexTest.isCompatible(request)) { %>
  ... rest of your JSP in case of true ...
<% } else { %>
  ... rest of your JSP in case of false ...
<% } %>

请注意,您需要将 request 传递给您的 isCompatible 方法,以便在您的方法中可以获取实际的 User-Agent header 。您还需要公开该方法。例如:

public static boolean isCompatible(HttpServletRequest request) {
        String content = request.getHeader("User-Agent");
        ...

关于java - 如何在jsp中的用户代理字符串上使用正则表达式函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37208873/

相关文章:

java - jsp标签文件是否编译为简单标签

jsp - Wicket 和 JSP

从 jar 文件加载类时出现 java.lang.ClassNotFoundException

java - 使用什么 vavr 集合来包装 java.util.ArrayList

Java 内存分配性能(SunOS 与 Windows)

Eclipse Java EE 和 Tomcat 6 : Error 404 requested resource not available

localization - OSGi bundle 结构是什么?

intellij-idea - 是什么导致 JAR 文件在 IntelliJ IDEA 中显示为空?

java - 这真的是适配器模式的一个例子吗?

java - 如何检查数组中的所有重复项是否已分组