`
boss5518831534
  • 浏览: 230631 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

解决JSP2.1规范对EL表达式的兼容性问题

阅读更多

在使用jetty插件(6.1.9)调试过程中,发现访问一个带有#{…}表达式的页面(页面用到了模板表达式)时,抛出如下异常: 

Java代码   收藏代码
  1. org.apache.jasper.JasperException: /WEB-INF/jsps/projectmt/formProjectLaunching.jsp(677 ,22 ) PWC6228: #{...} not allowed in a template text body.  
  2.     at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:62 )  
  3.     at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:357 )  
  4.     at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:169 )  
  5.     at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:731 )  
  6.     at org.apache.jasper.compiler.Node$ELExpression.accept(Node.java:929 )  
  7.     at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2257 )  
  8.     at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2307 )  
  9.     ...  


而将项目打包并部署到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中增加如下配置: 

Java代码   收藏代码
  1. <jsp-property-group>  
  2.     <url-pattern>*.jsp</url-pattern>  
  3.     <deferred-syntax-allowed-as-literal>true </deferred-syntax-allowed-as-literal>  
  4. </jsp-property-group>  


这需要使用servlet2.5规范,所以同时必须将web-app节点配置修改为: 

Java代码   收藏代码
  1. <web-app id="KSOA3"  version="2.5"  xmlns="http://java.sun.com/xml/ns/j2ee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  2.     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": 

Java代码   收藏代码
  1. <%@ page contentType="text/html; charset=UTF-8"  deferredSyntaxAllowedAsLiteral="true" %>  

 

 

方案三:在使用了#{}表达式的jsp文件中, 

 

step1.在页面定义字符串变量;
step2.把需要#的位置用刚才定义的变量替换;

 <%  
 String a   
=     "  #  "   ;  
 
%>  

 

由于方案一只需要修改一处配置,维护成本较低,所以推荐使用方案一。 

使用了以上解决方案后,在采用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

分享到:
评论

相关推荐

    jsp-api-2.1.jar

    8. **JSP 2.1版本特性**:该版本引入了AJAX支持,增强了EL,提供了对JSF(JavaServer Faces)的更好集成,以及对Servlet 2.5的兼容性。 9. **使用场景**:JSP常用于构建动态Web应用,如用户登录、数据展示、表单...

    jsp-2_1-fr-spec-docs

    3. **自定义标签库简化**:JSP 2.1允许开发者使用XML语法定义自定义标签,这使得标签的定义和使用更直观,且与现有的XML工具兼容性更强。 4. **分离的编译模型**:JSP页面现在会被编译为独立的Servlet类,使得调试...

    解决jsp开发中不支持EL问题

    通过理解`web.xml`的配置以及Servlet和JSP版本之间的差异,可以有效地解决EL表达式无法解析的问题。务必确保你的项目配置与所使用的Servlet容器兼容,以充分利用EL的强大功能。同时,检查并更新`web.xml`文件以匹配...

    jsp页面中表达式语言中的$符号不起作用的解决方法

    然而,有时在JSP页面中使用EL表达式时,可能会遇到$符号不起作用的问题,就像描述中提到的那样。 问题的根本原因在于Servlet和JSP规范的版本不匹配。Servlet和JSP规范是由Java Community Process (JCP)制定的,每个...

    tomcat 6.0 版本

    2. **JSP 2.1**:JSP 2.1规范带来了许多增强,例如引入了自定义标签库(Tag Libraries)的简化表示法,支持EL表达式直接在JSP页面中使用,增强了脚本元素的功能,以及提供了更多的错误处理和调试工具。 3. **Java ...

    jsp的技术发展历史外文翻译论文-毕业论文.doc

    这使得JSP具有广泛的兼容性,据Sun称,JSP可以运行在市场中85%的服务器产品上,包括Apache WebServer和IIS4.0。 1.3 JSP与数据库的交互 JSP与数据库的结合是Web应用开发中的常见需求。开发者通常使用JDBC(Java ...

    tomcat 6.0 和 7.0

    - **测试应用**:启动新版本的Tomcat并测试所有应用,解决可能出现的兼容性问题。 总结,从Tomcat 6.0升级到7.0涉及到的主要变化是Servlet和JSP规范的更新,带来了更强大的功能和更好的性能。同时,升级过程中需要...

    tomcat6.05

    2. **JSP 2.1支持**:支持JSP 2.1规范,提供了更多表达式语言(EL)的功能,增强了标签库(Tag Libraries)的使用,并引入了自定义标签的改进。 3. **更好的性能**:Tomcat 6.0.2通过优化内存管理、线程池和连接器...

    apache-tomcat-5.5.26

    3. **调整服务器配置**:如果需要在特定环境中使用特定版本的API,可以考虑在Tomcat的lib目录下覆盖服务器默认的jar文件,但这可能会引起其他应用的兼容性问题,因此不推荐这样做。 4. **升级或降级Tomcat**:如果...

    Tomcat_6.0与7.0

    升级Tomcat版本时,需要注意兼容性和迁移问题。由于新版本可能会移除或修改旧API,因此在升级前需要评估现有应用的依赖。对于使用注解配置的应用,迁移相对简单;而对于依赖于web.xml配置的应用,可能需要手动更新...

    Struts2运行经常遇见的异常描述

    Struts2 EL 表达式与 OGNL 的兼容性问题 **异常描述**: Struts2 2.1 版本的标签不允许在其属性中评估 Java Server Pages (JSP) EL 表达式,而是将其作为 Object Graph Navigation Language (OGNL) 来评估。这种...

    maven 打包 部署到tomcat 删除的jar包

    通过对上述问题的分析和解决,我们不仅了解了Maven打包过程中依赖管理的重要性,还掌握了如何处理与Tomcat服务器配置相关的常见问题。这些问题的解决通常需要对Maven、Tomcat以及JSP有深入的理解,同时也需要一定的...

    apache-tomcat-6.0.20 eclipse

    2. **JSP 2.1支持**:此版本支持JSP 2.1规范,允许开发者使用更简洁的语法、自定义标签库和EL表达式。 3. **线程池**:Tomcat 6.0引入了线程池管理,提高了并发处理能力,能更好地应对高流量网站的需求。 4. **更...

    apache-tomcat-6.0.36

    2. **JSP 2.1规范**:此版本支持JSP 2.1,增强了EL(Expression Language)表达式,以及标签库的使用,使得开发者能够更方便地创建动态内容。 3. **连接器(Connector)**:Tomcat中的连接器负责接收和响应HTTP请求...

    apache-tomcat-6.0.43

    2. **JSP 2.1支持**:它支持JSP 2.1规范,增强了模板语言的功能,提供了表达式语言(EL)和标签库(JSTL)支持。 3. **部署与管理**:Tomcat 6.0.43提供了管理工具,如Manager App和Host Manager,用于部署、启动、...

    tomcat 6.0.26

    Tomcat 6.0.26支持JSP 2.1规范,提供对JSP页面、自定义标签库(JSTL)、EL表达式语言等的支持。 3. **连接器和线程管理**:Tomcat使用Coyote连接器处理网络通信,支持多种协议如HTTP、AJP(Apache JServ Protocol)...

    apache-tomcat-6.0.20

    3. **JSP 2.1规范**:Tomcat 6.0.20支持JSP 2.1标准,提供了更丰富的内置动作、标签库支持以及EL(Expression Language)表达式,简化了视图层的开发。 4. **性能优化**:Tomcat 6.0.20在性能方面进行了优化,包括...

    Tomcat6.0.14

    2. **JSP 2.1支持**:该版本支持JSP 2.1标准,提供了更丰富的EL表达式语言和自定义标签库,提高了开发效率。 3. **性能优化**:通过对内存管理、线程池和请求处理机制的优化,6.0.14在处理高并发请求时表现出更优的...

    tomcat 6.0

    - 兼容性提升:支持Java SE 6,并对Java EE 5规范进行了更好的兼容。 - 错误修复:解决了前一版本中的一些已知问题,提高了系统的稳定性。 安装和配置Apache Tomcat 6.0.30通常涉及以下步骤: 1. 下载并解压`...

Global site tag (gtag.js) - Google Analytics