JSF JSTL函数

时间:2016-06-04 17:26:21

标签: jstl jsf-2.2

我将JSF Mojarra 2.2.9与JSP标准标记库(JSTL)1.2.1结合使用。 我在WEB-INF的libs文件夹中导入了文件javax.faces-2.2.9.jar和javax.servlet.jsp.jstl-api-1.2.1.jar。 但我无法使用它的功能。

当我加载此facelet时:

<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:composite="http://xmlns.jcp.org/jsf/composite"
                xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:jsf="http://xmlns.jcp.org/jsf"
                xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui"
                xmlns:pt="http://xmlns.jcp.org/jsf/passthrough" xmlns:fn="http://java.sun.com/jsp/jstl/functions"
                xmlns:c="http://java.sun.com/jsp/jstl/core">
...
<composite:implementation>
Name: #{fn:replace(cc.clientId, '-', '')}
</composite:implementation>
</ui:composition>

我收到此错误:

Caused by: javax.el.ELException: Function 'fn:replace' not found
    at org.apache.el.lang.ExpressionBuilder.visit(ExpressionBuilder.java:209)
    at org.apache.el.parser.SimpleNode.accept(SimpleNode.java:142)
    at org.apache.el.lang.ExpressionBuilder.prepare(ExpressionBuilder.java:151)
    at org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:169)
    at org.apache.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:232)
    at org.apache.el.ExpressionFactoryImpl.createValueExpression(ExpressionFactoryImpl.java:67)
    at com.sun.faces.facelets.el.ELText.parse(Unknown Source)
    at com.sun.faces.facelets.el.ELText.parse(Unknown Source)
    at com.sun.faces.facelets.compiler.TextUnit.flushTextBuffer(Unknown Source)
    at com.sun.faces.facelets.compiler.TextUnit.addInstruction(Unknown Source)
    at com.sun.faces.facelets.compiler.TextUnit.endTag(Unknown Source)
    at com.sun.faces.facelets.compiler.CompilationManager.popTag(Unknown Source)
    at com.sun.faces.facelets.compiler.SAXCompiler$CompilationHandler.endElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1783)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2970)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:118)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327)
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:195)
    at com.sun.faces.facelets.compiler.SAXCompiler.doCompile(Unknown Source)
    at com.sun.faces.facelets.compiler.SAXCompiler.doCompile(Unknown Source)
    at com.sun.faces.facelets.compiler.Compiler.compile(Unknown Source)
    at com.sun.faces.facelets.impl.DefaultFaceletFactory.createFacelet(Unknown Source)
    at com.sun.faces.facelets.impl.DefaultFaceletFactory.access$100(Unknown Source)
    at com.sun.faces.facelets.impl.DefaultFaceletFactory$1.newInstance(Unknown Source)
    at com.sun.faces.facelets.impl.DefaultFaceletFactory$1.newInstance(Unknown Source)
    at com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(Unknown Source)
    at com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(Unknown Source)
    at com.sun.faces.util.ExpiringConcurrentCache$1.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at com.sun.faces.util.ExpiringConcurrentCache.get(Unknown Source)
    at com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(Unknown Source)
    at com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(Unknown Source)
    at com.sun.faces.facelets.impl.DefaultFaceletFactory.getFacelet(Unknown Source)
    ... 107 more

My Maven依赖项:

<properties>
    <!-- Apache Tomcat -->
    <tomcat.version>8.0.22</tomcat.version>

    <!-- JSF -->
    <!-- JSF Mojarra -->
    <jsf.version>2.2.9</jsf.version>
    <!-- JSP Standard Tag Library (JSTL) -->
    <jstl.version>1.2.1</jstl.version>
    <!-- Expression Language API -->
    <el.api.version>2.2</el.api.version>
    <!-- PrimeFaces -->
    <primefaces.version>5.3</primefaces.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet-api</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.faces</artifactId>
        <version>${jsf.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp.jstl</groupId>
        <artifactId>javax.servlet.jsp.jstl-api</artifactId>
        <version>${jstl.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>el-api</artifactId>
        <version>${el.api.version}</version>
    </dependency>
    <dependency>
        <groupId>org.primefaces</groupId>
        <artifactId>primefaces</artifactId>
        <version>${primefaces.version}</version>
    </dependency>
</dependencies>

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

JSF 2.2中有两个JSTL函数错误。

一个错误,就是你所拥有的。而JSF现在或将来都无法修复。所以现在这是一个功能。

第二个是我正在使用的那个,为此创建了以下示例应用程序: https://github.com/99sono/jsf-2-2-fn-replace-not-found-bug/blob/master/README.md

如果您的错误,可以在以下位置找到解释: https://java.net/jira/browse/JAVASERVERFACES-3469

您遇到的问题是,根据对glassfish的评论,jira,您不能使用INLINE fn:替换复合组件中的函数,这些函数非常复杂。

请尝试通过将fn:replace函数封装在“value”attirbute中来解决您的问题。

我引用曼弗雷德里姆:

  

虽然我知道内联EL已经很方便了   已经发现它在复合材料部件方面存在问题。   使用复合组件时,请将#{xx}替换为    一切都会像你期望的那样奏效。   SAXCompiler问题的一个小背景(内部   转换标记的Facelets类不会将内联EL转换为