1.include指令
1.1 靜態(tài)包含
Jsp頁面中的include指令表示靜態(tài)包含,它與RequestDispatcher接口的include()方法的功能類似,但是RequestrianDispatcher接口的include()方法屬于動(dòng)態(tài)包含。靜態(tài)包含的目的就是把多個(gè)JSP文件合并成一個(gè)JSP文件。
靜態(tài)包含語法格式是:<%@include file=”包含資源的路徑”%>,其中include指令只有一個(gè)屬性,就是file,它指定要包含的jsp文件路徑。例如:<%@include file=”hello.jsp”%>,這樣寫file屬性中的路徑是相對(duì)路徑,相對(duì)當(dāng)前的jsp文件。
靜態(tài)包含和動(dòng)態(tài)包含有一定的區(qū)別,靜態(tài)包含是運(yùn)行Java文件之前將JSP文件合并,然后生成一個(gè)Java文件,最后生成一個(gè).class文件,如圖1-1所示;而RequestrianDispatcher接口的include()方法,包含與被包含的是兩個(gè)Servlet,有兩個(gè).class文件,在運(yùn)行時(shí)將兩個(gè)Servlet的響應(yīng)結(jié)果合并。
圖1-1 靜態(tài)包含
1.2 演示靜態(tài)包含
下面我們通過一個(gè)小案例來了解靜態(tài)包含,如下所示:
(1)新建一個(gè)web工程,名稱為Example3,在該應(yīng)用下的WebRoot目錄下新建一個(gè)jsp文件,名稱為one.jsp,主要代碼如例1-1所示:
例1-1 one.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<%
String name="zhangsan";
%>
<%@include file="/jsps/two.jsp" %>
</body>
</html> |
例1-1中,one.jsp頁面包含的頁面是jsps目錄下的two.jsp,這里使用的是絕對(duì)路徑。在one.jsp頁面中定義了一個(gè)字符串變量name。
(2)在WebRoot目錄下新建一個(gè)jsps目錄,然后在該目錄下新建一個(gè)jsp文件,名稱為two.jsp,主要代碼如例1-2所示:
例1-2 two.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<%=name %>
</body>
</html> |
例1-2中,向?yàn)g覽器端輸出name變量的值,該變量在one.jsp頁面中定義了,因?yàn)槭窃诜g成Java文件之前合并的,所以說這樣寫沒什么問題。
(3)將Example3發(fā)布到服務(wù)器中,然后啟動(dòng)服務(wù)器,在瀏覽器端訪問one.jsp,瀏覽器顯示結(jié)果如圖1-1所示:
圖1-1 瀏覽器顯示結(jié)果
由圖1-1可知,服務(wù)器端出現(xiàn)錯(cuò)誤,是因?yàn)槭裁茨??根?jù)例1-1和例1-2可知,在one.jsp和two.jsp頁面中都定義名稱為path和basePath的字符串變量,而one.jsp和two.jsp最終會(huì)翻譯成一個(gè)Java文件中,在一個(gè)類的一個(gè)方法中定義同名變量必然會(huì)報(bào)錯(cuò),現(xiàn)在我們對(duì)two.jsp頁面進(jìn)行修改,如例1-3所示:
例1-3 two.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%=name %>
</body>
</html> |
例1-3中,將two.jsp頁面中的與one.jsp頁面沖突的Java腳本刪除。
(4)重新啟動(dòng)服務(wù)器,在瀏覽器端再次訪問one.jsp,瀏覽器顯示結(jié)果如圖1-2所示:
圖1-2 瀏覽器顯示結(jié)果
由圖1-2可知,one.jsp和two.jsp頁面合并成功。
我們知道靜態(tài)包含是在翻譯成Java文件之前合并,那么如果在one.jsp中做如下修改:
<body>
<%
String name="zhangsan";
String road="/jsps/two.jsp";
%>
<%@include file="<%=road %>" %>
</body> |
即定義一個(gè)road變量,然后在file屬性上使用Java腳本輸出road變量的值,這種方式是否可行呢?答案是不可以的,因?yàn)?ldquo;<%=road%>”這句代碼只有在程序運(yùn)行時(shí)才輸出“/jsps/two.jsp”,而靜態(tài)包含是在運(yùn)行之前進(jìn)行的,這個(gè)時(shí)候one.jsp頁面就不知道到底要包含誰,因此是不可以的。
1.3靜態(tài)包含的作用
在開發(fā)中,很可能有這樣的情況,一個(gè)頁面的頂部,左側(cè)以及底部的內(nèi)容不變,只有右側(cè)的內(nèi)容是變化的,這時(shí)候我們就可以將不變的部分分別設(shè)計(jì)成為各自jsp文件,然后在先前的頁面中包含這些不變化部分對(duì)應(yīng)的jsp頁面,這種設(shè)計(jì)類似于框架集。那么靜態(tài)包含的作用就是把頁面分解,使用包含的方式組合在一起,這樣一個(gè)頁面中不變的部分,就是一個(gè)獨(dú)立jsp,而我們只需要處理變化的頁面。
2.taglib指令
jsp頁面中taglib指令的作用是導(dǎo)入標(biāo)簽庫,例如:<%@taglib prefix=”c” uri=”http://java.sun.com/ jsp/jstl/ core”%>,其中prefix與uri都是taglib的屬性,taglib也只有這兩個(gè)屬性。
- prefix:指定標(biāo)簽庫在本頁面中的前綴,這個(gè)前綴可以由我們自己來取,但是建議大家使用官方規(guī)定的;
- uri:指定標(biāo)簽庫的位置;
taglib指令的prefix的屬性是為當(dāng)前標(biāo)簽庫指定前綴,如果一個(gè)頁面中導(dǎo)入了多個(gè)標(biāo)簽庫,而這些標(biāo)簽庫中有同名的標(biāo)簽,如果不指定前綴那么就很可能有沖突,例如:<s:text/>標(biāo)簽指定的是前綴為s的那個(gè)標(biāo)簽庫中的<text>標(biāo)簽。
由于我們還沒有學(xué)習(xí)標(biāo)簽庫,所以這里對(duì)taglib指令就介紹這么多,其他知識(shí)會(huì)在后面的標(biāo)簽庫中詳細(xì)介紹。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/javaee