2016-05-13 4 views
0

Ich bin ziemlich neu in der Java, JSP und Taglib Welt und ein einfaches Problem stört mich. Ich möchte nur überprüfen, ob die Browser-Agent-Zeichenfolge des Benutzers "Opera Mini" oder eine alte Android-Version enthält, um zu prüfen, ob sie mit meiner App kompatibel ist.Wie Regex-Funktion auf User-Agent-Zeichenfolge in Jsp verwenden?

ich meine Funktion in Eclipse getestet dies ist, wie es aussieht:

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; 
    } 
} 

Jetzt möchte ich diese Funktion nutzen als jar taglib eingebettet und verwenden Sie es in meiner jsp-Datei. Ich habe eine Menge Beispiele für benutzerdefinierte Tag-Bibliotheken gefunden, aber ich habe kein Beispiel für eine Taglib gefunden, die einfach eine Funktion hat, die einen booleschen Wert zurückgibt. Ist es überhaupt möglich, ein Taglib-Glas so zu verwenden? Ich habe versucht, eine jar taglib zu erstellen, und ich konnte es nicht funktionieren lassen.

Nach diesem Beispiel am Ende dieser Seite: https://docs.oracle.com/javaee/1.4/tutorial/doc/JSPIntro7.html#wp77078 scheint es möglich zu sein. Aber ich denke, wenn Sie eine JAR-Datei für die Lib erstellen, ist der -Tag erforderlich. Ich konnte das Beispiel nicht wiederherstellen. Dies ist ein Teil meiner taglib decriptor im Glas:

... 
<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> 
... 

Dies ist die Klasse:

package my.package; 

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

Ich versuchte es auf meinem lokalen Xampp Kater. Ich habe die Taglib in der web.xml referenziert und eine Tld-Datei im Tag-Verzeichnis erstellt. Im jsp referenzierten ich es mit:

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

Dies wirft die folgende Ausnahme: No tag "hello(" defined in tag library imported with prefix "test".

Was habe ich vermisst oder was habe ich falsch gemacht? Ich denke, dass ich in der Lage sein würde, mein User-Agent-If-Statement einfach zu emebdieren. Oder gibt es sogar einen saubereren/einfacheren Weg?

Antwort

1

Sie benötigen keine Taglibs für diese, wenn Sie nicht möchten. Die unten ist vielleicht ein bisschen hässlich, aber es ist der schnellste Weg zu tun, was Sie wollen, und elegant IMHO:

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

Hinweis Sie müssen request auf Ihre isCompatible Methode zu übergeben, so in Ihrer Methode Du die tatsächlichen User-Agent Header holen kannst . Sie müssen die Methode auch veröffentlichen. Zum Beispiel:

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

Vielen Dank! Konnte es noch nicht versuchen, sieht aber vielversprechend aus. Habe aber inzwischen meine eigene jar taglib Lösung gefunden. – user2718671

0

fand ich eine Lösung: 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 in Meine Tags Ordner:

<?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 (taglib Descriptor innerhalb jar):

<?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> 

mein j ava-Datei:

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 Referenz:

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

Nun - vielleicht ist es nicht die perfekte Lösung, aber zumindest etwas, das für den Start funktioniert.: D