一、静态包含、动态包含
上篇博客:Web组件的交互,涉及到了包含。这篇博客对静态包含、动态包含进行区分
1.静态包含
include指令用于静态包
<%@ include file="被包含组件的URL"%>
2.动态包含
include标签用于动态包含
<jsp:include page="被包含组件的URL"/>
3.共同点
无论是静态包含还是动态包含,组件和被包含的目标组件都共享请求范围内的共享数据。
二、实例分析
1.静态包含
//sin.jsp
<html>
<head></head>
<body>
sin jsp is including content.jsp.
<%
//定义一个变量count
int count = 1;
//将username设置到request中
request.setAttribute("username","Tom");
%>
<!--包含content.jsp-->
<%@ include file="content.jsp" %>
sin.jsp is doing something else.
</body>
</html>
//content.jsp
<html>
<head></head>
<body>
</p>
Output from content.jsp</br>
<!--获取count变量-->
count = <%=count %> </br>
<!--获取request中的username并显示-->
username = <%=request.getAttribute("username") %>
</p>
</body>
</html>
在浏览器中输入,http://localhost:8080/testapp/sin.jsp?username="Tom".输出结果:
sin.jsp is including content.jsp.
Output from content.jsp
count = 1
username = Tom
sin.jsp is doing something else.
分析:静态包含发生在解析JSP源组件阶段。被包含的目标文件中的内容被添加到JSP源组件中,Servlet容器对JSP源组件进行翻译和编译。JSP源组件和JSP目标组件对应同一个Servlet。静态包含的目标组件可以为HTML文件或者JSP文件,但不允许为Servlet。
2.动态包含
//din.jsp
<html>
<head></head>
<body>
din.jsp is including content.jsp.
<% int count = 1;
request.setAttribute("username","Tom");
%>
<jsp:include page="content.jsp" %>
din.jsp is doing something else.
</body>
</html>
运行时,提示content.jsp无法识别局部变量count。
分析:动态包含发生在运行JSP源组件阶段。对于动态包含,目标组件和源组件分别对应不同的Servlet。两个不同的Servlet之间,无法访问对方的服务方法中的局部变量。如果目标组件为JSP,Servlet容器会在运行JSP源组件的过程中,运行于JSP目标组件对应的Servlet的服务方法。JSP目标组件生成的响应结果被包含到JSP源组件的响应结果中。动态包含的目标组件可以为HTML文件、jsp文件或者Servlet。
三、生活举例
静态包含:
主人请客人在家里吃饭。想给客人做炖鸡。家里有只鸡,但是主人不会做。主人打电话到餐厅,把厨师请到家里,做了这只鸡。
动态包含:
同样上面一个例子,主人不是把厨师请到家里,而是给餐厅下了一份订单——炖鸡。厨师不能用主人家的鸡,(餐厅没有鸡)厨师只能说:“没有鸡,做不了。”
主人家的鸡对应于源组件的变量。餐厅对应于被包含的目标组件。对于静态包含,厨师使用的是主人家的厨房。对于动态包含,一个是主人家的厨房,一个是餐厅的厨房,餐厅的厨房里是拿不到主人家厨房里的东西的。所以,厨师只能说做不了。这对应于动态包含中的错误信息。