我使用JSFmojarra2.2.9与JSP标准标记库(JSTL) 1.2.1相结合。这些文件javax.faces-2.2.9.jar和javax.servlet.jsp.jstl-api-1.2.1.jar我导入到了WEB的libs文件夹中。但我不能用它的功能。
当我加载这个面片时:
<?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我的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>有什么建议吗?
发布于 2017-01-21 18:31:46
JSF2.2中有两个带有JSTL函数的bug。
一只虫子,是你所拥有的。而且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的注释,您不允许在复合组件中使用内联fn:替换函数,因为复合组件非常复杂。
请尝试通过封装fn:替换函数来解决您的问题。
我引用曼弗雷德·里姆的话:
虽然我理解内联EL是一个很好的方便,正如您已经发现的那样,它在复合组件方面是有问题的。当您使用复合组件时,请用# {xx}替换,一切都将如您所期望的那样工作。关于这个问题的一些背景-- SAXCompiler (转换标记的内部Facelets类没有将内联EL转换为
https://stackoverflow.com/questions/37633076
复制相似问题