HttpServletRequest 接口、HttpServletResponse 接口、請求轉發與重定向


上篇文章我們講了servlet的基本原理,這章將講一下剩余的部分。

HttpServletRequest 接口

  該接口是 ServletRequest 接口的子接口,封裝了 HTTP 請求的相關信息,由 Servlet 容器創建其實現類對象並傳入 service(ServletRequest req, ServletResponse res)方法中。我們請求的詳細信息都可以通過 HttpServletRequest 接口的實現類對象獲取。這個實現類對象一般都是容器創建的,我們不需要管理。

HttpServletRequest 主要功能

獲取請求參數

1)什么是請求參數?

請求參數就是瀏覽器向服務器提交的數據

2)瀏覽器向服務器如何發送數據

  a)附在 url 后面,如:http://localhost:8989/MyServlet/MyHttpServlet?userId=20

  b)通過表單提交

<form action="MyHttpServlet" method="post">
    你喜歡的足球隊<br /><br />
    巴西<input type="checkbox" name="soccerTeam" value="Brazil" /> 
    德國<input type="checkbox" name="soccerTeam" value="German" />
    荷蘭<input type="checkbox" name="soccerTeam" value="Holland" />
    <input type="submit" value="提交" />
</form>

3)使用HttpServletRequest對象獲取請求參數

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  //一個name對應一個值
  String userId = request.getParameter("userId"); 
  System.out.println("userId="+userId); }

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //一個name對應一組值
    String[] soccerTeams = request.getParameterValues("soccerTeam");
    for(int i = 0; i < soccerTeams.length; i++){
        System.out.println("team "+i+"="+soccerTeams[i]);
    }
}

在請求域中保存數據

數據保存在請求域中,可以轉發到其他Servlet或者jsp頁面,這些Servlet或者jsp頁面就會 從請求中再取出數據

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //將數據保存到request對象的屬性域中request.setAttribute("attrName", "attrValueInRequest");
    //兩個Servlet要想共享request對象中的數據,必須是轉發的關系
    request.getRequestDispatcher("/ReceiveServlet").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //從request屬性域中獲取數據
    Object attribute = request.getAttribute("attrName"); 
    System.out.println("attrValue="+attribute);
}

HttpServletResponse 接口

HttpServletResponse ServletResponse 接口的子接口,封裝了 HTTP 響應的相關信息,由

Servlet 容器創建其實現類對象並傳入 service(ServletRequest req, ServletResponse res)方法中。主要功能:

1)使用 PrintWriter 對象向瀏覽器輸出數據

//通過PrintWriter對象向瀏覽器端發送響應信息
PrintWriter writer = res.getWriter();
writer.write("Servlet response"); writer.close();

2)實現請求重定向

請求轉發與重定向

請求轉發和重定向是 web 應用頁面跳轉的主要手段,應用十分廣泛,所以我們一定要搞清楚他們的區別。

請求轉發:

  1)第一個 Servlet 接收到了瀏覽器端的請求,進行了一定的處理,然后沒有立即對請求進行響應,而是將請求“交給下一個 Servlet”繼續處理,下一個 Servlet 處理完成之后對瀏覽器進行了響應。在服務器內部將請求“交給”其它組件繼續處理就是請求的轉發。對瀏覽器來說,一共只發了一次請求,服務器內部進行的“轉發”瀏覽器感覺不到,同時瀏覽器地址欄中的地址不會變成“下一個 Servlet”的虛擬路徑。

  2)在轉發的情況下,兩個 Servlet 可以共享 Request 對象中保存的數據

  3)轉發的情況下,可以訪問 WEB-INF 下的資源

  4)當需要將后台獲取的數據傳送到 JSP 上顯示的時候,就可以先將數據存放到 Request 對象中,再轉發到 JSP 從屬性域中獲取。此時由於是“轉發”,所以它們二者共享 Request 對象中的數據。

public class ForwardServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("forwardServlet  doGet");

        //請求的轉發
        //1.調用HTTPServletRequest 的getRequestDispatcher()方法獲取RequestDispatcher對象
        //調用getRequestDispatcher()方法時需要傳入轉發的地址
        String path = "testServlet";

        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/"+path);
        //2.調用調用HTTPServletRequest 的forward(request,response)進行請求的轉發
        requestDispatcher.forward(request,response);
    }
}

請求重定向:

  1)第一個 Servlet 接收到了瀏覽器端的請求,進行了一定的處理,然后給瀏覽器一個特殊的響應消息,這個特殊的響應消息會通知瀏覽器去訪問另外一個資源,這個動作是服務器和瀏覽器自動完成的,但是在瀏覽器地址欄里面能夠看到地址的改變,會變成下一個資源的地址。

  2)對瀏覽器來說,一共發送兩個請求,所以用戶是能夠感知到變化的。

  3)在重定向的情況下,不能共享 Request 對象中保存的數據。

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("RedirectServlet doGet");

        //執行請求的重定向,直接調用reponse.sendRedirect(path)方法
        //path為重定向的地址
        String path = "testServlet";
        response.sendRedirect(path);
    }
}

轉發與重定向的區別:

 

轉發

重定向

瀏覽器地址欄

不會變化

會變化

Request

同一個請求

兩次請求

API

Request 對象

Response 對象

位置

服務器內部完成

瀏覽器完成

WEB-INF

可以訪問

不能訪問

共享請求域數據

可以共享

不可以共享

目標資源

必須是當前 Web 應用中的資源

不局限於當前 Web 應用

 


圖解轉發和重定向

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM