2012-10-22 8 views

Odpowiedz

9

Jeśli środowisko obsługuje nowy EL 2.2 cechę wywoływanie metod non-getter na obiektach EL (który jest dostępny we wszystkich Servlet 3.0 kompatybilnych pojemnikach, takich jak Tomcat 7, GlassFish 3, etc), a następnie można po prostu użyj metody String#matches() bezpośrednio w EL.

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

(Zostawię - minus i tysiące i separatory frakcji , i . poza rozważenia jako możliwych znaków, które mogą pojawić się w sposób technicznie prawidłowy numer)

Należy zauważyć, że z <c:set> wyrażenie w jego ciele body niejawnie konwertuje dowolny typ na String przy użyciu String#valueOf(). W przeciwnym razie wywołanie matches() zadzwoniłoby pod <c:if> dla typów nie-.

2

Można utworzyć funkcję niestandardową, jak wyjaśniono w następujących ćwiczeń:

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

kroki, aby utworzyć funkcję z powyższego linki:

  1. Utwórz plik .tld pod /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. Utwórz klasę z metodą (logiki metody pochodzi od here, używa 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. Następnie użyj go na stronie JSP jako:

    <%@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

Jeśli naprawdę nalegać na

(bez wysuwania jakichkolwiek klas Java i dodatkowe funkcje JSP)

następnie można użyć następującego siekać.

<%@ 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

Nie wiedziałem o , to nie jest idealnie zadbane rozwiązanie, ale spełnia swoją rolę.Można argumentować, że jest to nadużywanie wyjątków, ale jeśli w rzeczywistości jest to "wyjątek" do otrzymania liczby i spodziewamy się liczby, to w rzeczywistości nie jest tak źle. W wielu przypadkach kod może być prostszy, bardziej podobny do marc82ch