我遇到了生成的java文件中第384行发生错误方法的代码
_jspService(HttpServletRequest,HttpServletResponse)
超过 65535 字节限制。
我已经尝试了网络上的几种解决方案,但问题仍然存在。
我使用Jboss-5.1.0 GA作为服务器。
这是错误的堆栈跟踪。
An error occurred at line: 384 in the generated java file
The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit
Stacktrace:
at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:439)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:335)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:313)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:300)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:585)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:312)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:322)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:249)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:638)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:543)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:480)
at com.liferay.portlet.PortletRequestDispatcherImpl.dispatch(PortletRequestDispatcherImpl.java:307)
at com.liferay.portlet.PortletRequestDispatcherImpl.include(PortletRequestDispatcherImpl.java:115)
at com.liferay.portal.struts.PortletRequestProcessor.doInclude(PortletRequestProcessor.java:284)
at com.liferay.portal.struts.PortletRequestProcessor.doForward(PortletRequestProcessor.java:255)
您的 JSP 太大/太复杂。你需要重构它。
我们尝试了重构,但它不起作用,有其他解决方案吗?
不。没有其他解决方案。
问题在于,Java 虚拟机规范 (JVMS) 对已编译的 Java 方法中字节码的字节数施加了“硬限制”。具体来说,类文件格式使用 16 位数字作为方法代码数组的大小。) Java 编译器无法自动将太大的方法拆分为子方法。你必须在源代码级别自己完成。
对于 JSP,JSP 编译器将每个 JSP 转换为具有单个(大)Java 方法的类,除非您可以通过将某些逻辑移动到单独的方法、类或...使用“动态包含”的 JSP 来重构它;请参阅
https://stackoverflow.com/a/5484509/139985。在 tomcat 服务器中,找到 web.xml 配置文件(路径:tomcat_home/conf/web.xml)
然后搜索“JspServlet”块
现在添加下面提到的“
”值
<init-param>
<param-name>mappedfile</param-name>
<param-value>false</param-value>
</init-param>
在此更改之后,您的“JspServlet”块将如下所示
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>mappedfile</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
保存文件并重启Tomcat服务器