- JSP從零開始學(視頻教學版)
- 劉鑫編著
- 1812字
- 2021-03-12 12:32:00
3.4 JSP動作
上一節介紹了JSP的page、include、taglib這3個指令,這些指令不僅可以幫助JSP編程人員編寫出復雜的JSP頁面,而且能簡化JSP頁面代碼,為后期維護帶來便利。本節介紹JSP中另外一組元素:JSP動作。在JSP中一共有13個動作:<jsp:include>、<jsp:forward>、<jsp:plugin>、<jsp:param>、<jsp:useBean>、<jsp:getProperty>、<jsp:setProperty>、<jsp:output>、<jsp:attribute>、<jsp:element>、<jsp:body>、<jsp:params>、<jsp:fallback>。其中<jsp:include>和<jsp:forward>用的比較多,<jsp:useBean>、<jsp:getProperty>和<jsp:setProperty>與JavaBean相互結合,將在第8章詳細介紹。本節先介紹其他的JSP動作。
3.4.1 <jsp:include>動作
<jsp:include>動作與include指令十分相似,它們的作用都是引入文件到目標頁面。<jsp:include>語法格式如下:
<jsp:include page="relative URL" flush="true"/>
例如:
<jsp:include page="top.html" flush="true"/>
其中page屬性是<jsp:include>動作的一個必選屬性,它指明了需要包含文件的路徑,該路徑可以是相對的也可以是絕對的。flush屬性用于指定輸出緩存是否轉移到被導入文件中。如果指定為true,則包含在被導入文件中;如果指定為false,則包含在原文件中。
提示
page屬性所指的絕對路徑不是文件系統的絕對路徑,而是以應用系統目錄為根目錄的絕對路徑。通常Web應用下的WEB-INF目錄就是根目錄。一般在設定URL時指定相對路徑,這樣簡單些。
使用<jsp:include>動作與include指令可以達到相同的界面效果。例如上節中介紹的使用include指令演示界面頁腳的例子,直接將include替換成<jsp:include>動作,它們在頁面顯示結果中沒有什么不同。
使用jsp:include包含頁腳信息的代碼如下:
----------------- index_include.jsp ---------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 03 <html> 04 <head> 05 <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> 06 <title>JSP include動作演示</title> 07 </head> 08 <body> 09 <jsp:include page="john.html" /> 10 <br/> 11 <div align="center">JSP include指令演示</div> 12 <jsp:include page="copyRight.jsp" flush="true"/> 13 </body> 14 </html>
上述示例中,代碼第9行換成jsp:include動作。可以看出,兩種不同的包含方式達到了相同的效果。
但是,jsp:include動作與include指令還是有些不同的。首先,jsp:include動作是在頁面被訪問時導入的,而include指令是有JSP引擎編譯時導入的;其次,include指令中,被包含的文件會同主頁面一塊被編譯為一個Servlet類文件,而jsp:include動作包含的文件和主頁面會是相對獨立的兩個文件,在編譯時會被編譯成兩個Servlet類文件。因此jsp:include在效率上稍微慢些。
【例3.5】演示jsp:include動作。
----------------- news.jsp ---------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 02 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 03 <html> 04 <head> 05 <title>新聞摘要</title> 06 <meta http-equiv="pragma" content="no-cache"> 07 <meta http-equiv="cache-control" content="no-cache"> 08 <meta http-equiv="expires" content="0"> 09 <meta http-equiv="keywords" content="keyword1, keyword2, keyword3"> 10 <meta http-equiv="description" content="This is my page"> 11 </head> 12 <body> 13 <center> 14 <table> 15 <tr> 16 <th>中華新聞網</th> 17 </tr> 18 </table> 19 </center> 20 <p>最新新聞摘要: 21 <ul> 22 <li><jsp:include page="news1.html" /></li> 23 <li><jsp:include page="news3.html"/></li> 24 <li><jsp:include page="news3.html"/></li> 25 </ul> 26 </p> 27 </body> 28 </html>
上述代碼中,代碼第22~24行使用JSP動作,頁面運行效果如圖3.5所示。

