/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。我正在使用Tomcat6。
BalusC在他的答案中建议创建一个自定义EL函数。但是,如何使用自定义EL函数完成此操作?还是可以仅通过配置项目的某些部分来解决?
下面是我的
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>
#1 楼
首先使用final
方法创建一个public static
类,该方法完全可以完成您想要的工作: 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);
}
}
然后在
facelet-taglib
中将其定义为/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>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:<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
,则只需添加新的路径以分号分隔)然后在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')}"
,您也可以在项目中包含JBoss EL。它可以在Tomcat 6.0上运行,您将能够在EL中调用非getter方法。将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,存在另一种方法:使用以下方法创建一个
@ApplicationScoped
bean:方法依次引用这些静态函数。另请参阅应用程序作用域bean中的实用程序方法。
评论
感谢您的快速答复BalusC!我尝试了jobs-el.jar方法。错误现在消失了,它显示3个复选框u1,u2,u3,但是当我选择其中的任何一个时,似乎都没有发生(Chrome,Firefox),我也在Internet Exporer中进行了测试,并且选中了以下任何复选框后,它会说:错误详细信息消息:'mojarra'未定义行:9字符:1代码:0 URI:localhost:8080 / myproject / ajaxcall.jsf我缺少任何内容吗?感谢您的耐心配合,并提前感谢您BalusC
–royjavelosa
2011年8月16日在16:33
别客气。您的新问题实际上是一个不同的问题,需要通过右上方的“提问”按钮来提问。您的第一个问题已得到回答。无论如何,这是一个提示:
– BalusC
2011年8月16日在16:37
再次感谢BalusC,jobss-el.jar的工作方式非常吸引人!我将使用“询问问题”询问新问题。
–royjavelosa
2011年8月16日在16:55
是的,您可以为此使用
– BalusC
2012年8月22日19:33
@Thang:不,那不可能。每个重载的EL方法必须具有不同的EL函数名称。
– BalusC
2012年8月23日19:29