if your environment supports the new EL 2.2 feature of invoking non-getter methods on EL objects (which is available in all Servlet 3.0 compatible containers, such as Tomcat 7, Glassfish 3, etc), then you could just use the String#matches()
method directly in EL.
<c:set var="numberAsString">${someExpressionToTestForNumber}</c:set>
<c:if test="${numberAsString.matches('[0-9]+')}">
It's a number!
</c:if>
(I'll leave the minus -
and the thousands and fraction separators ,
and .
outside consideration as possible characters which may appear in a technically valid number)
Note that the <c:set>
with the expression in its body implicitly converts any type to String
using String#valueOf()
. Otherwise the matches()
call in <c:if>
would fail for non-String
types.
You can create a custom function as explained in the following tutorials:
- Creating Custom functions in JSP using JSTL
- How to create a custom Function for JSTL
- Another tutorial
Steps to create a function from the above links:
-
Create a
.tld
file under /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>
-
Create a class with the method (the logic of the method is taken from here, it uses 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;
}
}
-
And then use it in the JSP as:
<%@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>
String#matches()
method directly in EL.<c:set var="numberAsString">${someExpressionToTestForNumber}</c:set>
<c:if test="${numberAsString.matches('[0-9]+')}">
It's a number!
</c:if>
-
and the thousands and fraction separators ,
and .
outside consideration as possible characters which may appear in a technically valid number)<c:set>
with the expression in its body implicitly converts any type to String
using String#valueOf()
. Otherwise the matches()
call in <c:if>
would fail for non-String
types.
You can create a custom function as explained in the following tutorials:
- Creating Custom functions in JSP using JSTL
- How to create a custom Function for JSTL
- Another tutorial
Steps to create a function from the above links:
- Create a
.tld
file under/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>
- Create a class with the method (the logic of the method is taken from here, it uses 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; } }
- And then use it in the JSP as:
<%@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>
No comments:
Post a Comment