圖3.5 jsp:include運行結果
3.4.2 <jsp:forward>動作
<jsp:forward>動作的作用是轉發請求到另外一個頁面中,在請求過程中會連同請求的參數數據一起被轉發到目標頁面中,目標頁面通過request.getParameter方法獲得參數值進行進一步處理。<jsp:forward>基本語法如下:
<jsp:forward page="relative URL">
<jsp:forward>只有page一個屬性,其值為相對的URL。例如:
<jsp:forward page="/error.jsp"/>
將跳轉到錯誤頁面。
來看一個<jsp:forward>的例子。如果隨機數能被2整除,則跳轉到even.jsp,否則跳轉到odd.jsp。
【例3.6】演示jsp:forward動作。
----------------------- forwardE.jsp-------------------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 02 <% 03 String url = ""; 04 int random = (int)(Math.random()*10); //產生10以內的隨機數 05 int m = random%2; 06 switch(m){ 07 case 0: 08 url = "even.jsp"; 09 break; 10 case 1: 11 url = "odd.jsp"; 12 break; 13 } 14 %> 15 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 16 <html> 17 <head> 18 <title>My JSP 'forwardE.jsp' starting page</title> 19 <meta http-equiv="pragma" content="no-cache"> 20 <meta http-equiv="cache-control" content="no-cache"> 21 <meta http-equiv="expires" content="0"> 22 <meta http-equiv="keywords" content="keyword1, keyword2, keyword3"> 23 <meta http-equiv="description" content="This is my page"> 24 </head> 25 26 <body> 27 <jsp:forward page="<%=url %>"/> 28 </body> 29 </html>
上述代碼中,代碼第2~14行使用Java判斷url的返回值,其中even.jsp中的內容為“能被2整除,跳轉到偶數頁界面”, odd.jsp中的內容為“不能被2整除,跳轉到奇數頁界面”,本例效果如圖3.6所示。

圖3.6 jsp:forward運行結果
從上述代碼的運行結果看出,界面已經被重定向到odd.jsp頁面,但是瀏覽器中的地址仍顯示的是跳轉前的地址。這也算是<jsp:forward>動作的一個特點,相對于請求者而言,所看出的響應仍然是原先請求的頁面給出的,請求者并不會獲得轉發后的頁面地址。這樣相對來說,請求具有隱蔽性。
提示
<jsp:forward>動作中的url頁面只能是該Web應用中的文件,不能是該Web應用之外的文件。
3.4.3 <jsp:param>動作
<jsp:param>用來傳遞參數信息,它經常與其他動作一起使用,比如與<jsp:forward>、<jsp:include>等結合使用傳遞主頁面的參數到目標頁面。其基本語法如下:
<jsp:param name=" 參數名稱" value=" 參數值">
例如:
<jsp:param name="username" value="李四">
【例3.7】和【例3.8】分別是<jsp:param>和<jsp:include>、<jsp:forward>結合使用的例子,由主頁面和子頁面構成。子頁面從主頁面中獲得參數值顯示。
【例3.7】演示<jsp:param>和<jsp:include>結合使用。
----------------------- main.jsp-------------------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 02 <%request.setCharacterEncoding("utf-8"); //設定頁面傳遞參數的編碼格式%> 03 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 04 <html> 05 <head> 06 <title>主頁面</title> 07 </head> 08 09 <body> 10 <center> 11 <table> 12 <tr> 13 <th>主頁面</th> 14 </tr> 15 </table> 16 </center> 17 <jsp:include page="subPage.jsp" > 18 <jsp:param value="John" name="userName"/> 19 <jsp:param value="10086" name="passwd"/> 20 <jsp:param value="北京豐臺" name="address"/> 21 </jsp:include> 22 </body> 23 </html>
上述代碼中,第17行引用<jsp:include>動作,代碼第18~20行使用<jsp:param>參數。
----------------------- subPage.jsp-------------------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 02 <% 03 String userName= request.getParameter("userName"); 04 String passwd= request.getParameter("passwd"); 05 String address= request.getParameter("address"); 06 System.out.println(address); 07 %> 08 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 09 <html> 10 <head> 11 <title>子頁面</title> 12 </head> 13 <body> 14 <center> 15 <table> 16 <tr> 17 <th>子頁面:人員信息</th> 18 </tr> 19 </table> 20 </center> 21 <center> 22 <table> 23 <tr> 24 <td>用戶名:<%=userName%></td> 25 </tr> 26 <tr> 27 <td>密 碼:<%=passwd%></td> 28 </tr> 29 <tr> 30 <td>用戶地址:<%=address%></td> 31 </tr> 32 </table> 33 </center> 34 </body> 35 </html>
上述代碼中,第22~32行獲取主頁面傳遞的參數值。
提示
所有的頁面編碼格式要統一,否則在傳遞中文時會出現亂碼問題。request.setCharacterEncoding方法是設定傳遞參數的編碼格式,在傳遞中文時要特別注意。在URL中包含參數傳遞時,可能會有中文亂碼或者特殊字符問題,需要對這些參數進行編碼處理。在JavaScript(簡稱JS)中,通過調用函數encodeURI或者encodeURIComponent實現編碼,在JSP腳本中,通過方法URLEncoder.encode實現轉碼。
頁面效果如圖3.7所示。

