/WEB-INF/jsps/projectmt/formProjectLaunching.jsp(677,22) PWC6228: #{...} not allowed in a template t

在使用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.     ...  
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>   

  1.     <url-pattern>*.jsp</url-pattern>   
  2.     <deferred-syntax-allowed-as-literal>true</deferred-syntax-allowed-as-literal>   
  3. </jsp-property-group>  
	<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节点配置修改为:
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">  
<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"%>  
<%@ page contentType="text/html; charset=UTF-8" deferredSyntaxAllowedAsLiteral="true"%>

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

使用了以上解决方案后,在采用JSP2.1规范的服务器中,一切运行正常。但由于采用JSP2.0规范的服务器(如tomcat5或jetty5)不能识别以上的这些配置信息,所以,如果在采用JSP2.0规范的服务器中也使用了这些配置,结果会很严重:
   1. JSP页面中的${}表达式不会被编译
   2. 使用了#{}表达式的jsp页面渲染不成功

到目前为止,还没有既适合JSP2.1,又能兼容JSP2.0的配置,所以只能根据服务器采用的JSP规范版本来进行相应的配置。
MATLAB主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性内容概要:本文主要介绍了一种在MATLAB环境下实现的主动噪声和振动控制算法,该算法针对较大的次级路径变化具有较强的鲁棒性。文中详细阐述了算法的设计原理与实现方法,重点解决了传统控制系统中因次级路径动态变化导致性能下降的问题。通过引入自适应机制和鲁棒控制策略,提升了系统在复杂环境下的稳定性和控制精度,适用于需要高精度噪声与振动抑制的实际工程场景。此外,文档还列举了多个MATLAB仿真实例及相关科研技术服务内容,涵盖信号处理、智能优化、机器学习等多个交叉领域。; 适合人群:具备一定MATLAB编程基础和控制系统理论知识的科研人员及工程技术人员,尤其适合从事噪声与振动控制、信号处理、自动化等相关领域的研究生和工程师。; 使用场景及目标:①应用于汽车、航空航天、精密仪器等对噪声和振动敏感的工业领域;②用于提升现有主动控制系统对参数变化的适应能力;③为相关科研项目提供算法验证与仿真平台支持; 阅读建议:建议读者结合提供的MATLAB代码进行仿真实验,深入理解算法在不同次级路径条件下的响应特性,并可通过调整控制参数进一步探究其鲁棒性边界。同时可参考文档中列出的相关技术案例拓展应用场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值