Spring 3.0.1 Apache Tile 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: The function test must be used with
a prefix when a default namespace is not specified
我试图将jboss-el.jar放在我的WEB-INF / lib中,并将所需参数放在web.xml中(如here所述),但不起作用.
我只限于上面列出的一组技术,所以我无法添加任何东西,或者例如,不能更改我的应用服务器的版本.
有了这些条件,我的问题有解决方案吗?
解决方法
org.apache.jasper.JasperException: The function test must be used with a prefix when a default namespace is not specified
这表明环境不支持使用参数调用bean方法的新EL 2.2功能.过时的环境正在尝试将表达式解释为具有符号命名空间的EL函数:functionName()(如JSTL函数).例外只是抱怨命名空间:部分找不到以识别EL功能.但毕竟是错的.
您需要确保满足以下条件才能使用EL中的参数调用bean方法:
>目标容器必须支持EL 2.2.所有Servlet 3.0兼容的容器都可以做,因为EL 2.2是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不包含源自较早版本的容器的容器特定的EL实现库,例如源自Tomcat 6.x的el-api.jar和/或el-impl.jar或者.
您的具体问题是由使用非Servlet 3.0兼容的容器引起的:旧Glassfish 2.x.
升级到Glassfish 3.x或寻找替代方法. JBoss EL方法仅适用于JSF,而不适用于Spring或“plain JSP”.