我对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语句。或者是否有更清洁/更简单的方式?
答案 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