<%@include%>、<jsp:include>、<jsp:forward>、sendredirect 的區別

1、include指令
    作用:把多個文件中需要共享的代碼放在單獨的文件中,然後在需要的時候使用該指令引入這個文件。典型的應用,把網站的頭部和版權信息放在單獨的文件中,在其他文件中包含這兩部分。
    基本的語法格式:
        <%@ include file="目標文件"%>
    file屬性指出目標文件。
    例:把index.jsp和register.jsp中的共同部分做成單獨的文件header.jsp(後綴名不一定是.jsp),然後在index.jsp和register.jsp中調用。
    header.jsp中的內容如下:

<%@ page contentType="text/html;charset=gb2312"%>
<table  align="center" width=780>
   <tr height="100">
      <td align="center"><h1>電子書店</h1></td>
   </tr>
   <tr>
      <td align="center">
         <!-- 超鏈接的基本格式  -->
         <a href="register.jsp">註冊</a> 
         最新圖書 最暢銷圖書 查詢圖書 修改密碼 查詢訂單 購物車</td>
   </tr>
   <tr>
      <td><hr></td>
   </tr>

在index.jsp中引入header.jsp的代碼:
<%@ page contentType="text/html;charset=gb2312"%>

<%@ include file="header.jsp"%>

   <tr>
      <td>
         <table>
             <tr>
                 <td>
                     <!--登錄界面代碼-->
                     <form action="login_process.jsp" method="post">
                        <!-- 主要是涉及提交信息,就要用到form,action決定了提交給哪個文件處理 -->
                        用戶名:<input type="text" name="username" value="aaa"> <br>
                        口令:<input type="password" name="userpass" value=""> <br> 
                        <input type="submit" value="登錄"><input type="reset" value="重寫">
                     </form>
                 </td>
                 <td>
                      歡迎光臨我們的書店!
                 </td>
             </tr>
         </table>
      </td>
   </tr>
</table>
 
運行過程:在轉換的時候,當遇到include指令的時候會把include指令指向的目標文件的內容拷貝到當前位置,替換include指令,這樣最後形成一個文件。然後才編譯形成class文件,然後運行。

2、<jsp:forward>標籤

   我們使用登錄功能的模擬來介紹。
   首先,使用Java代碼完成判斷,使用<jsp:forward>完成跳轉,代碼:
<%@ page contentType="text/html;charset=gb2312"%>

<%
   // 先獲取用戶輸入的用戶名和口令,然後判斷是否合法
   String username = request.getParameter("username");

   String userpass = request.getParameter("userpass");

   if(username.equals("zhangsan") && userpass.equals("zhangsan"))
   {
%>

       <jsp:forward page="success.jsp"/>
<%
   }else{
%>
       <jsp:forward page="index.jsp"/>
<%
   }
%>

   注意:不管跳轉到success.jsp還是index.jsp,地址欄都是處理文件的名字。
   <jsp:forward>的語法格式:
       <jsp:forward page="目標文件"/>
   page屬性指出轉向的目標文件。最後的結束符爲“/>”,斜槓不能省略。

   另外一個可以完成跳轉的方式是採用response.sendRedirect()。response和request一樣,都是內容對象,可以直接訪問。修改上面的文件:
<%@ page contentType="text/html;charset=gb2312"%>

<%
   // 先獲取用戶輸入的用戶名和口令,然後判斷是否合法
   String username = request.getParameter("username");

   String userpass = request.getParameter("userpass");

   if(username.equals("zhangsan") && userpass.equals("zhangsan"))
   {
       response.sendRedirect("success.jsp");
   }else{
       response.sendRedirect("index.jsp");
   }
