我是JSF 2的新手。我的问题与BalusC对此问题的回答有关,它基于请求参数jsf2 ajax更新部件,我尝试了BalusC发布的kickstart代码,遇到EL解析错误:

 /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