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

时间:2016-05-13 11:26:43

标签: 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-File中使用它。我发现了很多自定义标记库的例子,但是我没有找到一个taglib的例子,它只有一个返回布尔值的函数。甚至可以使用这样的taglib jar吗?我试图创建一个jar标签,但我无法使它工作。

根据本页底部的这个例子: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> 
...

这是班级:

package my.package;

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

我在我的本地xampp tomcat上尝试过它。我在web.xml中引用了taglib,并在tags-directory中创建了一个tld-file。在jsp中我引用了它:

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

这会引发以下异常:No tag "hello(" defined in tag library imported with prefix "test"

我错过了什么或者我做错了什么。我认为通过运行示例,我可以轻松地使用我的user-agent-if语句。或者是否有更清洁/更简单的方式?

2 个答案:

答案 0 :(得分:1)

如果您不想,您不需要taglibs。下面可能有点难看,但它是你想做的最快的方式,优雅的恕我直言:

<% 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标头。您还需要将该方法公之于众。例如:

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

答案 1 :(得分:0)

我找到了一个解决方案: JSP:

<%@ taglib prefix="comp" uri="http://www.myurl.com/taglibs/comp" %>
<c:out value="${header['User-Agent']}" />
    <c:set var="andver">
        <comp:check UA="${header['User-Agent']}" />   
    </c:set>
<c:out value="${andver}" />

我的代码文件夹中的comp.tld:

<?xml version="1.0" encoding="ISO-8859-1" ?>
    <taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
    <tlib-version>1.0</tlib-version>
    <display-name>Check my app compatibility</display-name>
    <short-name>comp</short-name>
    <uri>http://www.myurl.com/taglibs/comp</uri>   
</taglib>

comp.tld(jar中的taglib描述符):

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
  <description>Check compatibility</description>
  <tlib-version>1.0</tlib-version>
  <short-name>comp</short-name>
  <uri>http://www.myurl.com/taglibs/comp</uri>
  <tag>
    <description>
      Check if browser is compatible with my app
    </description>
    <name>check</name>
    <tag-class>my.package.comp.check</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
        <name>UA</name>
        <required>true</required>       
        <type>java.lang.String</type>
        <rtexprvalue>true</rtexprvalue>
    </attribute>    
  </tag>
</taglib>

我的java文件:

package my.package.comp;

import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.util.*;
import java.util.regex.*; 

public class check extends TagSupport
{
    private String content;
    public void setUA(String UA) {
        this.content = UA;
    }

    public int doStartTag() throws JspException
    {
        try
        {
            JspWriter out = pageContext.getOut();
            HttpServletResponse response = (HttpServletResponse)pageContext.getResponse();
            out.print(isCompatible());  
            //out.write(UA);
        }
        catch(Exception e)
        {   
            throw new JspException(e.getMessage());
        }
        return EVAL_PAGE;

    }

    boolean isCompatible(){     
        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;
    }

}

web.xml参考:

<taglib> 
    <taglib-uri>/tags/comp.tld</taglib-uri> 
    <taglib-location>http://www.myurl.com/taglibs/comp</taglib-location> 
</taglib>

嗯 - 也许它不是完美的解决方案,但至少可以起作用的东西。 :d