org.apache.jasper.JasperException:当未指定默认命名空间时,函数测试必须与前缀一起使用

2022-09-04 19:40:08

我在我的项目中使用了以下内容:Spring 3.0.1 + Apache Tiles 2.2.1 + Glassfish 2.1。我试图做的是在jsp页中调用一些方法,并向它传递一些参数。例如,我有一个豆子:

@Component
@Scope(value = "singleton")
public class TestBean {
    public void test(String param){
        System.out.println("param = " + param);
    }
}

我有一个jsp页面:

<%@page contentType="text/html; charset=utf-8"%>
${testBean.test("hello")}

这段代码给了我一个例外,比如:

org.apache.jasper.JasperException:当未指定默认命名空间时,函数测试必须与前缀一起使用

如果我调用某个方法而不向它传递参数 - 一切都很好。

我试图将jboss-el.jar放在我的WEB-INF / lib中,并将所需的参数放在web.xml中(如此所述),但没有效果。

我被限制在上面列出的一组技术,所以我不能添加任何东西,或者,例如,不能更改我的应用程序服务器的版本。

在所有这些条件下,我的问题有解决方案吗?


答案 1

org.apache.jasper.JasperException:当未指定默认命名空间时,函数测试必须与前缀一起使用

这表明环境不支持使用参数调用 Bean 方法的新 EL 2.2 功能。过时的环境试图将表达式解释为具有表示法的EL函数(如JSTL函数)。例外情况只是抱怨找不到零件以识别EL功能。但这毕竟是错误的。namespace:functionName()namespace:

您需要确保满足以下条件,以便能够调用 EL 中具有参数的 Bean 方法:

  1. 目标容器必须支持 EL 2.2。所有与Servlet 3.0兼容的容器都可以,因为EL 2.2是Java EE 6的一部分,而Java EE 6又涵盖了Servlet 3.0。Servlet 3.0 容器的例子是 Tomcat 7.x、Glassfish 3.x 和 JBoss AS 6.x/7.x。

  2. 该文件被声明符合 Servlet 3.0 规范(因此不会更早,例如 2.5)。/WEB-INF/web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app 
        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-app_3_0.xsd"
        version="3.0">
    
        <!-- Config here. -->
    
    </web-app>
    

    否则,您的容器将在与根声明中的版本匹配的回退模式中运行,从而失去所有新的Servlet 3.0和EL 2.2的出色功能。web.xml

  3. Webapp 不包含源自旧版本/版本的容器(如和/或源自 Tomcat 6.x 左右)的特定于容器的 EL 实现库。/WEB-INF/libel-api.jarel-impl.jar

您的具体问题是由使用非Servlet 3.0兼容容器引起的:旧的Glassfish 2.x。

升级到Glassfish 3.x或寻找其他方式。JBoss EL方法仅适用于JSF,不适用于Spring或“普通JSP”。


答案 2

如果您使用的是 el 2.2 和 servlet 3.0,请使用 tomcat 7 我们面对的是相同的情况,并修复了上述版本