org.apache.jasper.JasperException:未指定默认命名空间时,函数测试必须使用前缀
Posted
技术标签:
【中文标题】org.apache.jasper.JasperException:未指定默认命名空间时,函数测试必须使用前缀【英文标题】:org.apache.jasper.JasperException: The function test must be used with a prefix when a default namespace is not specified 【发布时间】:2012-10-12 14:41:23 【问题描述】:我正在为我的项目使用以下内容: 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 中(如 here 所述),但没有任何效果。
我仅限于上面列出的一组技术,所以我不能添加任何东西,或者,例如,不能更改我的应用服务器的版本。
在所有这些条件下,我的问题是否有解决方案?
【问题讨论】:
testBean
在您的 EL 中分配到哪里?该错误消息表明 EL 将 test()
解释为一个函数,该函数需要一个命名空间,例如使用 JSTL 函数 fn:replace()
。
由 Spring 自动完成。正如here 所解释的那样。如果我创建一些getter方法(例如getTest())并以相同的方式调用它(但没有参数)(例如:$ testBean.test) - 一切正常。所以我认为问题出在参数化调用上。
【参考方案1】:
org.apache.jasper.JasperException: 当没有指定默认命名空间时,函数测试必须使用前缀
这表明环境不支持使用参数调用 bean 方法的新 EL 2.2 特性。过时的环境试图将表达式解释为具有符号 namespace:functionName()
的 EL 函数(如 JSTL 函数)。例外只是抱怨找不到namespace:
部分以识别EL 功能。但毕竟这是错误的。
您需要确保满足以下条件才能在 EL 中调用带参数的 bean 方法:
目标容器必须支持 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。
/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 的魅力。
webapp 的 /WEB-INF/lib
确实不包含源自较旧 make/version 的容器的特定于容器的 EL 实现库,例如源自 el-api.jar
和/或 el-impl.jar
从 Tomcat 6.x 左右开始。
您的具体问题是由使用不兼容 Servlet 3.0 的容器引起的:旧的 Glassfish 2.x。
升级到Glassfish 3.x 或寻找其他方式。 JBoss EL 方法仅适用于 JSF,不适用于 Spring 或“plain JSP”。
【讨论】:
我认为问题出在 Glassfish 2.1 (如@BalusC 所述)。我记得在让 EL 2.2 与 Glassfish 2.1 一起工作时遇到了很多麻烦,但从未取得任何成功。 感谢大家的帮助(尤其是 BalusC)。所以现在,就我而言,决定是避免参数化调用,因为我的环境配置不允许我这样做。将来我需要使用 JSF 或升级\更改我的应用服务器。【参考方案2】:如果您使用的是 el 2.2 和 servlet 3.0,请使用 tomcat 7 我们遇到了同样的问题并用上面的版本修复了
【讨论】:
【参考方案3】:因为我必须在 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;
【讨论】:
以上是关于org.apache.jasper.JasperException:未指定默认命名空间时,函数测试必须使用前缀的主要内容,如果未能解决你的问题,请参考以下文章