1.include的2种方式
include多用于网站中可重用的部件,如网站统一的页眉和页脚。
包括2种方式
第一种include指令
<%@include file=""%>
第二种include动作
<jsp:include page="" />
这两者的结果相差无几但是他们的内部原理却不相同,我们看看它们分别生成的servlet:
页眉文件的servlet代码,取自_JspService方法:
out.write("\r<img src=\""\>.....");
使用include指令的jsp生成的servlet
out.write("<html><body>\r");
out.write("\r<img src=\""\>.....");
out.write("....");//其他代码
out.write("\r\r\r<body></html>");
可以看出include指令只是在转换之前就将页眉部分的代码与页面其他代码合并在一起,再进行编译。
include动作生成的servlet:
out.write("<html><body>\r");
org.apache.jasper.runtime.JspRuntimeLibrary.include(request,response,"Head.jsp",out,false);
out.write("....");//其他代码
out.write("\r\r\r<body></html>");
include动作并没有将Head.jsp的代码放在servlet中,只是在代码中加了运行时的调用。
从上面的实例可以看出,include指令对于位置的敏感性很强,而且最好没有动态的内容在被包含的页面中。
同时,另一点需要注意的是被包含的页眉或是页脚中最好不要带有
<html><body></html></body>
这样的代码,除非必须这么做。
2.使用param包含动态页面
当需要包含动态的页面时,可以使用include动作与param体配合完成
<html><body>
<jsp:include page="Head.jsp" >
<jsp:param name="subTitle" value="Weclome to China">
</jsp:include>
<br>
<!--其他代码--!>
</body></html>
Head.jsp
<img src="images/web-service.jpg"><br>
<em><strong>${param.subTitle}</strong></em>
ps:总结下forward动作
forward动作在mvc中发挥的作用并不是很大,需要注意的一点是,利用forward动作时,缓冲区会在转发前清空,所以无论是在forward前或是后的代码都不会有效果。
但若在forward之前添加了响应,比如:
out.flush();
容器会讲响应之前的代码展示,但是继续执行forward时,包IIIegalStateException异常,client只会看到响应之前的内容,没有转发,页面剩下的部分也不会执行,所以不要在转发之前刷新输出。