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

來源:互聯網
上載者:User

在使用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規範版本來進行相應的配置。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.