我在项目中使用了以下内容: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(如解释在这里),但没有效果。
我仅限于上面列出的一组技术,因此我无法添加任何内容,例如,不能更改我的应用服务器的版本。
在所有这些条件下,是否可以解决我的问题?
org.apache.jasper.JasperException
这表明环境不支持调用带参数的bean方法的新EL 2.2功能。过时的环境正试图将表达式解释为具有符号的EL函数namespace:functionName()(例如JSTL函数)。唯一的例外是抱怨namespace:找不到零件以识别EL功能。毕竟这是错误的。
namespace:functionName()
你需要确保满足以下条件才能使用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)。
/WEB-INF/web.xml
<?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的出色表现。
/WEB-INF/lib
el-api.jar
el-impl.jar
Tomcat 6.x
你的具体问题是由使用非Servlet 3.0兼容的容器引起的:旧的Glassfish2.x。
升级到Glassfish 3.x或寻找其他方法。JBoss EL方法仅适用于JSF,不适用于Spring或“普通JSP”。