org.apache.jasper.JasperException : Expecting "jsp:param" standard action with "name" and "value" attributes
今天遇到一個很有趣的問題,有個系統要從舊的環境移到新的環境,在程式碼沒有變動的情況下,新環境會出現這個錯誤,由於舊的環境 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>
這樣”簡單”的解決方式,有沒有讓人覺得牙癢癢呢?
參考資料
- jsp的标签<jsp:include>的用法 @ CSDN 論壇
http://topic.csdn.net/t/20060407/20/4671180.html - JasperException: Expecting “jsp:param” standard action with “name” and “value” attributes @ www.giannistsakiris.com
http://www.giannistsakiris.com/index.php/2007/08/23/ - JSP – Expecting “jsp:param” standard action with “name” and “value” attributes @ stackoverflow
http://stackoverflow.com/questions/2092665/