今天遇到一個很有趣的問題,有個系統要從舊的環境移到新的環境,在程式碼沒有變動的情況下,新環境會出現這個錯誤,由於舊的環境 JDK 跟 Tomcat 真的是太舊了,會有這些錯誤不意外,環境不一致所造成的不相容也只好慢慢修掉。

今天收到內容單位的來信,要求把這個 500 Error 修掉,前陣子有其他事情要忙,一直拖到今天才處理,根據錯誤訊息查詢了一下,前幾篇就找到答案了,這邊小蛙把錯誤訊息列一下

org.apache.jasper.JasperException: /System/User.jsp (line: 3, column: 0) Expecting "jsp:param" standard action with "name" and "value" attributes
    org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42)
    org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:408)
    org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:89)
    org.apache.jasper.compiler.Parser.parseParam(Parser.java:825)
    org.apache.jasper.compiler.Parser.parseBody(Parser.java:1670)
    org.apache.jasper.compiler.Parser.parseOptionalBody(Parser.java:1002)
    org.apache.jasper.compiler.Parser.parseInclude(Parser.java:854)
    org.apache.jasper.compiler.Parser.parseStandardAction(Parser.java:1116)
    org.apache.jasper.compiler.Parser.parseElements(Parser.java:1449)
    org.apache.jasper.compiler.Parser.parse(Parser.java:138)
    org.apache.jasper.compiler.ParserController.doParse(ParserController.java:242)
    org.apache.jasper.compiler.ParserController.parse(ParserController.java:102)
    org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:198)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

有好幾個頁面都會出現這個錯誤,Google之後發現這是一件有趣的事情,舊環境上沒有這個問題,新環境才會發生(也許跟 JDK, Tomcat 版本有關,沒有時間特別去測…),根據問題的敘述小蛙找到該行看一下到底是什麼原因引起的

<jsp:include page="A.jsp">
</jsp:include>

左看右看上看下看,看起來好像很正常,有開始的 tag 也有結束的 tag,為什麼會報錯呢?原來在比較新的環境上,也許是對這方面的語法比較要求,解決的方法一共有三種,很簡單卻也令人無言 …

  • 方法一:把沒有參數的 tag 直接關閉掉
<jsp:include page="A.jsp" />
  • 方法二:把沒有參數的 tag 寫在同一行
<jsp:include page="A.jsp"></jsp:include>
  • 方法三:把沒有參數的 tag,也傳一份空值進去符合格式
<jsp:include page="A.jsp">
  <jsp:param name="" value="" />
</jsp:include>

這樣”簡單”的解決方式,有沒有讓人覺得牙癢癢呢?

 
參考資料

  1. jsp的标签<jsp:include>的用法 @ CSDN 論壇
    http://topic.csdn.net/t/20060407/20/4671180.html
  2. JasperException: Expecting “jsp:param” standard action with “name” and “value” attributes @ www.giannistsakiris.com
    http://www.giannistsakiris.com/index.php/2007/08/23/
  3. JSP – Expecting “jsp:param” standard action with “name” and “value” attributes @ stackoverflow
    http://stackoverflow.com/questions/2092665/

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *