2012-10-22 19 views
6

zu überprüfen, wie diese einfache Überprüfung in JSTL (ohne Erweiterung von Java-Klassen und zusätzliche JSP-Funktionen). Ich brauche es so:Wie isNumeric/IsNumber in JSTL

<c:if test="${fn:isNumeric()}"> 
... do something ... 
</c:if> 

Vielen Dank im Voraus.

Antwort

9

Wenn Ihre Umgebung die neue EL 2.2 Funktion des Aufrufens nicht-Getter-Methoden auf EL-Objekte unterstützt (die in allen Servlet 3.0 kompatible Container wie Tomcat 7, Glassfish 3, etc. verfügbar ist), dann könnte man Verwenden Sie einfach die String#matches() Methode direkt in EL.

<c:set var="numberAsString">${someExpressionToTestForNumber}</c:set> 
<c:if test="${numberAsString.matches('[0-9]+')}"> 
    It's a number! 
</c:if> 

(Ich werde das Minus - und die Tausende und Fraktion Separatoren , und . außerhalb Betrachtung als mögliche Zeichen verlassen, die in einer technisch gültige Zahl angezeigt)

Beachten Sie, dass die <c:set> mit der Ausdruck in seiner Körper konvertiert implizit jeden Typ zu String mit String#valueOf(). Andernfalls würde der matches() Anruf in <c:if> für nicht String Typen fehlschlagen.

2

Sie können eine benutzerdefinierte Funktion wie in den folgenden Anleitungen erklärt erstellen:

  1. Creating Custom functions in JSP using JSTL
  2. How to create a custom Function for JSTL
  3. Another tutorial

Schritte eine Funktion aus dem oben zu schaffen Links:

  1. erstellen .tld Datei unter /WEB-INF:

    <?xml version="1.0" encoding="UTF-8"?> 
    <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> 
        <short-name>functionalTlds</short-name> 
        <uri>http://www.rasabihari.com/functionalTlds</uri> 
        <function> 
         <name>isNumeric</name> 
         <function-class>com.expressions.Functions</function-class> 
         <function-signature>boolean isNumeric(java.lang.String)</function-signature> 
        </function> 
    </taglib> 
    
  2. Erstellen Sie eine Klasse mit dem Verfahren (die Logik des Verfahrens von here genommen wird, verwendet es Regular Expression)

    package com.expressions; 
    
    /** 
        * 
        * @author rasabihari 
        */ 
    public class Functions { 
        public static boolean isNumeric(String number) { 
         boolean isValid = false; 
         /* 
         Explaination: 
         [-+]?: Can have an optional - or + sign at the beginning. 
         [0-9]*: Can have any numbers of digits between 0 and 9 
         \\.? : the digits may have an optional decimal point. 
         [0-9]+$: The string must have a digit at the end. 
         If you want to consider x. as a valid number change 
         the expression as follows. (but I treat this as an invalid number.). 
         String expression = "[-+]?[0-9]*\\.?[0-9\\.]+$"; 
         */ 
    
         String expression = "[-+]?[0-9]*\\.?[0-9]+$"; 
         CharSequence inputStr = number; 
         Pattern pattern = Pattern.compile(expression); 
         Matcher matcher = pattern.matcher(inputStr); 
    
         if(matcher.matches()){ 
          isValid = true; 
         } 
    
         return isValid; 
        } 
    } 
    
  3. Und dann verwenden Sie es in der JSP als:

    <%@page contentType="text/html" pageEncoding="UTF-8"%> 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
        "http://www.w3.org/TR/html4/loose.dtd"> 
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
    <%@taglib uri="http://www.rasabihari.com/functionalTlds" prefix="ftld" %> 
    <html> 
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
        <title>JSP Page</title> 
    </head> 
    <body> 
        <c:if test="${ftld:isNumeric('123')}"> 
         <!-- ... do something ... 
          This block will run 
         --> 
        </c:if> 
    </body> 
    </html> 
    
5

Wenn Sie wirklich auf

bestehen

(ohne Java-Klassen und zusätzliche JSP Funktionen erstrecken)

dann können Sie den folgenden Hack verwenden.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 
<c:set var="x" value="8" /> 
<c:catch var="isNumber"> 
    <c:set var="x" value="${x * 1}" /> 
</c:catch> 
<c:if test="${isNumber == null}"> 
    ... do something ... 
</c:if> 
<c:if test="${isNumber != null}"> 
     ... do not do anything... 
</c:if> 
+0

Ich wusste nicht über , es ist keine perfekt saubere Lösung, aber es macht den Job.Man könnte argumentieren, dass man Ausnahmen missbraucht, aber wenn es tatsächlich eine "Ausnahme" ist, eine Nummer zu erhalten und man eine Zahl erwartet, ist das eigentlich nicht so schlimm. In vielen Fällen könnte der Code auch einfacher sein, eher wie marc82ch