圖3.7 <jsp:param>和<jsp:include>結合使用運行結果
【例3.8】演示<jsp:param>和<jsp:forward>結合使用。
----------------------- main.jsp-------------------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 02 <%request.setCharacterEncoding("utf-8"); //設定頁面傳遞參數的編碼格式%> 03 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 04 <html> 05 <head> 06 <title>主頁面</title> 07 </head> 08 09 <body> 10 <center> 11 <table> 12 <tr> 13 <th>主頁面</th> 14 </tr> 15 </table> 16 </center> 17 <jsp:forward page="subPage.jsp" > 18 <jsp:param value="Smith" name="userName"/> 19 <jsp:param value="10086" name="passwd"/> 20 <jsp:param value="北京豐臺" name="address"/> 21 </jsp:forward> 22 </body> 23 </html>
上述代碼中,第2行設置請求編碼,第17行使用<jsp:forward>動作,第18~20行使用<jsp:param>參數
----------------------- subPage.jsp-------------------------- 01 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>○3 02 <% 03 String userName= request.getParameter("userName"); 04 String passwd= request.getParameter("passwd"); 05 String address= request.getParameter("address"); 06 System.out.println(address); 07 %> 08 <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 09 <html> 10 <head> 11 <title>子頁面</title> 12 </head> 13 <body> 14 <center> 15 <table> 16 <tr> 17 <th>子頁面:人員信息</th> 18 </tr> 19 </table> 20 </center> 21 <center> 22 <table> 23 <tr> 24 <td>用戶名:<%=userName%></td> 25 </tr> 26 <tr> 27 <td>密 碼:<%=passwd%></td> 28 </tr> 29 <tr> 30 <td>用戶地址:<%=address%></td> 31 </tr> 32 </table> 33 </center> 34 </body> 35 </html>
上述代碼中,第2~7行代碼獲取主頁面傳遞的參數值,第22~30行顯示獲取的參數值,頁面效果如圖3.8所示。

圖3.8 <jsp:param>與<jsp:forward>結合使用運行結果
從上述例子可以看出,<jsp:param>在<jsp:include>、<jsp:forward>中的用法基本一樣,只是將<jsp:include>替換成<jsp:forward>動作就可以。
- PWA入門與實踐
- Python量化投資指南:基礎、數據與實戰
- 零起步玩轉掌控板與Mind+
- Three.js開發指南:基于WebGL和HTML5在網頁上渲染3D圖形和動畫(原書第3版)
- 機械工程師Python編程:入門、實戰與進階
- HTML5 APP開發從入門到精通(微課精編版)
- CRYENGINE Game Development Blueprints
- Python大規模機器學習
- C語言從入門到精通
- The Statistics and Calculus with Python Workshop
- 大規模語言模型開發基礎與實踐
- 自己動手構建編程語言:如何設計編譯器、解釋器和DSL
- MySQL從入門到精通
- PHP高性能開發:基礎、框架與項目實戰
- Flutter for Beginners