jsp包含页面的三种方式

来源:互联网 发布:王文也 井柏然 知乎 编辑:程序博客网 时间:2024/05/16 18:39

今天在调试一个问题时,发现系统中一个页面无法正常显示,查看log,后台抛了这么个错:

...................................................../_CategoriesDisplayMercado.java:861: code too large
public void _jspService(HttpServletRequest request, HttpServletResponse  response)
            ^
......................

这个java类是一个jsp对应的编译后的servlet,错误原因是这个servlet中的service方法太大了,超过了jvm的限制(具体大小不用jvm应该不同,通常好像一个方法最大 64K)!如果一个jsp页面包含太多内容,在转化成 servlet 方法时很容易造成 service 方法过大!而出现上面的错误!我们的解决方法就是,将这个大的JSP page进行分割,然后通过 <jsp:include > 或者 JSTL 标签 <c:import > 的方式组合到一个大的jsp页面中!这样就不会出现问题了。

=====================================================================================================

JSP中三种不同包含页面的方式


<%@ include file="header.inc"%>

  • 该指令在编译之前先读入指定的页面中的内容(并不对动态内容求值),融合后的完整页面再被整体的转换为一个servlet。

    这意味着主页和被引入的页面共享所有的页面作用域数据。
    因此,如果主页面中声明了一个变量,而在某个被引入的页面中也声明了一个同名的变量,那么在翻译阶段将会造成一个错误,因为组合后的页面无法进行编译。

  • 被引用页面改变后,容器可能不会马上产生反应。
  • JSP规范建议在使用include指令引入JSP页面时,最好使用不同的文件扩展名,因为它们一般都不是完整而合法的页面,如:可以使用这些替代的文件扩展名:.jspf或 .jsf。
  • 执行时机:在翻译阶段(将JSP页面转换成servlet的阶段)

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

  • 该行为并不是要引入指定页面的实际内容,它将引入执行该引入页面后所产生的应答

    这意味着你可以指定任何能够产生文本应答的web资源。JSP容器将通过一个内部的函数调用来调用指定的资源。因此,这些被引入的资源可以帮助处理原来的请求,所以这些资源可以访问请求作用域内的所有对象,以及所有的请求参数。

  • 注意,它不能访问任何页面作用域属性,或是在主页面中声明的脚本变量。
  • 执行时机:在请求处理阶段。

<c:import url="header.jsp"/>

  • <c:import>行为和<jsp:include>相同;
  • 另外它还可以从外部资源引入数据,比如不同的web应用程序;
  • 另外它还可以在被引用页面改变后,容器立刻能产生反应;
  • 所以应该使用<c:import>来代替<jsp:include>的使用。
  • 执行时机:在请求处理阶段。
0 0