天天看點

Java Servlet關鍵點詳解Java Servlet關鍵點詳解

版權聲明:本文為部落客chszs的原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/chszs/article/details/45934503

Java Servlet關鍵點詳解

作者:chszs,轉載需注明。部落格首頁: http://blog.csdn.net/chszs

1、了解Servlet的生命周期

Servlet引擎控制着Servlet的生命周期

Servlet的生命周期由以下三個方法進行描述(五個生命周期階段)

1)初始化 init(ServletConfig obj)

2)服務 service(servletRequest, servletResponse)

3)銷毀 destroy()

在Servlet生命過程中發生一些事的話,Servlet引擎會調用Servlet執行個體上的這些方法進行處理。

2、什麼是ServletConfig

Servlet使用請求參數來接受來自用戶端的資料,以便處理請求。

一些特定的資料必須在Servlet初始化時提高給Servlet,這些資料專門針對某些用戶端,但這些資料不是用戶端通過請求參數提供的。

在Servlet初始化期間,使用初始化參數提供資料給Servlet,初始化參數是在Web部署描述符(web.xml)中設定的。

Servlet在運作期間都可以通路這些參數。

從一請求到另一請求,請求參數是可以發生改變的。

從一Servlet到另一Servlet,初始化參數也是可以發生改變的。

3、什麼是ServletContext

可以在一個Servlet容器中部署多個Web應用。

每一個Web應用都在單獨的環境中包含了自己的資源,這個單獨的環境稱之為Web應用的上下文或者叫ServletContext。

屬于某個Web應用上下文的資源對于另一個Web應用的上下文來說,是無效的。

一個Servlet上下文包含了零到多個Servlet,針對每一個Servlet對象,Servlet容器都為之建立了單獨的ServletConfig對象。

4、在Servlet中可以定義構造方法嗎

是的。在Servlet這可以定義構造方法,但是我們不能顯式地調用此構造方法,因為這是Servlet容器的工作。Servlet容器會建立Servlet對象,構造方法當然也由Servlet容器調用。

5、可以在Servlet的初始化init()方法内調用destroy()方法嗎?會發生什麼事?

是的,可以在Servlet的初始化init()方法内調用destroy()方法。

實際上,如果在init()方法中無事可做的話,容器會自動調用destroy()方法。

如果我們重寫destroy()方法,并在init()方法中調用,那麼destroy()方法将會得到執行。

6、GenericServlet和HttpServlet有何不同?

1)GenericServlet

是抽象類;它獨立于協定;是Servlet類的子類;支援public void service(ServletRequest req,ServletResponse res)方法。

2)HttpServlet

也是抽象類;它依賴于Http協定;是GenericServlet類的子類;支援public void service()方法以及protected void service()方法、doGet()方法、doPost()方法、doPut()方法、doDelete()方法、doHead()方法、doTrace()方法、doOptions()方法等。

7、doGet()方法和doPost()方法有何不同

1)doGet()方法

完整的方法protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException;

處理的是HTTP GET請求;

請求參數添加到URL後,通過Header資訊發送;

請求參數不能被加密;

使用doGet()方法發送的最大資料長度不能超過240位元組。

2)doPost()方法

完整的方法Protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;

處理的是HTTP POST請求;

請求參數以表單的形式送出;

請求參數可以被加密;

使用doPost()方法發送的資料長度無限制。

8、可以在一個Servlet中調用另一個Servlet嗎?

是的,可以在一個Servlet中調用另一個Servlet,也即衆所周知的Servlet間的通信。

通過使用RequestDispatcher對象可以做到Servlet間的通信。

RequestDispatcher rd=request.getRequestDispatcher("other servlet url name");
rd.forward(req, res);
           

9、forward()方法和sendRedirect()方法有何不同?

1)forward()方法

示例代碼:

request.getRequestDispathcer("example.jsp").
forward(request, response);
           

用于在伺服器域内把請求繼續轉發到可用的資源上。

2)sendRedirect()方法

response.sendRedirect("http://www.instanceofjava.com");
           

用于将請求重定向到其它的資源或域上。

10、怎樣在一個Servlet的上下文擷取另一個Servlet的資訊?

使用setAttribute()方法可以擷取另一個Servlet的資訊:

Context.setAttribute("name", "value")
Context.getAttribute("name")