servlet 簡介
1.servlet叫什么
Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程序或服務連接器,用Java編寫的服務器端程序,主要功能在于交互地瀏覽和修改數據,生成動態Web內容。
狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般情況下,人們將Servlet理解為后者。Servlet運行于支持Java的應用服務器中。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet值用來擴展基于HTTP協議的WEB服務器。
2.servlet是什么
java Servlet 是運行在web服務器或應用服務器上的程序,它是作為來自Web瀏覽器或其他HTTP客戶端的請求和HTTP服務器上的數據庫或應用程序之間的中間層。
3.Servlet架構
下圖顯示了 Servlet 在 Web 應用程序中的位置。
4.Servlet包
Java Servlet 是運行在帶有支持Java Servlet 規范的解釋器的web服務器上的Java類
5.Servlet生命周期
init()->service(){doget() ?dopost() 等}-> ? destroy()
如果有service()被重寫則就不會調用 doget()/dopost()
瀏覽器關閉不會調用destroy(),這有服務器關閉才會關閉destroy()
6.中文亂碼問題
注意:如果表單提交的數據中有中文數據則需要轉碼:
String name=newString(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
7.Servlet異常處理
當一個 Servlet 拋出一個異常時,Web 容器在使用了 exception-type 元素的web.xml中搜索與拋出異常類型相匹配的配置。
您必須在 web.xml 中使用error-page元素來指定對特定異常或 HTTP狀態碼作出相應的 Servlet 調用。
8.<load-on-startup> ? </load-on-startup>
只要不為0或者不為空,就是表示啟動的時候執行
9.亂碼問題
首先為什么會出現亂碼呢?
解決get亂碼問題。。因為,我們在提交數據的時候是UTF-8類型的數據 而是通過數據流的形式到doget,那么數據流tomcat設置的是ISO-8859-1? ?的字符形式。所以自然就出現亂碼現象。那么怎么解決呢?首先到tomcat的server.xml中<Connector>中設置 URIEncoding="UTF-8"。就可以解決get請求的方法。但post的請求改變不了。
解決post亂碼問題。在dopost中加一個 request.setCharacterEncoding("UTF-8");。
以后編程的時候都是用過濾器來解決亂碼問題。
問題筆記。
1.如果沒設置web.xml內容可以,web項目可以打開嗎?
可以,但必須要頭標簽,因為創建web.xml必須有xml標記頭,要不然找不到默認的啟動網頁。
參考網頁(http://www.cnblogs.com/hxsyl/p/3435412.html)
2.如果沒創建web.xml,web可以運行嗎?為什么?
可以。因為對于tomcat來說,當你只指定一個web的根名,沒有指定具體頁面,去訪問時一個web時,如果web.xml文件中配置了歡迎頁,那么就返回指定的那個頁面作為歡迎頁,而在文中沒有web.xml文件,或雖然有web.xml,但web.xml也沒指定歡迎頁的情況下,它默認先查找index.html文件,如果找到了,就把index.html作為歡迎頁還回給瀏覽器。如果沒找到index.html,tomcat就去找index.jsp。找到index.jsp就把它作為歡迎頁面返回。而如果index.html和index.jsp都沒找到,又沒有用web.xml文件指定歡迎頁面,那此時tomcat就不知道該返回哪個文件了,它就顯示The requested resource (/XXX) is not available(我就出現過這個問題)的頁面。其中XXX表示web的根名。但如果你指定了具體頁面,是可以正常訪問的。
參考網頁(http://www.cnblogs.com/hxsyl/p/3435412.html)
3.web.xml 配置文件的加載順序是什么?
在項目中總會遇到一些關于加載的優先級問題,近期也同樣遇到過類似的,所以自己查找資 料總結了下,下面有些是轉載其他人的,畢竟人家寫的不錯,自己也就不重復造輪子了,只 是略加點了自己的修飾。 首先可以肯定的是,加載順序與它們在 web.xml 文件中的先后順序無關。即不會 因為 filter 寫在 listener 的前面而會先加載 filter。最終得出的結論是:listener -> filter -> servlet? 。如果某個會話在一定時間內未被訪問,服務器可 以拋棄它以節省內存。可通過使用HttpSession的setMaxInactiveInterval方法明確設置單個會話對 象的超時值,或者可利用session-config元素制定缺省超時值。
參考網頁(http://www.cnblogs.com/hxsyl/p/3435412.html)
4.請求servlet容器時候,servlet ? servlet-mapping 的順序?
摘錄某個工程的 web.xml 文件片段:
訪問順序為1—>2—>3—>4,其中2和3的值必須相同。
url-pattern 標簽中的值是要在瀏覽器地址欄中輸入的 url,可以自己命名,這個 url 訪問名為 servlet-name 中值的 servlet,兩個 servlet-name 標簽的值必須相同,因為通過 servlet 標簽中的 servlet-name 標簽映射到 servlet-class 標簽中的值,最終訪問 servlet-class 標簽中的 class。
還有,web.xml ??的 / 表示的是http://localhost:8080/ + 工程名
而.jsp頁面的action,加了/表示絕對路徑http://localhost:8080/ ,沒有加
/ 表示的是相對路徑
5.url-pattern 的匹配順序規則?
1.? 寫法
①完全匹配:以“/”開頭,以字母(非“*”)結束
如:/test/list.do
②目錄匹配:以“/”開頭且以“/*”結尾
如:/test/*
/*
③擴展名匹配:以“*.”開頭,以擴展名結束
如:*.do
④ “/” 用來表明對應的Servlet為應用默認的Servlet。在這種情況下Servlet路徑是請求的URI去掉上下文路徑并且路徑信息為null。
2. ?匹配過程
當一個請求發送到servlet容器的時候,容器先會將請求的url減去當前應用上下文的路徑作為servlet的映射url,比如我訪問的是http://localhost/test/aaa.html,我的應用上下文是test,容器會將http://localhost/test去掉,剩下的/aaa.html部分拿來做servlet的映射匹配。這個映射匹配過程是有順序的,而且當有一個servlet匹配成功以后,就不會去理會剩下的servlet了(filter不同,后文會提到)。其匹配規則和順序如下:
1. ? ? 精確路徑匹配。例子:比如servletA 的url-pattern為 /test,servletB的url-pattern為 /* ,這個時候,如果我訪問的url為http://localhost/test ,這個時候容器就會先 進行精確路徑匹配,發現/test正好被servletA精確匹配,那么就去調用servletA,也不會去理會其他的servlet了。
2. ? ? 最長路徑匹配。例子:servletA的url-pattern為/test/*,而servletB的url-pattern為/test/a/*,此時訪問http://localhost/test/a時,容器會選擇路徑最長的servlet來匹配,也就是這里的servletB。
3. ? ? 擴展匹配,如果url最后一段包含擴展,容器將會根據擴展選擇合適的servlet。例子:servletA的url-pattern:*.action
4.如果前面三條規則都沒有找到一個servlet,容器會根據url選擇對應的請求資源(問題7)。如果應用定義了一個default servlet,則容器會將請求丟給default servlet
=================================================
參考網頁(http://tianya23.blog.51cto.com/1081650/1001568)
6.請求給Servlet沒有匹配到,運行機制是什么樣的。
有兩種方式聲明servlet的方式
一。
二。
7.filter過濾的順序是怎么決定?
由? filter-mapping 元素的順序決定了 Web 容器應用過濾器到 Servlet 的順序 。切記配置文件重寫是,需要重新啟動項目才能使用。
8.下圖為什么不能創建HelloWorld??
因為配置過的他創建的時候eclipse會去檢測,檢測到已經存在同名的servlet了當然不給你創建。
9.如果只寫配置文件則會報錯嗎?
會的。報404錯誤。
10.Eclipse新建Servlet時候,不會自動生成mapping到web.xml,而是在代碼中加入注解@WebServlet
參考文章(http://blog.csdn.net/xulianboblog/article/details/51079534)
因為查找文檔發現,這是Servlet3.0新特性(得Tomcat7.0版本及以上),@WebServlet 用于將一個類聲明為 Servlet,該注解將會在部署時被容器處理,容器將根據具體的屬性配置將相應的類部署為 Servlet。該注解具有下表給出的一些常用屬性(以下所有屬性均為可選屬性,但是 value 或者 urlPatterns 通常是必需的,且二者不能共存,如果同時指定,通常是忽略 value 的取值)