为什么EL功能在这种情况下不起作用?

时间:2016-01-10 16:41:52

标签: function jsp el

我正在使用Java 1.7,Eclipse Luna和JBoss 4.2.3。

我创建了一个名为“Test001_WAR”的简单动态Web项目。在其中:

我创建了一个StringUtil类,我定义了一个公共静态方法:

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函数并将返回值存储在另一个隐藏变量中,然后在加载两个隐藏变量的警报值之后:

<%@ 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类中的函数,但它接收的参数值与从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 =

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

为什么不使用那样做的standard JSTL fn:trim() function

无论如何,JSP EL使用页面/请求/会话/应用程序属性。不是scriptlet局部变量。

如果scriptlet执行

,您的代码(可能)会起作用
page.setAttribute("mystring", " abd ");    

或者,如果你做了正确的事并完全忘记了scriptlet:

<c:set var="mystring" value=" abd "/>