【问题标题】:EL function not found errorEL 函数未找到错误
【发布时间】:2012-04-30 21:48:36
【问题描述】:

我正在尝试使用带有 jsfbean 参数的自定义 EL 函数调用方法。

<c:set var="test1" value="${cx:methodName('para')}" scope="session"/>
        <h:outputText value="#{test1}"/>

我做了以下 id TLD 并将其放入 WEB-INF

  <?xml version="1.0" encoding="UTF-8" ?>
    <taglib 
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">

        <tlib-version>1.0</tlib-version>
        <short-name>Custom_Functions</short-name>
        <uri>http://example.com/functions</uri>

        <function>
            <name>methodName</name>
            <function-class>funcionclass(Jsfbean)</function-class>
            <function-signature>java.lang.String methodName(java.lang.String)</function-signature>
        </function>
    </taglib>

我也在web.xml中配置

<jsp-config> 
        <taglib> 
               <taglib-uri>http://example.com/functions</taglib-uri> 
               <taglib-location>/WEB-INF/functions.tld</taglib-location> 
        </taglib> 
</jsp-config>

仍然出现 Function not found 错误。

下面是方法代码

public static String methodName(String s1) throws Exception
    {
        return "Kshitij";
    }

任何人都可以帮忙。

【问题讨论】:

  • 您使用的是 JSP 还是 Facelets?您已经创建了一个 JSP EL 函数,但是您的 JSF 2.0 标记表明您实际上可能正在使用 Facelets。此外,您的目标是哪个 servlet 容器? Servlet 3.0 兼容吗? web.xml 声明是否符合 Servlet 3.0?
  • 是的。我正在使用facelets。这是我的 web.xmljava.sun.com/xml/ns/j2ee" xmlns:xsi="w3.org/2001/XMLSchema-instance" xsi:schemaLocation="java.sun.com/xml/ns/j2ee java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
  • 嗯?您是否在 Servlet 2.4 容器上运行 JSF 2.0?如果没有黑客,这将永远无法工作。您的服务器品牌/版本到底是什么?
  • 这是一个 Servlet 2.5 兼容的容器。您应该将 web.xml 设置为 Servlet 2.5。
  • 我遇到了错误。就像在这一行找到的多个注释:-cvc-enumeration-valid:值'2.5'对于枚举'[2.4]'不是构面有效的。它必须是来自枚举的值。

标签: java jsf-2 el


【解决方案1】:

您在使用 Facelets 时创建了一个 JSP EL 函数。这是行不通的。此外,您的 &lt;function-class&gt; 声明不正确。它应该指定全限定类名 (FQN)。例如。 com.example.FunctionClass.

将 taglib 文件重命名为 /WEB-INF/functions.taglib.xml,更新内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0">
    <namespace>http://example.com/functions</namespace>

    <function>
        <function-name>methodName</function-name>
        <function-class>com.example.FunctionClass</function-class>
        <function-signature>java.lang.String methodName(java.lang.String)</function-signature>
    </function>
</facelet-taglib>

那你需要在web.xml注册如下(别忘了去掉旧的JSP taglib注册!):

<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/functions.taglib.xml</param-value>
</context-param>

最后通过下面的 XML 命名空间在你的视图中声明它

xmlns:cx="http://example.com/functions"

与具体问题无关,有一种替代方法,可能更简单:install JBoss EL。这样,您将能够像在新的 EL 2.2 中一样调用 bean 上的方法。

【讨论】:

  • 我认为我在 web.xml 上犯了错误
【解决方案2】:

你仍然需要在你的jsp中包含引用:

<%@taglib prefix="cx" uri="http://example.com/functions"%>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 2017-08-07
  • 1970-01-01
  • 2015-02-15
相关资源
最近更新 更多