在使用jetty插件(6.1.9)调试过程中,发现访问一个带有#{…}表达式的页面(页面用到了模板表达式)时,抛出如下异常:
-
org.apache.jasper.JasperException: /WEB-INF/jsps/projectmt/formProjectLaunching.jsp(677
,22
) PWC6228: #{...} not allowed in a template text body.
-
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:62
)
-
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:357
)
-
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:169
)
-
at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:731
)
-
at org.apache.jasper.compiler.Node$ELExpression.accept(Node.java:929
)
-
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2257
)
-
at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2307
)
-
...
而将项目打包并部署到tomcat(5.5)中运行时,并没有发现该异常。
根据以上的异常信息,经过一番网络搜索,发现原来是JSP2.1规范对#{…}的兼容性问题:
引用
Prior to JSP 2.1, the #{} syntax was not reserved. Therefore, there might exist JSP pages based on earlier versions of JSP technology that use the #{ characters where they are not allowed, according to the JSP 2.1 specification. These pages, when used in a JSP 2.1 application, will generate a translation error.
其实,
1. 在JSP2.1以前,JSP编译器并不解析#{}表达式(不是保留的表达式),因为在之前的JSP中,EL表达式是${}来表示的;
2. 正因为#{}不是JSP保留的表达式,所以在JSF中,EL表达式采用了#{}表示的;
3. 同时,在Struts2中,OGNL(Object-Graph Navigation Language,一种功能强大的表达式语言)也是用#{}表示的;
4. 而在JSP2.1规范中,SUN为了统一JSP与JSF的EL表达式语法,将#{}作为了保留的表达式(SUN号称在纯jsp中也能够直接引用JSF的managedBean),也就是说,采用JSP2.1规范的服务器会自动编译#{}表达式;
5. jetty6和tomcat6采用的JSP2.1规范,而jetty5和tomcat5采用的是JSP2.0规范。
OK,问题似乎明朗了,使用jetty5和tomcat5就不会出现这个jsp编译错误。那么,如果我们需要使用jetty6或者tomcat6呢?
在采用JSP2.1规范的服务器(如jetty6和tomcat6)中,我们有两种方案来解决这个EL表达式的兼容问题:
方案一:在web项目的web.xml中增加如下配置:
-
<jsp-property-group>
-
<url-pattern>*.jsp</url-pattern>
-
<deferred-syntax-allowed-as-literal>true
</deferred-syntax-allowed-as-literal>
-
</jsp-property-group>
这需要使用servlet2.5规范,所以同时必须将web-app节点配置修改为:
-
<web-app id="KSOA3"
version="2.5"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"
>
方案二:在使用了#{}表达式的jsp文件中,在@page中增加deferredSyntaxAllowedAsLiteral="true":
-
<%@ page contentType="text/html; charset=UTF-8"
deferredSyntaxAllowedAsLiteral="true"
%>
方案三:在使用了#{}表达式的jsp文件中,
step1.在页面定义字符串变量;
step2.把需要#的位置用刚才定义的变量替换;
由于方案一只需要修改一处配置,维护成本较低,所以推荐使用方案一。
使用了以上解决方案后,在采用JSP2.1规范的服务器中,一切运行正常。但由于采用JSP2.0规范的服务器(如tomcat5或jetty5)不能识别以上的这些配置信息,所以,如果在采用JSP2.0规范的服务器中也使用了这些配置,结果会很严重:
1. JSP页面中的${}表达式不会被编译
2. 使用了#{}表达式的jsp页面渲染不成功
到目前为止,还没有既适合JSP2.1,又能兼容JSP2.0的配置,所以只能根据服务器采用的JSP规范版本来进行相应的配置。
参考: http://today.java.net/pub/a/today/2006/03/07/unified-jsp-jsf-expression-language.html#backwards-compatibility
分享到:
相关推荐
8. **JSP 2.1版本特性**:该版本引入了AJAX支持,增强了EL,提供了对JSF(JavaServer Faces)的更好集成,以及对Servlet 2.5的兼容性。 9. **使用场景**:JSP常用于构建动态Web应用,如用户登录、数据展示、表单...
3. **自定义标签库简化**:JSP 2.1允许开发者使用XML语法定义自定义标签,这使得标签的定义和使用更直观,且与现有的XML工具兼容性更强。 4. **分离的编译模型**:JSP页面现在会被编译为独立的Servlet类,使得调试...
通过理解`web.xml`的配置以及Servlet和JSP版本之间的差异,可以有效地解决EL表达式无法解析的问题。务必确保你的项目配置与所使用的Servlet容器兼容,以充分利用EL的强大功能。同时,检查并更新`web.xml`文件以匹配...
然而,有时在JSP页面中使用EL表达式时,可能会遇到$符号不起作用的问题,就像描述中提到的那样。 问题的根本原因在于Servlet和JSP规范的版本不匹配。Servlet和JSP规范是由Java Community Process (JCP)制定的,每个...
2. **JSP 2.1**:JSP 2.1规范带来了许多增强,例如引入了自定义标签库(Tag Libraries)的简化表示法,支持EL表达式直接在JSP页面中使用,增强了脚本元素的功能,以及提供了更多的错误处理和调试工具。 3. **Java ...
这使得JSP具有广泛的兼容性,据Sun称,JSP可以运行在市场中85%的服务器产品上,包括Apache WebServer和IIS4.0。 1.3 JSP与数据库的交互 JSP与数据库的结合是Web应用开发中的常见需求。开发者通常使用JDBC(Java ...
- **测试应用**:启动新版本的Tomcat并测试所有应用,解决可能出现的兼容性问题。 总结,从Tomcat 6.0升级到7.0涉及到的主要变化是Servlet和JSP规范的更新,带来了更强大的功能和更好的性能。同时,升级过程中需要...
2. **JSP 2.1支持**:支持JSP 2.1规范,提供了更多表达式语言(EL)的功能,增强了标签库(Tag Libraries)的使用,并引入了自定义标签的改进。 3. **更好的性能**:Tomcat 6.0.2通过优化内存管理、线程池和连接器...
3. **调整服务器配置**:如果需要在特定环境中使用特定版本的API,可以考虑在Tomcat的lib目录下覆盖服务器默认的jar文件,但这可能会引起其他应用的兼容性问题,因此不推荐这样做。 4. **升级或降级Tomcat**:如果...
升级Tomcat版本时,需要注意兼容性和迁移问题。由于新版本可能会移除或修改旧API,因此在升级前需要评估现有应用的依赖。对于使用注解配置的应用,迁移相对简单;而对于依赖于web.xml配置的应用,可能需要手动更新...
Struts2 EL 表达式与 OGNL 的兼容性问题 **异常描述**: Struts2 2.1 版本的标签不允许在其属性中评估 Java Server Pages (JSP) EL 表达式,而是将其作为 Object Graph Navigation Language (OGNL) 来评估。这种...
通过对上述问题的分析和解决,我们不仅了解了Maven打包过程中依赖管理的重要性,还掌握了如何处理与Tomcat服务器配置相关的常见问题。这些问题的解决通常需要对Maven、Tomcat以及JSP有深入的理解,同时也需要一定的...
2. **JSP 2.1支持**:此版本支持JSP 2.1规范,允许开发者使用更简洁的语法、自定义标签库和EL表达式。 3. **线程池**:Tomcat 6.0引入了线程池管理,提高了并发处理能力,能更好地应对高流量网站的需求。 4. **更...
2. **JSP 2.1规范**:此版本支持JSP 2.1,增强了EL(Expression Language)表达式,以及标签库的使用,使得开发者能够更方便地创建动态内容。 3. **连接器(Connector)**:Tomcat中的连接器负责接收和响应HTTP请求...
2. **JSP 2.1支持**:它支持JSP 2.1规范,增强了模板语言的功能,提供了表达式语言(EL)和标签库(JSTL)支持。 3. **部署与管理**:Tomcat 6.0.43提供了管理工具,如Manager App和Host Manager,用于部署、启动、...
Tomcat 6.0.26支持JSP 2.1规范,提供对JSP页面、自定义标签库(JSTL)、EL表达式语言等的支持。 3. **连接器和线程管理**:Tomcat使用Coyote连接器处理网络通信,支持多种协议如HTTP、AJP(Apache JServ Protocol)...
3. **JSP 2.1规范**:Tomcat 6.0.20支持JSP 2.1标准,提供了更丰富的内置动作、标签库支持以及EL(Expression Language)表达式,简化了视图层的开发。 4. **性能优化**:Tomcat 6.0.20在性能方面进行了优化,包括...
2. **JSP 2.1支持**:该版本支持JSP 2.1标准,提供了更丰富的EL表达式语言和自定义标签库,提高了开发效率。 3. **性能优化**:通过对内存管理、线程池和请求处理机制的优化,6.0.14在处理高并发请求时表现出更优的...
- 兼容性提升:支持Java SE 6,并对Java EE 5规范进行了更好的兼容。 - 错误修复:解决了前一版本中的一些已知问题,提高了系统的稳定性。 安装和配置Apache Tomcat 6.0.30通常涉及以下步骤: 1. 下载并解压`...