官术网_书友最值得收藏!

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>動作就可以。

主站蜘蛛池模板: 大化| 应城市| 土默特右旗| 玉林市| 昆山市| 垫江县| 阿坝| 郴州市| 皮山县| 彭水| 杭锦后旗| 松溪县| 高州市| 台湾省| 肇东市| 五莲县| 随州市| 利川市| 若尔盖县| 瑞安市| 石楼县| 蓬安县| 酒泉市| 开远市| 西昌市| 河池市| 仙游县| 鸡泽县| 温宿县| 恩平市| 利津县| 沛县| 工布江达县| 平乡县| 比如县| 中牟县| 洪湖市| 乌鲁木齐县| 天气| 唐河县| 永济市|