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型別,但這樣會影響程式執行效率。