From Gossip@caterpillar

JSP/Servlet: Servlet/JSP 的物件對應



在JSP中可以使用 request、response、session 等等的隱含物件,這些隱含物件在轉換為Servlet之後,會對應於Servlet中的一些型態,這在之前談論隱含物件時曾經說明過,如果您會使用隱含物 件,並瞭解如何撰寫Java程式,那麽您對於在Servlet中如何使用相對應的物件並不困難,在這邊則只看看如何在Servlet中取得這些對應的物 件,然後您可以回顧一下之前介紹過的JSP隱含物件,瞭解這些物件可以如何應用。

request對應於HttpServletRequest,而response對應於HttpServletResponse,如果您繼承 HttpServlet,在Container呼叫Servlet的service()方法,或是接下來的doXXX()等方法,都會以這兩個物件作為參 數傳入:
 service(HttpServletRequest req, HttpServletResponse res)
 doGet(HttpServletRequest req, HttpServletResponse res)
 doPost(HttpServletRequest req, HttpServletResponse res)
 ....
 

application 對應于 ServletContext,在繼承GenericServlet或其子類別,您可以使用getServletContext()方法取得其實例。

config 對應于 ServletConfig,在繼承GenericServlet或其子類別,您可以使用getServletConfig()方法取得其實例。

session 對應於 HttpSession,在Servlet中要取得HttpSession物件,您可以由HttpServletRequest物件取得,例如:

 public void doGet(HttpServletRequest req,
                   HttpServletResponse res)
                      throws ServletException, IOException {
    HttpSession session = req.getSession();

    // ....
}
 
req.getSession()其實是req.getSession(true)在Servlet 2.1之後提供的方便用法,當getSession()中設定的是true時,表示目前如果有有效的HttpSession物件,則傳回該物件,如果沒有 有效的HttpSession物件,則建立一個新的HttpSession物件,如果getSession()中的參數設定為false,則在沒有有效 HttpSession物件的情況下,不建立新的HttpSession物件,直接傳回null。

另外,在JSP中可以方便的使用<jsp:forward>或<jsp:include>來轉發或包含另一個資源,以達成 request與response的控制權轉移,在Servlet中,這則是透過實作RequestDispatcher介面的物件來達成,例如,若您要 轉發(或包括)一個請求與回應則必須這麽作:
public void doGet(HttpServletRequest req,
                   HttpServletResponse res)
                      throws ServletException, IOException {
    // ....
    RequestDispatcher dispatcher =
                 req.getRequestDispatcher("other.jsp");
    dispatcher.forward();  
    // dispatcher.include();  如果要 include 的話用這個
    // ....
}
 
forward與sendRedirect()的作用有些類似,主要的差別在於forward的動作完全在伺服器內完成,它是將request與 response的控制權轉移給另一個資源,由該資源直接回應用戶端,在轉發之前您可以對request作一些前置處理,然後再由另一個資源作 response,而sendRedirect()則必須與用戶端溝通,告知其重新要求指定的資源。