我正试图在JSF 2应用程序中使用Apache Commons Lang 3,并遵循了BalusC的示例
但是当我在.xhtml页面中包含这一行时:
<%@taglib prefix="f" uri="/WEB-INF/functions.tld" %>
解析页面代码时出错。
我该如何解决这个问题?
答案针对的是一个问题,该问题的询问者已知在JSP上使用JSF1.x。您所拥有的语法是特定于JSP的,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)}
的形式提供了这个函数,以备您使用