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.linuxidc.com");
用於將請求重定向到其它的資源或域上。
10、怎樣在一個Servlet的上下文獲取另一個Servlet的信息?
使用setAttribute()方法可以獲取另一個Servlet的信息:
Context.setAttribute("name", "value")
Context.getAttribute("name")