天天看點

Servlet的請求HttpServletRequest一、從容器到HttpServlet

  web容器做的事情就是,建立Servlet執行個體,并完成Servlet的名稱注冊及URL模式的對應。在請求來到時,web容器會轉發給正确的Servlet來處理請求。

  當請求來到http伺服器時,而http伺服器轉交請求給容器時,容器會建立一個代表檔次請求的HttpServletRequest對象,并将請求相關資訊設定給該對象。同時,容器會建立一個HttpServletResponse對象,作為稍後要對用戶端進行相應的java對象。

     

Servlet的請求HttpServletRequest一、從容器到HttpServlet

  接着,容器會根據讀取的@webServlet标注或者xml的設定,找出處理該請求的servlet,調用它的service()方法,将建立的HttpServletRequest對象、HttpServletResponse對象傳入作為參數,service()方法中會根據HTTP請求的方式,調用對應的doXXX()方法。接着再doXXX()方法中,可以使用request、resposne對象,如:getParameter()取得請求參數,使用getWriter()取得輸出用的PrintWriter對象,并進行各項響應處理。對PrintWriter做的輸出操作,最後由容器轉換為HTTP響應,再由HTTP伺服器對浏覽器響應。之後容器将對象銷毀。

    

Servlet的請求HttpServletRequest一、從容器到HttpServlet

  String username = request.getParameter("name");指定請求參數名稱來取得對應的值。如果傳來的是"123"這樣的字元串值,必須使用Integer.parseInt()這類方法剖析為基本類型。

  String[] values = request.getParameterValues("param");就像param=10&param=20&param=30,此時用getParameterValues()取得一個String數組。

  如果想要知道請求中有多少請求參數,則可以使用getParameterNames()方法,會傳回一個Enumeration對象。

    Enumeration<String> e = request.getParameterNames();

    while(e.hasMoreElements()){

      String param = e.nextElement();

      ...

    }

  對于HTTP标頭的資訊(Header),可以通過以下方法取得:

    1、getHeader():使用方式與getParameter類似。

    2、getHeaders():與getParameterValues類似。

    3、getHeaderNames():與getParameterNames類似。

  以下的執行個體如何取得并顯示浏覽器送出的标頭資訊。

Servlet的請求HttpServletRequest一、從容器到HttpServlet
Servlet的請求HttpServletRequest一、從容器到HttpServlet

HeaderServlet

  運作結果:

Servlet的請求HttpServletRequest一、從容器到HttpServlet

  getReader()方法,可以取得一個BufferedReader對象,可以讀取Body資料。

  例子1:讀取請求Body内容

Servlet的請求HttpServletRequest一、從容器到HttpServlet
Servlet的請求HttpServletRequest一、從容器到HttpServlet

BodyServlet

Servlet的請求HttpServletRequest一、從容器到HttpServlet
Servlet的請求HttpServletRequest一、從容器到HttpServlet

form.html

 在名稱字段上輸入“良葛格”,密碼上輸入“123456”,單機送出按鈕,得到:

Servlet的請求HttpServletRequest一、從容器到HttpServlet

  Servlet3.0中,新增了Part接口,可以友善進行檔案上傳處理。可以通過request對象的getPart()方法取得Part對象。

  例1:上傳檔案到指定目錄。

Servlet的請求HttpServletRequest一、從容器到HttpServlet
Servlet的請求HttpServletRequest一、從容器到HttpServlet

UploadServlet.java

Servlet的請求HttpServletRequest一、從容器到HttpServlet
Servlet的請求HttpServletRequest一、從容器到HttpServlet

upload.html

  在Tomcat中必須設定@MultipartConfig标注才能使用getPart()相關API。@MultipartConfig也可以設定屬性,比如location。@MultipartConfig(location="c:/workspace"),則上例子就可以修改為:

Servlet的請求HttpServletRequest一、從容器到HttpServlet
Servlet的請求HttpServletRequest一、從容器到HttpServlet

  如果有多個檔案要上傳,可以使用getParts方法,這回傳回一個Collection<Part>,其中是每個上傳檔案的part對象。  

  例子2:上傳多個檔案

Servlet的請求HttpServletRequest一、從容器到HttpServlet
Servlet的請求HttpServletRequest一、從容器到HttpServlet

UploadServlet2.java

Servlet的請求HttpServletRequest一、從容器到HttpServlet
Servlet的請求HttpServletRequest一、從容器到HttpServlet

multi-upload.html

  在web應用程式中,經常需要多個Servlet來完成請求。例如,将另一個Servlet的請求處理流程包含進來,或者将請求轉發forward給别的servlet處理。可以使用:

    RequestDispatcher dispatcher = request.getRequestDispatcher("some.do");

  (1)、使用include()方法

    将另一個servlet的操作流程包括至目前的servlet操作之中。

    例1:include方法

Servlet的請求HttpServletRequest一、從容器到HttpServlet
Servlet的請求HttpServletRequest一、從容器到HttpServlet

some.java

Servlet的請求HttpServletRequest一、從容器到HttpServlet
Servlet的請求HttpServletRequest一、從容器到HttpServlet

othersome.java

   運作結果:網頁上看到響應順序是Some do one ... Other do one... Some do two.. .    

  (2)、使用forward()方法

    将處理請求轉發給别的Servlet。

    例2:forwod方法

Servlet的請求HttpServletRequest一、從容器到HttpServlet
Servlet的請求HttpServletRequest一、從容器到HttpServlet

HelloController.java

Servlet的請求HttpServletRequest一、從容器到HttpServlet
Servlet的請求HttpServletRequest一、從容器到HttpServlet

HelloModel.java 

Servlet的請求HttpServletRequest一、從容器到HttpServlet
Servlet的請求HttpServletRequest一、從容器到HttpServlet

HelloView.java

  運作結果:(Model2架構)

Servlet的請求HttpServletRequest一、從容器到HttpServlet

當神已無能為力,那便是魔渡衆生