1. 程式人生 > >Servlet初學總結

Servlet初學總結

1.Servlet是相對於applet的,伺服器端的小程式。

2.Servlet的特點

移植性好,本身是一個Java類,具有跨平臺性;

Java EE平臺支援的全部Java API都可用於Servlet;

安全性提高,伺服器崩潰的可能性減小;

多個Servlet可以組織在一起,輸出可由組生成,有助於程式碼複用;

可以與伺服器中的其它元件互動。

3.GET和POST的區別:

比較內容

GET

POST

是否在瀏覽器位址列顯示?

顯示

不顯示,保密性好

資料放置的位置

作為請求資源的一部分放置在請求行中

放置在請求內容(即請求體)中

傳輸資料量有無限制?

一般在1KB以下

無限制

GET方式的請求引數檢視:在瀏覽器位址列

POST方式的請求引數檢視:在開發者模式:

4.除錯使用Servlet的完整步驟:

(1)繼承HttpServlet抽象類;

(2)覆蓋HttpServlet的部分方法(如:doGet()、doPost());

(3)獲取Http請求資訊;

(4)生成Http響應資訊; 繼承httpservlet抽象類 覆蓋方法doget() dopost()

(5)配置對映路徑; 獲取http請求資訊 生成http響應資訊 配置對映路徑 觸發

(6)觸發Servlet執行; servlet執行 跟蹤斷點除錯

(7)跟蹤斷點除錯。

5.在Eclipse中建立Servlet類,有兩種方式:

A.建立Java類,通過繼承HttpServlet抽象類; 繼承httpservlet抽象類 嚮導模式

B.嚮導模式,一步一步創建出來。

6.配置Servlet的方式有兩種:

A.傳統的Web.xml的方式; webxml方式 註解方式

B.新式的註解的方式。

7.傳統的Web.xml的方式配置步驟:

A.在web.xml的配置檔案中,先宣告Servlet;

例一:

<servlet>

<servlet-name>ServletDemo</servlet-name> ----定義Servlet的名稱,以便對映引用

<servlet-class>com.ddb.javaweb.servlet.ServletDemo</servlet-class> -----指定Servlet的類

<load-on-startup>1</load-on-startup> ----指定隨容器啟動而啟動

</servlet>

例二:

<servlet>

<servlet-name>dbinit</servlet-name>

<jsp-file>/WEB-INF/initDemo.jsp</jsp-file> ----指定的是jsp檔案

<init-param> ----配置Servlet的初始化引數

<param-name>driver</param-name>

<param-value>org.gjt.mm.mysql.Driver</param-value>

</init-param>

<init-param>

<param-name>url</param-name>

<param-value>jdbc:mysql://localhost:3306/abcd</param-value>

</init-param>

</servlet>

B.然後配置Servlet的對映路徑URL

例一:

<servlet-mapping>

<servlet-name>ServletDemo</servlet-name>

<url-pattern>/servlet/ServletDemo</url-pattern>

</servlet-mapping>

例二:

<servlet-mapping>

<servlet-name>dbinit</servlet-name>

<url-pattern>/config.abcd</url-pattern>

</servlet-mapping>

8.註解配置步驟:

註解使用的位置是:在Servlet類的上面。

依據Eclipse嚮導,會自動生成相應的註解配置,例如: @webservlet @webinitparam

@WebServlet(

value = { "/servlet/InitParameter", "/servlet/abc", "/servlet/cde" },

/*urlPatterns = { "/servlet/InitParameter", "/servlet/abc", "/servlet/cde" },*/

initParams = {

@WebInitParam(name = "institute", value = "職業培訓學院"),

@WebInitParam(name = "major", value = "Java技術"),

@WebInitParam(name = "count", value = "10000")},

loadOnStartup=1)

若想知道@WebServlet註解支援哪些屬性,有兩種方法:

B.利用Eclipse中的JD外掛,在Eclipse原始碼中,按住ctrl鍵,同時將滑鼠移動到@WebServlet上,單擊,開啟反編譯原始碼,檢視擁有的屬性。

9.註解配置與XML的配置方式比較:----不做考試要求

A.兩者基本上完全一樣效果;

B.在註解配置中修改配置,Tomcat可以捕捉並自動載入,XML的配置修改必須重啟Tomcat;

C.對於經常變動的引數,建議使用XML的配置。

10.配置servlet的注意事項:

A.同一個Servlet不要同時存在XML配置和註解配置,

若要同時存在則讓URL不同,URL相同會導致tomcat伺服器啟動失敗。

B.同一個Servlet可以配置多個URL的連結.

11.表單Form的action的URL為Servlet的連結時,可能會有404錯誤。通常在Servlet的連結前加:

<%=request.getContextPath()%> 下面的例子,可以參考:

action='<%=request.getContextPath()%>/servlet/MyLoginServlet2' 或

action='/JavaWebCore/servlet/MyLoginServlet2'

12.Servlet的生命週期:包括以下4個階段: <%=request。getcontextPath()%>

載入和例項化 載入和例項化 初始化init()

初始化:呼叫init()方法 請求處理 service()

請求處理:呼叫service()方法 服務中止 destroy()

服務終止:呼叫destroy()方法

13.Servlet容器負責載入和例項化,是否在容器啟動時自動載入Servlet,這由在web.xml中設定的<load-on-startup>屬性決定:

14.對於每一個Servlet例項來說,只初始化一次。GenericServlet提供了兩種形式的init()方法:

public void init(ServletConfig config) throws ServletException {

this.config = config; servletException

init();

}

public void init() throws ServletException {

}

對於使用者自己的Servlet,可以重寫init方法,通常使用帶引數的來獲取一些配置資訊。

