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

时间:2012-10-22 18:20: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);
    }
}

我有一个jsp页面:

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

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

  

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

如果我在没有传递参数的情况下调用某个方法 - 一切正常。

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

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

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

3 个答案:

答案 0 :(得分:17)

  

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

这表明环境不支持使用参数调用bean方法的新EL 2.2功能。过时的环境试图将表达式解释为具有符号namespace:functionName()的EL函数(就像JSTL函数一样)。唯一的例外是抱怨为了识别EL功能而无法找到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. /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>
    

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

  3. webapp的/WEB-INF/lib 包含来自旧品牌/版本容器的特定于容器的EL实施库,例如el-api.jar和/或el-impl.jar来自Tomcat 6.x左右。

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

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

答案 1 :(得分:1)

如果您使用的是el 2.2和servlet 3.0,请使用tomcat 7 我们遇到了同样的情况,并修复了以上版本

答案 2 :(得分:0)

因为我必须使用Servlet 2.5,所以我做了这个黑客:

JSP:

private Map test;

public Map getTest() {
    if (test == null) {
        test = new Map() {
            @Override
            public Object get(Object key) {
                System.out.println("param = " + key);
                return null;
            }

            @Override
            public int size() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public boolean isEmpty() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public boolean containsKey(Object key) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public boolean containsValue(Object value) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Object put(Object key, Object value) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Object remove(Object key) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public void putAll(Map m) {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public void clear() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Set keySet() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Collection values() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            @Override
            public Set entrySet() {
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

        };
    }
    return test;
}

豆:

def print_a_triangle(n):
    print("*" * (n+3))
    for i in range(n):
        print("{}{}{}".format("*", str(" ").rjust(n-i), "*"))

    print("*")

print_a_triangle(6)

*********
*      *
*     *
*    *
*   *
*  *
* *
*