13

我在我的项目中使用以下内容: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:未指定默认命名空间时,函数测试必须使用前缀

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

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

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

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

4

3 回答 3

18

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

这表明环境不支持使用参数调用 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>
    

    否则,您的容器将以与web.xml根声明中匹配的版本匹配的回退方式运行,从而失去所有新的 Servlet 3.0 和 EL 2.2 的魅力。

  3. webapp/WEB-INF/lib不包含特定于容器的 EL 实现库这些实现库源自较旧的 make/version 的容器,例如el-api.jar和/或el-impl.jar源自 Tomcat 6.x 左右。

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

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

于 2012-10-22T21:24:04.360 回答
1

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

于 2014-08-12T12:43:29.903 回答
1

因为我必须在 Servlet 2.5 上工作,所以我做了这个 hack:

JSP:

${testBean.test["hello"]}

豆:

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;
}
于 2016-02-27T01:15:06.920 回答