15.Servlet例項化後接收客戶端請求、作出響應,都是通過呼叫service()方法來實現的。由於Servlet採用多執行緒機制來提供服務,因此,該方法被同時、多次地呼叫。每一個請求都呼叫自己的service()方法,但要注意執行緒安全。

  使用者在實現具體的Servlet時,一般不過載service()方法,web容器在呼叫service()時,會根據請求方式的不同自動呼叫doGet()、doPost()、doPut()、doDelete()中的一種或幾種,因此,只要過載對應的doXxx()即可。

16.伺服器通過呼叫destroy方法釋放Servlet執行時所佔用的資源,web容器有可能崩潰或者暴力終止,destroy()方法不一定總被執行。

17.Servlet在初始化時,web容器會從web.xml提取初始化引數和Servlet名稱生成ServletConfig物件,它還會建立ServletContext物件(執行時環境的資訊)並存儲到ServletConfig中。

初始化引數,可以是存在XML裡面的配置,也可以是存在註解裡面的配置。例如:

ServletConfig config=getServletConfig();

  String myInstitute=config.getInitParameter(“institute”);

  String mymajor=config.getInitParameter(“major”);

18.Servlet-API:

public class InitServletDemo extends HttpServlet

public abstract class HttpServlet extends GenericServlet

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable

19.Tomcat的亂碼問題:----根本原因,編碼和解碼方式不一致!Tomcat預設的字符集為iso-8859-1

A.頁面內容亂碼;

解決方法:讓響應物件在輸出內容前,呼叫下列方法之一 setcharacterencoding()

A1.:setCharacterEncoding(“字符集”)

例如:response.setCharacterEncoding(“UTF-8”);  

A2.setContentType(“文字型別;charset=字符集”) setcontenttype(“”)

例如:response. setContentType(“text/html;charset=UTF-8”);

B.頁面引數亂碼。

解決方法:傳遞中文引數亂碼的解決辦法

B1.在獲取請求物件內容前,呼叫setCharacterEncoding(“字符集”)

request.setCharacterEncoding(“UTF-8”);

B2.建立新的字串,用tomcat的編碼方式get,用新的解碼方式解碼。

String info = request.getParameter("information");

String newinfo=new String(info.getBytes("iso8859_1"),"UTF-8");

20.Servlet的通訊:

A.Servlet與瀏覽器之間的通訊

B.Servlet之間以及Servlet與其它web元件之間的通訊

21.Servlet與瀏覽器之間的通訊:

A.向瀏覽器傳送錯誤訊息

HttpServletResponse定義瞭如下方法:

void sendError(int sc)

void sendError(int sc,String msg)

(其中:sc為出錯狀態碼,msg為錯誤描述字串)

B.瀏覽器重定向

  當原URL永久移動(狀態碼為301)或臨時移動(狀態碼為302)時,瀏覽器要定位到新URL。

有兩種方法實現:

B1.利用HttpServletResponse的setStatus()和setHeader()

void setStatus(int sc)

void setHeader(String name,String value)

B2.利用HttpServletResponse的sendRedirect ()

void sendRedirect(String location)

相當於在位址列中重新輸入一個新URL,這個URL指向的位置沒有限制。

22.Servlet之間以及Servlet與其它web元件之間的通訊

Servlet之間的通訊是通過“請求分派”(request dispatch)來實現的,這一過程包含兩個步驟:

A.獲得即將分派請求的web元件引用

ServletContext 介面中的RequestDispatcher getRequestDispatcher(String path):

引數必須以“/”開始,表示相對於當前上下文根的路徑

ServletContext 介面中的RequestDispatcher getNamedDispatcher(String name):

引數是web.xml中servlet的命名

ServletRequest 介面中的RequestDispatcher getRequestDispatcher(String path):

引數可以“/”開始,表示相對於當前上下文根的路徑;

不以“/”開始,表示相對於當前Servlet的路徑

B.分派請求----呼叫RequestDispatcher物件的兩個

lvoid include(ServletRequest request,  ServletResponse response):

將請求轉發給其它servlet,被呼叫servlet對請求作出響應將併入原先的響應物件中

lvoid forward(ServletRequest request,  ServletResponse response):

將請求轉發給其它servlet,被呼叫servlet對請求作出響應,原先Servlet的執行被中止

23.forward與include方法的比較:

比較內容

forward()

Include()

使用場合不同

將控制權轉移到其它元件

須由另一元件執行部分處理,一旦執行完畢,當前元件將收回控制權

輸出結果不同

在請求轉發之前,web元件不應使用輸出流向客戶端傳送訊息

所有web元件共享同一個輸出流與客戶機進行通訊

相同點

在位址列中只顯示原URL,不顯示新元件的URL

forward與sendRedirect方法的比較: forWord sendredirect

比較內容

forward()

sendRedirect()

執行方式不同

在web容器中執行

需要往返客戶機

執行速度不同

重定向的位置範圍不同

只限制在同一個應用程式範圍內。只顯示原URL,不顯示新元件的URL

可重定向到任何URL上,顯示的是新URL

24.Servlet的執行緒安全問題:

Web容器採用多執行緒模式執行,它為併發的每一個訪問請求都準備了一個獨立的執行緒來響應,這種模式提高了訪問效能,但也可能帶來執行緒的安全問題。當多個請求訪問一個Servlet例項時,就可能對類的成員變數的修改帶來問題。

解決辦法:可選用下列方法之一

A.將類的例項變數改為區域性變數,區域性變數是安全的;

B.將確實需要共享的資源,放在synchronized塊中或將方法定義為synchronized型別,但這樣會影響程式執行效率。