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

kum*_*ade 12 java spring jsp parameter-passing

我正在为我的项目使用以下内容:Spring 3.0.1 + Apache Tiles 2.2.1 + Glassfish 2.1.我想要做的是在jsp页面中调用一些方法并将一些参数传递给它.例如,我有一个bean:

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

我有一个jsp页面:

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

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

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

如果我调用一些方法而不传递参数 - 一切都OK.

我试图把的jboss-el.jar在我的WEB-INF/lib目录,并把所需的参数在web.xml(如解释在这里),但没有效果.

我仅限于上面列出的一组技术,因此我无法添加任何内容,或者,例如,无法更改我的app-server版本.

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

Bal*_*usC 17

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

这表明环境不支持使用参数调用bean方法的新EL 2.2功能.过时的环境试图将表达式解释为具有符号的EL函数namespace:functionName()(如JSTL函数).唯一的例外是抱怨namespace:无法找到部分以识别EL功能.毕竟,这是错误的.

您需要确保满足以下条件才能在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. /WEB-INF/web.xml文件声明符合Servlet 3.0规范(因此不是较旧的,如2.5).

    <?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>
    
    Run Code Online (Sandbox Code Playgroud)

    否则,您的容器将以与web.xml根声明中匹配的版本匹配的后备模式运行,从而失去所有新的Servlet 3.0和EL 2.2非常棒.

  3. web应用程序的/WEB-INF/lib不会含有来自一个老品牌/版,如容器发起特定容器-EL实现库el-api.jar和/或el-impl.jar从Tomcat 6.x或使原.

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

升级到Glassfish 3.x或寻找替代方法.JBoss EL方法仅适用于JSF,不适用于Spring,也不适用于"普通JSP".