如何创build一个自定义EL函数来调用一个静态方法?

Im新的JSF 2.我的问题是相关的BalusC的这个问题的答案jsf2 ajax更新部分根据请求参数我试过了kickstart代码BalusC张贴和我遇到了一个ELparsing错误:

/nameofpage.xhtml @12,64 rendered="#{bean.panels.contains('u1')}" Error Parsing: #{bean.panels.contains('u1')} 

我猜这是因为我没有运行一个支持Servlet 3.0 / EL 2.2的容器,并且根据Servlet 3.0规范声明了/WEB-INF/web.xml。 我正在使用Tomcat 6。

BalusC在他的答案中build议创build一个自定义ELfunction。 但是,如何使用自定义ELfunction来完成此操作? 或者可以通过configuration我的项目的某些部分来解决这个问题?

下面是我的web.xml

 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app> 

首先用public static方法创build一个final类,它完成你想要的工作:

 package com.example; import java.util.Collection; public final class Functions { private Functions() { // Hide constructor. } public static boolean contains(Collection<Object> collection, Object item) { return collection.contains(item); } } 

然后在/WEB-INF/functions.taglib.xml中将其定义为facelet-taglib

 <?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>contains</function-name> <function-class>com.example.Functions</function-class> <function-signature>boolean contains(java.util.Collection, java.lang.Object)</function-signature> </function> </facelet-taglib> 

然后在现有的/WEB-INF/web.xml使用新的taglib对Facelets进行/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> 

(注意:如果你已经定义了javax.faces.FACELETS_LIBRARIES ,那么你可以直接添加分隔符的新path)

然后在Facelets XHTML文件中将其定义为新的XML命名空间:

 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:func="http://example.com/functions" ... > 

最后你可以按照预期使用它:

 rendered="#{func:contains(bean.panels, 'u1')}" 

作为一个完全不同的select,你也可以在你的项目中包含JBoss EL。 它在Tomcat 6.0上工作,你可以在EL中调用非get方法。 将/WEB-INF/lib jboss-el.jar文件放在/WEB-INF/lib ,并将以下内容添加到web.xml

 <context-param> <param-name>com.sun.faces.expressionFactory</param-name> <param-value>org.jboss.el.ExpressionFactoryImpl</param-value> </context-param> 

自EL 2.2以来,还有另外一种方法:创build一个@ApplicationScoped bean,然后引用这些静态函数。 另请参阅应用程序范围的bean中的 ao 实用程序方法 。