首页
学习
活动
专区
圈层
工具
发布

JSTL函数
EN

Stack Overflow用户
提问于 2016-06-04 17:26:20
回答 1查看 1.6K关注 0票数 2

我使用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文件夹中。但我不能用它的功能。

当我加载这个面片时:

代码语言:javascript
复制
<?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>

我知道这个错误:

代码语言:javascript
复制
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依赖性:

代码语言:javascript
复制
<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>

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 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转换为

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37633076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档