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

我为我的项目使用以下东西: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中放入必要的参数(如下所述),但是没有任何效果。

我受限于上面列出的一组技术,所以我不能添加任何内容,例如,不能更改我的应用程序服务器的版本。

有了这些条件,有没有解决我的问题?

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

这表明环境不支持使用参数调用bean方法的新的EL 2.2特性。 过时的环境试图将expression式解释为具有符号namespace:functionName()的EL函数namespace:functionName() (如JSTL函数)。 唯一的例外是抱怨namespace:部分不能被find为了辨认ELfunction。 但毕竟是错的。

您需要确保满足以下条件才能够在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 awesomeness。

  3. /WEB-INF/lib应用程序的/WEB-INF/lib不包含源自较旧make /版本的容器的特定于容器的EL实现库,例如源自Tomcat 6.x的el-api.jar和/或el-impl.jar或所以。

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

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

如果您使用的是el 2.2和servlet 3.0,请使用tomcat 7。我们面对同样的问题,并修复了以上版本

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

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; }