首页 > 技术文章 > jsp文件过大,is exceeding 65535 bytes limit

donefive 2017-01-22 09:33 原文

今天修改jsp的时候,遇到了一个异常,Generated servlet error:The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit。

原因: jsp的本质是servlet,tomcat编译时会先将他转换成java代码,然后再进行编译。 你的jsp编译成生成的文件太大,导致报错。

有下面几个解决方法:

下面是第一个解决方案:

尝试修改应用服务器的web.xml文件(在tomcat下位于conf目录下,在jboss下位于server\default\deploy\jbossweb.sar目录下 ),修改如下图所示之处,加入红框内的初始化参数。 这样确实可以成功,但是,如果你把生产环境下的tomcat都更改,那不是很费时间,还可能出现其他的问题

 

下面是一种方法:

我们可以将jsp页面的标签声明拿到web.xml中去声明。

具体操作如下:1删除jsp页面中的C标签和fmt标签的引入。 即删除这句话

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>

2找到web.xml,增加c标签和fmt标签的配置。

<jsp-config>
  <taglib>
   <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
   <taglib-location>/WEB-INF/tld/c.tld</taglib-location>
  </taglib>
  <taglib>
   <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
   <taglib-location>/WEB-INF/tld/fmt.tld</taglib-location>
  </taglib>
 </jsp-config>

 

 

下面是另一种方法:

解决办法 : 将JSP的一些代码分离开来抽取成一个JSP,然后动态引入 <jsp:include page=”文件路径/文件名 ”/>

问题详解:

  指令include和动态include的区别

  如果是指令include 

  <%@include file="footer.jsp" %>
   footer.jsp的内容会被插入到 hello.jsp 转译 成的hello_jsp.java中,最后只会生成一个hello_jsp.java文件

   如果是动作include 

  <jsp:include page="footer.jsp" />
   footer.jsp的内容不会被插入到 hello.jsp 转译 成的hello_jsp.java中,还会有一个footer_jsp.java独立存在。 hello_jsp.java 会在服务端访问footer_jsp.java,然后把返回的结果,嵌入到响应中。

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

最后的问题详解。 要解决这个问题,就得考虑问题出现的原因。

 

 

这里生成的 hello_jsp.class 太大导致的问题。

org.apache.jasper.runtime.HttpJspBase
 

 

所以只需要考虑:如何将class文件变小。 我们上面的方式都是把一个大的 class 拆分成多个小的 class, 至此任务完成。

 

推荐阅读