我正在尝试在我的JSF 2应用程序中使用Apache Commons Lang 3,并且我遵循了BalusC的example
但是当我在 .xhtml 页面中包含此行时:
<%@taglib prefix="f" uri="/WEB-INF/functions.tld" %>
解析页面代码时出错。
我该如何解决问题?
答案 0 :(得分:1)
答案针对的是一个问题,其提问者在JSP上使用JSF 1.x。您在那里的语法特定于JSP,它是Facelets的遗留先驱,自JSF 2.0以来已被弃用。
完全删除functions.tld
文件。正确的JSF 2.x Facelets基于现有静态方法声明自定义函数的方法如下:
首先创建一个/WEB-INF/functions.taglib.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
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-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://example.com/functions</namespace>
<function>
<function-name>escapeJavaScript</function-name>
<function-class>org.apache.commons.lang.StringEscapeUtils</function-class>
<function-signature>java.lang.String escapeJavaScript(java.lang.String)</function-signature>
</function>
</facelet-taglib>
然后在/WEB-INF/web.xml
注册:
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/functions.taglib.xml</param-value>
</context-param>
(当这个步骤放在JAR文件的/META-INF
中时,该步骤是不必要的,而JAR文件又放在/WEB-INF/lib
)
最后声明并使用如下:
<html ... xmlns:func="http://example.com/functions">
...
<h:outputScript>var foo = '#{func:escapeJavaScript(bean.foo)}';</h:outputScript>
请注意,我已更新您找到的相应答案。另请注意,如果您正在使用此功能,则JSF实用程序库OmniFaces已在#{of:escapeJS(bean.foo)}
框外提供此功能。