Jsf 2 JSF2EL函数与Tomcat6.0.x和EL2.2
我的JSF 2.0应用程序有几个重要部分: functions.taglib.xml: web.xml: 当我禁用EL 2.2集成时,一切正常。这是否意味着EL 2.2不能与自定义EL函数一起工作?看这里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
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}">