我将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>
有什么建议吗?
答案 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转换为