Jsf 2 JSF2EL函数与Tomcat6.0.x和EL2.2

Jsf 2 JSF2EL函数与Tomcat6.0.x和EL2.2,jsf-2,tomcat6,facelets,el,Jsf 2,Tomcat6,Facelets,El,我的JSF 2.0应用程序有几个重要部分: functions.taglib.xml: web.xml: 当我禁用EL 2.2集成时,一切正常。这是否意味着EL 2.2不能与自定义EL函数一起工作?看这里 xmlns:func="http://marius/components" ... rendered="#{cc.attrs.rendered and !cl:empty(cc.attrs.dataModel)}" 您在XML namespace func上声明了它,但在cl:names

我的JSF 2.0应用程序有几个重要部分:

functions.taglib.xml:

web.xml:

当我禁用EL 2.2集成时,一切正常。这是否意味着EL 2.2不能与自定义EL函数一起工作?

看这里

xmlns:func="http://marius/components"

...

rendered="#{cc.attrs.rendered and !cl:empty(cc.attrs.dataModel)}"
您在XML namespace func上声明了它,但在cl:namespace上调用了它。将XML命名空间重命名为cl,或将cl:前缀更改为func:

与具体问题无关,还有几个其他问题:

您声明了一个Facelets 1.x标记库。既然您已经使用了JSF/Facelets 2.x,那么您应该更喜欢Facelets 2.x taglib声明

为了向后兼容,您使用了Facelets 1.x特定的上下文参数Facelets.LIBRARIES,该参数仅存在于JSF/Facelets 2.x中。但它迟早会被移除。您应该改用java.faces.FACELETS\u库

为什么不使用EL标准的空关键字呢

empty关键字将检查它是否为null,以及它是否是数组或集合,以及它的长度/大小是否为0

如果您只想检查null,您也可以这样做

rendered="#{cc.attrs.rendered and cc.attrs.dataModel != null}">
另见:
我想我找到了错误的原因。似乎抛出了错误,因为我的函数名为空。可能是一个保留关键字。重命名功能后一切正常。

感谢您的回复。我修复了XML名称空间前缀和您提到的第1和第2个问题。但这没有帮助,我仍然收到相同的错误。我以函数empty为例。真正的函数将更加复杂。显然,它与Tomcat自己的EL2.1相冲突。我从来没有用过Maven,也没有在Tomcat上用过GF EL。我不知道Maven在做什么,但如果Tomcat在El2.2 impl存在时加载自己的El2.1 API,它就会崩溃。如果您的唯一目的是能够在EL中传递方法参数,那么我建议改用JBoss EL。那么你就不需要EL2.2API了。Tomcat提供的默认EL 2.1就足够了。摆脱EL 2.2依赖项,将组org.jboss.EL、工件jboss EL version 2.0.0添加到pom中,最后将上下文参数值编辑为org.jboss.EL.ExpressionFactoryImpl.请注意,它有两个上下文参数,一个用于Mojarra JSF impl,另一个用于MyFaces JSF impl。其中一个是多余的。它是一个保留关键字,用于集合类型和字符串。
<context-param>
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name>
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value>
</context-param>
<context-param>
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value>
</context-param>

<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>/META-INF/functions.taglib.xml</param-value>
</context-param>
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>el-api</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>el-impl</artifactId>
    <version>2.2</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:t="http://myfaces.apache.org/tomahawk"
    xmlns:func="http://marius/components"
    xmlns:composite="http://java.sun.com/jsf/composite">

<composite:interface>
    <composite:attribute name="rendered" default="#{true}" />
</composite:interface>

<composite:implementation>

    <t:dataScroller id="#{cc.attrs.tableId}Scroller"
            for="#{cc.attrs.tableId}"
            rendered="#{cc.attrs.rendered and !func:empty(cc.attrs.dataModel)}">
    ....
javax.el.ELException: Error Parsing: #{cc.attrs.rendered and !cl:empty(cc.attrs.dataModel)}
    com.sun.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:171)
    com.sun.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:188)


com.sun.el.parser.ParseException: Encountered ":" at line 1, column 28.
Was expecting one of:
    "}" ...
    "." ...
    "[" ...
xmlns:func="http://marius/components"

...

rendered="#{cc.attrs.rendered and !cl:empty(cc.attrs.dataModel)}"
rendered="#{cc.attrs.rendered and not empty cc.attrs.dataModel}">
rendered="#{cc.attrs.rendered and cc.attrs.dataModel != null}">