%>

   <jsp:forward>和response.sendRedirect的運行效果相同(針對上面的這個例子)。
   相同點:都是轉向目標文件。
   不同點:地址欄中顯示的內容是不相同的,如果使用<jsp:forward>,地址欄顯示當前文件的名字,如果使用response,地址欄顯示的是轉向後的文件的名字。執行過程不同:使用<jsp:forward>相當於一次請求,使用response相當於兩次請求。
   使用<jsp:forward>的情況:
   index.jsp中輸入用戶名和口令,提交給login_process.jsp,服務器保存用戶的輸入信息,使用<jsp:forward>轉向success.jsp之後,success.jsp還可以訪問用戶輸入的信息,因爲輸入同一次請求。
   使用response的請求:
   index.jsp中輸入用戶名和口令,提交給login_process.jsp,服務器保存用戶的輸入信息,使用response的sendRedirect方法相當於重新向服務器發送一次請求,這樣上次的請求內容(用戶名和口令)就不能共享了。
   
3、<jsp:include>標籤
   把index.jsp中<%@ include="header.jsp"%>替換成<jsp:include page="header.jsp"/>
   從運行效果上相同。
   不同點:1、兩個文件,目標文件是單獨運行的,當前文件運行到<jsp:include>標籤的時候,轉向執行標籤所指向的目標文件,執行之後返回繼續標籤之後的內容。
   2、<%@ include%>指令是在編譯(轉換)的時候使用,<jsp:include>在運行的時候起作用。

   程序中如何選用:要導入的內容是不是每次都執行,如果每次都執行的話,應該使用<%@ include%>,如果是在特定的條件下,應該使用<jsp:include>。例如,登錄之後要麼轉向success.jsp要麼轉向index.jsp,如果在程序中使用導入,應該用<jsp:include>。

4、<jsp:include>和<jsp:forward>區別

   把login_process.jsp中的<jsp:forward>替換成<jsp:include>:
<%@ page contentType="text/html;charset=gb2312"%>

<%
   // 先獲取用戶輸入的用戶名和口令,然後判斷是否合法
   String username = request.getParameter("username");

   String userpass = request.getParameter("userpass");

   if(username.equals("zhangsan") && userpass.equals("zhangsan"))
   {
%>

       <jsp:include page="success.jsp"/>
<%
   }else{
%>
       <jsp:include page="index.jsp"/>
<%
   }
%>
    運行效果是相同的。但是有不同點,修改代碼如下:
<%@ page contentType="text/html;charset=gb2312"%>
處理文件的前半部分<br>
<%
   // 先獲取用戶輸入的用戶名和口令,然後判斷是否合法
   String username = request.getParameter("username");

   String userpass = request.getParameter("userpass");

   if(username.equals("zhangsan") && userpass.equals("zhangsan"))
   {
%>

       <jsp:include page="success.jsp"/>
<%
   }else{
%>
       <jsp:include page="index.jsp"/>
<%
   }
%>
<br>處理文件的後半部分

兩次運行結果不相同。
分析原因:
   <jsp:forward>:先執行標籤之前的內容,遇到標籤的時候轉向執行目標文件,執行完不返回,顯示的內容爲目標文件的內容,標籤之前的內容執行,但是不顯示。標籤之後的內容不會執行,當然更不會顯示。
   <jsp:include>:先執行標籤之前的內容,遇到標籤轉向執行目標文件,執行完返回,繼續執行標籤之後的內容,顯示的內容爲:標籤之前的內容+目標文件的內容+標籤之後的內容,標籤的前後都執行,都顯示。

        總之<%@include file=“”%>和<jsp:include page=“”>的區別在於前者將頁面包括進來,後者是當執行時纔將頁面包括進來,前者在編譯期使用,後者在運行期使用,後者執行之後回來繼續執行下面的代碼

     <jsp:include page="">和<jsp:forward page="">的區別在於前者運行顯示的內容爲 標籤之前的內容+目標文件內容+ 標籤之後內容,而後者是當執行的標籤時直接轉入標籤,標籤之前內容雖然會執行,但是不表現出來,目標文件執行完之後也不返回

    <jsp:forward page="">和sendredirect在於前者可以將本頁面的request和response傳入目標文件,但是後者不行

前者相當於一次請求,後者相當於兩次請求

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/JavaEETeacher/archive/2007/12/13/1932447.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章