7

如何在 JSTL 中进行这个简单的检查(不扩展任何 Java 类和额外的 JSP 函数)。我需要这样的:

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

提前致谢。

4

3 回答 3

10

如果您的环境支持在 EL 对象上调用非 getter 方法的新 EL 2.2 功能(在所有 Servlet 3.0 兼容容器中可用,例如 Tomcat 7、Glassfish 3 等),那么您可以String#matches()直接在 EL 中使用该方法.

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

(我将把减号-、千位和分数分隔符,.外部考虑作为可能出现在技术上有效的数字中的字符)

请注意,其主体<c:set>中的with 表达式将任何类型隐式转换为using 。否则,非类型的调用将失败。StringString#valueOf()matches()<c:if>String

于 2012-10-22T21:34:54.623 回答
6

如果你真的坚持

(不扩展任何 java 类和额外的 JSP 函数)

那么您可以使用以下技巧。

<%@ 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>
于 2012-10-22T15:42:12.847 回答
2

您可以按照以下教程中的说明创建自定义函数:

  1. 使用 JSTL 在 JSP 中创建自定义函数
  2. 如何为 JSTL 创建自定义函数
  3. 另一个教程

从上述链接创建函数的步骤:

  1. 在下面创建一个.tld文件/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. 用方法创建一个类(方法的逻辑取自这里,它使用正则表达式

    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. 然后在 JSP 中使用它作为:

    <%@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>
    
于 2012-10-22T15:10:02.547 回答