在使用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
分享到:
相关推荐
Tomcat6.0实现了Servlet 2.5规范和JSP2.1规范,为了使用方便这里上传JSP2.1 API文档、Servlet2.5 规范、Servlet API文档、JSP2.1规范。
jspEL表达式 jspEL表达式 jspEL表达式 jspEL表达式
java中JSP和el表达式的隐含对象,能够让你对对jsp的更熟悉
JSP2.1技术规范
关于jsp中EL(Expression Language)表达式的相关简介
el表达式,jsp.el表达式,页面el表达式,el表达式注释 el表达式的解释,el表达式的应用,java el表达式
JSP中EL表达式,主要介绍EL的详细用法,熟练掌握EL知识。
jsp el表达式详解
Tomcat6.0实现了Servlet 2.5规范和JSP2.1规范,为了使用方便这里上传JSP 2.1规范,上传的其他相关资源还有:Servlet2.5 规范、Servlet2.5 API文档、JSP2.1 API文档。
JSP-EL表达式 一些简单的介绍 希望对大家有所帮助吧
下面小编就为大家带来一篇jsp页面中EL表达式被当成字符串处理不显示值问题的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
JSP中的EL表达式介绍.doc 详细介绍EL表达式的应用
EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0 将 EL 表达式...
EL表达式的概念,详细介绍了EL表达式相关使用方法以及注意要点
JSP与EL详解
EL表达式语言 EL语言是JSTL输出(输入)一个JAVA表达式的表示形式。 在JSTL中,EL语言只能在属性值中使用。EL语言只能通过建立表达式${exp1}来进行调用。在属性值中使用表达式有三种方式。 1、 value属性包含一个...
Servlet+MySql+Web(HTML+CSS+JSP技术+EL表达式)通过IDEA来实现数据库的增删改查(crud))-附件资源
EL表达式总是用大括号括起,而且前面有一个美元符($)前缀:${expression}。 表示式中第一个命名变量要么式一个隐式对象,要么是某个作用域(页面作用域、请求作用域、会话作用域或应用作用域)中的一个属性.........
jsp+servlet+el 分页 实现的简单 分页
在JSP页面用EL表达式调用一些函数,可以减少小脚本的出现