一、靜態包含、動態包含
上篇博客: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。
三、生活舉例
靜態包含:
主人請客人在家裏吃飯。想給客人做燉雞。家裏有隻雞,但是主人不會做。主人打電話到餐廳,把廚師請到家裏,做了這隻雞。
動態包含:
同樣上面一個例子,主人不是把廚師請到家裏,而是給餐廳下了一份訂單——燉雞。廚師不能用主人家的雞,(餐廳沒有雞)廚師只能說:“沒有雞,做不了。”
主人家的雞對應於源組件的變量。餐廳對應於被包含的目標組件。對於靜態包含,廚師使用的是主人家的廚房。對於動態包含,一個是主人家的廚房,一個是餐廳的廚房,餐廳的廚房裏是拿不到主人家廚房裏的東西的。所以,廚師只能說做不了。這對應於動態包含中的錯誤信息。