1.jsp動作標(biāo)簽概述
Jsp動作標(biāo)簽是Javaweb內(nèi)置的的動作標(biāo)簽,一共定義了20個(gè),因?yàn)樗鼈円呀?jīng)定義好了,所以我們可以直接拿來使用。它的作用就是用來簡化Java腳本,其格式為:<jsp:標(biāo)簽名…>。
Jsp動作標(biāo)簽與HTML標(biāo)簽有本質(zhì)的區(qū)別,動作標(biāo)簽是由服務(wù)器解釋執(zhí)行,它與Java代碼一樣,在服務(wù)器端執(zhí)行,而HTML標(biāo)簽是由瀏覽器解釋執(zhí)行。
下面我們來一一了解jsp的幾個(gè)動作標(biāo)簽:
2.jsp動作標(biāo)簽介紹
2.1<jsp:forward>標(biāo)簽
<jsp:forward>標(biāo)簽是用來做請求轉(zhuǎn)發(fā),它與RequestDispatcher接口的forward()方法一樣,唯一不同的是它是在jsp頁面中使用。
下面我們通過一個(gè)案例學(xué)習(xí)使用<jsp:forward>標(biāo)簽完成轉(zhuǎn)發(fā),具體如下所示:
(1)創(chuàng)建一個(gè)web應(yīng)用,名稱為Example4,在該應(yīng)用的WebRoot目錄下新建一個(gè)目錄,名稱為jspsForward,然后在該目錄下新建一個(gè)jsp頁面,名為first.jps,主要代碼如例1-1所示:
例1-1 first.jsp
<body>
<h1>first.jsp</h1>
<!-- 轉(zhuǎn)發(fā)到second.jsp -->
<jsp:forward page="second.jsp"/>
</body> |
(2)在jspsForward目錄下再次新建一個(gè)jsp文件,名為second.jsp,主要代碼如例1-2所示:
例1-2 second.jsp
<body>
<h1>second.jsp</h1>
</body> |
(3)將Example4發(fā)布到服務(wù)器中,然后啟動服務(wù)器,在瀏覽器端訪問:http://localhost:8080/Example4/jsps
Forward/first.jsp,瀏覽器顯示結(jié)果如圖1-1所示:
圖1-1 瀏覽器顯示結(jié)果
由圖1-1可知,瀏覽器中顯示的只有second.jsp頁面的標(biāo)題,而first.jsp頁面中的標(biāo)題“<h1>first.jsp</h1>”沒有顯示,我們在學(xué)習(xí)請求轉(zhuǎn)發(fā)時(shí)說過請求轉(zhuǎn)發(fā)“留頭不留體“,即轉(zhuǎn)發(fā)之前響應(yīng)輸出流中的信息會被清空,不會輸出到瀏覽器端。<jsp:forward>標(biāo)簽有同樣的功能。
2.2<jsp:include>標(biāo)簽
<jsp:include>標(biāo)簽的作用使用來包含其他jsp頁面,之前學(xué)習(xí)的
include指令屬于靜態(tài)包含,而include動作標(biāo)簽是動態(tài)包含,它和RequestDispatcher接口的include()方法一樣,是運(yùn)行級別的包含,即當(dāng)前jsp和被包含的jsp都會生成各自的Servlet,然后在執(zhí)行當(dāng)前jsp的Servlet時(shí)完成包含另一個(gè)Servlet,因此會存在兩個(gè)Java文件和兩個(gè).class文件。
下面我們通過一個(gè)案例學(xué)習(xí)如何使用include動作標(biāo)簽完成包含,如下所示:
(1)在Example4應(yīng)用的WebRoot目錄下,新建一個(gè)jspsInclude目錄,然后在該目錄下創(chuàng)建一個(gè)jsp文件,名稱為first.jsp,主要代碼如例1-3所示:
例1-3 first.jsp
<body>
<h1>first.jsp</h1>
<!-- 包含second.jsp -->
<jsp:include page="second.jsp"></jsp:include>
</body> |
(2)在jspsInclude目錄下再次創(chuàng)建一個(gè)jsp文件,名稱為second.jsp,主要代碼如例1-4所示:
例1-4 second.jsp
<body>
<h1>second.jsp</h1>
</body> |
(3)重新啟動服務(wù)器,在瀏覽器端訪問:http://localhost:8080/Example4/jspsInclude/first.jsp,瀏覽器顯示結(jié)果如圖1-2所示:
圖1-2 瀏覽器顯示結(jié)果
由圖1-2可知,first.jsp和second.jsp中的內(nèi)容都輸出在瀏覽器端,符合請求包含的特點(diǎn)。
下面我們?nèi)omcat安裝目錄中查看first.jsp和second.jsp是否都被翻譯成Java文件,如圖1-3所示:
圖1-3 翻譯結(jié)果
由圖1-3可知,first.jsp與second.jsp各自都被翻譯成Java文件,然后我們打開first_jsp.java文件,觀察該文件中的_jspService()方法,如圖1-4所示:
圖1-4 first_jsp.java
由圖1-4可知,include動作標(biāo)簽轉(zhuǎn)換成了一句代碼:
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "second.jsp", out, false),該方法的效果和RequestDispatcher接口的include()方法一樣。
了解了動態(tài)包含,現(xiàn)在查看靜態(tài)包含時(shí)jsp頁面被翻譯之后的結(jié)果,根據(jù)
include指令中案例Example3中的靜態(tài)包含頁面,查看Tomcat安裝目錄中翻譯之后Java文件,如圖1-5所示:
圖1-5 靜態(tài)包含翻譯之后的Java文件
由圖1-5可知,靜態(tài)包含時(shí),包含頁面與被包含頁面合并之后翻譯成一個(gè)Java文件,該Java文件的名字是以包含頁面的名字命名的,現(xiàn)在我們來查看one_jsp.java文件,如圖1-6所示:
圖1-6 one_jsp.java
圖1-6中,在one_jsp.java中,_jspService()方法中先將one.jsp頁面中的內(nèi)容使用out對象輸出在瀏覽器端,然后再將two.jsp頁面中的內(nèi)容使用out對象輸出在瀏覽器端。
include指令與include動作標(biāo)簽的區(qū)別就是靜態(tài)包含于動態(tài)包含之間的區(qū)別,即包含頁面與被包含頁面被合并的時(shí)機(jī)。
2.3<jsp:param>標(biāo)簽
<jsp:param>標(biāo)簽作為<jsp:forward>標(biāo)簽和<jsp:include>標(biāo)簽的子標(biāo)簽,用來給轉(zhuǎn)發(fā)或包含的頁面?zhèn)鬟f數(shù)據(jù)。寫法如下所示:
<jsp:forward page="second.jsp">
<jsp:param value="zhangsan" name="username"/>
<jsp:param value="123" name="password"/>
</jsp:forward> |
(1)下面,我們就在forward動作標(biāo)簽的基礎(chǔ)上添加param動作標(biāo)簽,修改例1-1,如例1-5所示:
例1-5 first.jsp
<h1>first.jsp</h1>
<!-- 轉(zhuǎn)發(fā)到second.jsp -->
<jsp:forward page="second.jsp">
<jsp:param value="zhangsan" name="username"/>
<jsp:param value="123" name="password"/>
</jsp:forward>
</body> |
(2)修改jspsForward目錄下的second.jsp頁面,在該頁面中獲取請求參數(shù)username和password,并輸出在瀏覽器端,如例1-6所示:
例1-6 second.jsp
<body>
<h1>second.jsp</h1>
<%
String username =request.getParameter("username");
String password=request.getParameter("password");
out.print("username: "+username+",password: "+password);
%>
</body> |
(3)重啟服務(wù)器,在瀏覽器端訪問:http://localhost:8080/Example4/jspsForward/first.jsp,瀏覽器顯示結(jié)果如圖1-7所示:
圖1-7 瀏覽器顯示結(jié)果
在first.jsp頁面利用param標(biāo)簽傳遞的參數(shù)成功的在second.jsp面獲取,并顯示在瀏覽器端。在include動作表標(biāo)簽中使用param標(biāo)簽和在forward標(biāo)簽中使用param標(biāo)簽一樣,這里我們就不在演示了。
3.jsp在web.xml文件中的配置
這里給大家補(bǔ)充兩個(gè)小知識:第一,在Tomcat安裝目錄下的conf/context.xml文件中配置一個(gè)屬性,該屬性的配置可以使我們修改了servlet之后不用重啟服務(wù)器;第二,客戶端訪問jsp文件,其實(shí)是訪問一個(gè)名為JspServlet的servlet。
首先來詳細(xì)說明第一個(gè)小知識:
(1)找到Tomcat的安裝目錄,打開conf/context.xml文件,如圖1-8所示:
圖1-8 context.xml
(2)在圖1-8中的<Context>標(biāo)簽中添加一個(gè)屬性reloadable,如圖1-9所示:
圖1-9 context.xml
圖1-9中,reloadable屬性的值為true,表示如果修改了服務(wù)器端的servlet類的代碼,不需要重啟服務(wù)器。但是配置這個(gè)屬性也有缺點(diǎn),我們會在以后的數(shù)據(jù)庫連接池中說明這個(gè)問題。
接著我們來說說第二個(gè)小知識:
我們知道在Tomcat的安裝目錄下的conf目錄下有一個(gè)web.xml,這個(gè)web.xml可以理解是部署在Tomcat服務(wù)器下的所有web工程中的web.xml的父文件,現(xiàn)在我們來看看這個(gè)web.xml文件,如圖1-10所示:
圖1-10 web.xml
圖1-10中,配置了一個(gè)名為JspServlet,然后根據(jù)它的名字jsp,在web.xml文件中查找它的映射標(biāo)簽<servlet-mapping>,如圖1-11所示:
圖1-11 web.xml文件
由圖1-11可知,JspServlet的訪問路徑是“*.jsp”和“*.jspx”,也就是說當(dāng)訪問的是jsp頁面,那么就是訪問JspServlet這個(gè)類,然后由這個(gè)類來解析要訪問的jsp文件,最后將文件的內(nèi)容通過響應(yīng)流輸出到瀏覽器端。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://m.fskzgqt.cn/javaee