You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jsp:include标签结合<%=表达式使用报错原因及正确实现方法

为什么<jsp:include>标签中不能直接拼接<%= ... %>表达式

JSP容器解析标签属性时,只会识别两类合法的属性值格式:

  1. 纯静态字符串:直接将属性值作为常量处理,不会解析内部嵌套的任何脚本、EL语法
  2. 完整动态值:整个属性值完全由<%= %>脚本表达式或者${}EL表达式构成,容器会先计算表达式的返回结果,再作为属性值传入标签

你编写的page="pages/<%= element.convertToLowercase() %>.jsp"属于把静态字符串和脚本表达式混写在同一个属性值里,容器会把整段内容识别为普通静态路径,根本不会触发<%= %>的解析逻辑。路径中的%字符会被后续URL解码逻辑识别为转义起始符,由于后面没有跟着合法的两位十六进制数,就抛出了你看到的参数非法异常。

正确实现方式

可以任选以下两种方案实现动态页面引入:

  • 方案1:用JSP脚本提前拼接完整路径后传入
    先在脚本块里拼接好完整的目标页面路径存为变量,再把整个page属性值设为脚本表达式,不要和静态字符串片段混写:
    <%
        // 提前拼接完整的目标页面路径
        String includePath = "pages/" + element.convertToLowercase() + ".jsp";
    %>
    <jsp:include page="<%= includePath %>"></jsp:include>
    
  • 方案2:用EL表达式直接传动态路径(支持JSP 2.0及以上版本)
    只要element对象存放在page、request、session、application任意一个作用域中,就可以直接在page属性里用EL完成路径拼接,不需要单独编写脚本块:
    <jsp:include page="pages/${element.convertToLowercase()}.jsp"></jsp:include>
    
附原始异常栈

java.lang.IllegalArgumentException: Failed to decode [/pages/<%= element.convertToLowercase() %>.jsp] because the % character must be followed by two hexademical digits
at org.apache.tomcat.util.buf.UDecoder.URLDecode(UDecoder.java:431)
at org.apache.catalina.core.ApplicationContext.getRequestDispatcher(ApplicationContext.java:429)
at org.apache.catalina.core.ApplicationContextFacade.getRequestDispatcher(ApplicationContextFacade.java:227)
at org.apache.catalina.connector.Request.getRequestDispatcher(Request.java:1417)
at org.apache.catalina.connector.RequestFacade.getRequestDispatcher(RequestFacade.java:614)
at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:952)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:285)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:71)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:467)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:378)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:326)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:832)

内容的提问来源于stack exchange,提问作者Japhei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:39:19