为什么 EL 功能在这种情况下不起作用?
Why EL function not working in this case?
我正在使用 Java 1.7、Eclipse Luna 和 JBoss 4.2.3。
我创建了一个名为“Test001_WAR”的简单动态 Web 项目。其中:
我创建了一个 StringUtil
class 并定义了一个 public 静态方法:
package com.srh.base.util;
public final class StringUtil {
public static String notNullTrim(String string) {
System.out.println("StringUtil.java: notNullTrim(String): string=" + string);
if (string == null) {
return "";
} else {
return string.trim();
}
}
}
我创建了一个 myfunction.tld
文件,我在其中将上述 Java 方法映射到 EL 函数:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
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 ">
<display-name>Custom Functions</display-name>
<tlib-version>1.0</tlib-version>
<short-name>NMTOKEN</short-name>
<uri>http://test001.srh.com/functions</uri>
<function>
<name>notNullTrim</name>
<function-class>com.srh.base.util.StringUtil</function-class>
<function-signature>java.lang.String notNullTrim(java.lang.String)</function-signature>
</function>
</taglib>
我创建了一个 index.jsp
,我在其中使用上述 EL 函数进行测试。在其中我定义了一个带有空格“abc”的字符串,将其存储在一个隐藏变量中,对其调用 EL 函数并将 return 值存储在另一个隐藏变量中,然后在加载两个隐藏变量的警报值之后:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://test001.srh.com/functions" prefix="fr" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function afterLoad() {
alert("h_mystring_org=" + document.getElementById("h_mystring_org").value);
alert("h_mystring_new=" + document.getElementById("h_mystring_new").value);
}
</script>
</head>
<body onload="afterLoad();">
<%
String mystring = " abd ";
System.out.println("index.jsp: mystring=" + mystring);
%>
<form action="">
<input type="hidden" id="h_mystring_org" name="h_mystring_org" value="<%=mystring%>">
<input type="hidden" id="h_mystring_new" name="h_mystring_new" value="${fr:notNullTrim(mystring)}">
</form>
</body>
</html>
我将 WAR 部署到 JBoss。然后去URL
http://localhost:8080/Test001_WAR/index.jsp
没用。 StringUtil
class 中的函数被调用,但它接收到的参数值与从 JSP.
中传递的参数值不同
在 server.log
文件中我看到:
2016-01-10 10:58:37,295 INFO [STDOUT] index.jsp: mystring= abd
2016-01-10 10:58:37,298 INFO [STDOUT] StringUtil.java:
notNullTrim(String): string=
警报值为
h_mystring_org= abd
h_mystring_new=
我做错了什么?
为什么不使用能做到这一点的 standard JSTL fn:trim()
function?
无论如何,JSP EL 使用 page/request/session/application 属性。不是 scriptlet 局部变量。
如果 scriptlet 可以,您的代码将(可能)工作
page.setAttribute("mystring", " abd ");
或者,如果您做对了并且完全忘记了 scriptlet:
<c:set var="mystring" value=" abd "/>
我正在使用 Java 1.7、Eclipse Luna 和 JBoss 4.2.3。
我创建了一个名为“Test001_WAR”的简单动态 Web 项目。其中:
我创建了一个 StringUtil
class 并定义了一个 public 静态方法:
package com.srh.base.util;
public final class StringUtil {
public static String notNullTrim(String string) {
System.out.println("StringUtil.java: notNullTrim(String): string=" + string);
if (string == null) {
return "";
} else {
return string.trim();
}
}
}
我创建了一个 myfunction.tld
文件,我在其中将上述 Java 方法映射到 EL 函数:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
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 ">
<display-name>Custom Functions</display-name>
<tlib-version>1.0</tlib-version>
<short-name>NMTOKEN</short-name>
<uri>http://test001.srh.com/functions</uri>
<function>
<name>notNullTrim</name>
<function-class>com.srh.base.util.StringUtil</function-class>
<function-signature>java.lang.String notNullTrim(java.lang.String)</function-signature>
</function>
</taglib>
我创建了一个 index.jsp
,我在其中使用上述 EL 函数进行测试。在其中我定义了一个带有空格“abc”的字符串,将其存储在一个隐藏变量中,对其调用 EL 函数并将 return 值存储在另一个隐藏变量中,然后在加载两个隐藏变量的警报值之后:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://test001.srh.com/functions" prefix="fr" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function afterLoad() {
alert("h_mystring_org=" + document.getElementById("h_mystring_org").value);
alert("h_mystring_new=" + document.getElementById("h_mystring_new").value);
}
</script>
</head>
<body onload="afterLoad();">
<%
String mystring = " abd ";
System.out.println("index.jsp: mystring=" + mystring);
%>
<form action="">
<input type="hidden" id="h_mystring_org" name="h_mystring_org" value="<%=mystring%>">
<input type="hidden" id="h_mystring_new" name="h_mystring_new" value="${fr:notNullTrim(mystring)}">
</form>
</body>
</html>
我将 WAR 部署到 JBoss。然后去URL
http://localhost:8080/Test001_WAR/index.jsp
没用。 StringUtil
class 中的函数被调用,但它接收到的参数值与从 JSP.
在 server.log
文件中我看到:
2016-01-10 10:58:37,295 INFO [STDOUT] index.jsp: mystring= abd
2016-01-10 10:58:37,298 INFO [STDOUT] StringUtil.java: notNullTrim(String): string=
警报值为
h_mystring_org= abd
h_mystring_new=
我做错了什么?
为什么不使用能做到这一点的 standard JSTL fn:trim()
function?
无论如何,JSP EL 使用 page/request/session/application 属性。不是 scriptlet 局部变量。
如果 scriptlet 可以,您的代码将(可能)工作
page.setAttribute("mystring", " abd ");
或者,如果您做对了并且完全忘记了 scriptlet:
<c:set var="mystring" value=" abd "/>