我试图理解我的自定义EL功能与标准EL功能相比的失败。我定义了自定义EL函数,funcForJS和funcForHTML,用于嵌入式javascript和JSP文件中的普通HTML标记。我发现虽然普通HTML标记块中引用的funcForHTML已成功解析,但我的嵌入式javascript中使用的funcForJS未被找到"。在嵌入式JavaScript中利用EL函数是不好的做法吗?无论如何 - 它应该像我尝试一样工作吗?向浏览器报告的错误是:
错误500:javax.el.ELException:Function' myel:funcForJS'找不到
自定义函数java文件是:
package my.test;
public class MyELFuncs {
public static java.lang.String funcForJS(java.lang.String str) {
return str+" JS";
}
public static java.lang.String funcForHTML(java.lang.String str) {
return str+" HTML";
}
}
,自定义tld文件为:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>MyTagLibrary</short-name>
<uri>/MyTagLibrary</uri>
<function>
<description>Returns the same string with JS on end</description>
<name>funcForJS</name>
<function-class>my.test.MyELFuncs</function-class>
<function-signature>java.lang.String funcForJS( java.lang.String )</function-signature>
</function>
<function>
<description>Returns the same string with HTML on end</description>
<name>funcForHTML</name>
<function-class>my.test.MyELFuncs</function-class>
<function-signature>java.lang.String funcForHTML( java.lang.String )</function-signature>
</function>
</taglib>
在JSP中我有这个:
<%@page session="true" contentType="text/html" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/MyTagLibrary" prefix="myel" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>Process CAP Receive</title>
<script type="text/javascript">
// the standard function fn:trim works fine here
var standardFnTrimStr = "${fn:trim(' this test str ')}";
// my custom function throws error
var myCustFuncStr = "${myel:funcForJS('some test text')}";
console.log("standardFnTrimStr="+standardFnTrimStr+", myCustFuncStr="+myCustFuncStr);
</script>
</head>
<body>
<label>${myel:funcForHTML("this is in HTML block")}</label>
</body>
</html>
在web.xml中我有这个:
<taglib>
<taglib-uri>/MyTagLibrary</taglib-uri>
<taglib-location>/WEB-INF/config/myCustomTags.tld</taglib-location>
</taglib>
注意:我发现了一个解决方案,这似乎是我的自定义myel所必需的:funcForJS,但不适用于标准的fn:trim。解决方法是,当我在脚本块外部的html主体中的myel:funcForJS放置一个虚拟引用时,脚本块中的myel:funcForJS成功解析。我没有必要为fn:trim函数做到这一点,那么我的自定义funcForJS有什么不同呢?我错过了什么?