從外地回來,入職了一家新的公司有一年了,畢竟是在家鄉,時間過的就是快,以前做安卓和webapp,后來到新公司轉成JavaWeb,一直想出一系列基礎的教程,希望和小朋友們一起學習,也順便記錄自己的一路心酸,在次感謝我IT行業的引路人棋子老師,是他在我大學期間教會了我android,不然我還徘徊在R包導錯的階段,感謝我的老師是他教會了x5,感謝新公司的老倪,才知道人生的艱難,我會不定期的出一些基礎的教程,主要想讓大家知道整個web程序的運作流程,而不是只是會使用,我也在整理我新的項目架構,涉及到代碼生成器,單點登錄,權限控制。。。請大家多多交流
1.什么是Servlet
Servlet是一個運行在web服務器中的Java小程序,Servlet將會接受和響應來自web客戶端的請求,使用HTTP(超文本傳輸協議)進行通信。
2.重要性
Servlet是所有web應用程序的核心類,它是唯一可以直接處理請求和響應用戶請求,也可以將處理的請求委托給其他應用程序中的其他部分的類,除非莫些過濾器提前終止了客戶端的請求。
3.servlet的生命周期最為重要的三個方法,它們每個都由servlet實現,并且在特定的時間內調用:
(1) void init(ServletConfig)
(2) void service(ServletRequest,ServletResponse)
(3) void destory()
> 1)默認的情況下,web容器的某個servlet接收到第一個請求時,就創建了servlet,也可以在web.xml中對servlet進行配置,使服務器啟動的時候就創建
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.jinbei.controller.Helloservlet</servlet-class>
** <load-on-startup>1</load-on-startup>**
</servlet>
加粗的代碼指示web容器在應用程序啟動以后立即啟動Servlet,如果多個Servlet都包含了該標簽,它們按照標簽內的值大小啟動,越大越晚啟動,如果兩個或者多個Servlet都包含了該標簽,并且配置都相同,則按照他么在描述文件中出現的順序啟動
2)當web容器創建完servlet,馬上會調用init(ServletConfig)進行初始化,該方法在整個生命周期中只調用一次
3)初始化完成以后,可以接受客戶端對請求,servlet就會被調用一次,web容器調用service方法來實現,該方法每處理一次請求就會被調用一次,可以被調用N次,因為Servlet是單例,每次服務器接受到一個servlet請求到時候,服務器便會創建一個新到線程并且調用服務,所以可能存在著一個Servlet對象可能會被多次請求在同一個時刻,這里存在著線程不安全的現象
4.Servlet 映射到Url
(1)同一個Servlet可以被映射到多個 URL上:
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/jinbei</url-pattern>
<url-pattern>/greeting</url-pattern>
<url-pattern>/helloing</url-pattern>
</servlet-mapping>
(2)在Servlet映射到URL中也可以使用×通配符,但是有兩種固定的格式:
一種格式是“.擴展名”,另一種格式是以正斜杠(/)開頭并且以"/"結尾,如下所示:
<servlet-mapping>
<servlet-name>AnyName</servlet-name>
<url-pattern>.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AnyName</servlet-name>
<url-pattern>/action/</url-pattern>
</servlet-mapping>
通俗意義上來講一般分為2種寫法:
一種是精確匹配如:
>/jinbei http://localhost:8080/ProjectName/jinbei
> / xxx/jinbei http://localhost:8080/ProjectName/xxx/jinbei
另一種是模糊匹配如:
> /* http://localhost:8080/ProjectName/任意路徑
> /test/* http://localhost:8080/ProjectName/test/任意路徑
> .后綴名 http://localhost:8080/ProjectName/任意路徑.do
(3)當第一個請求發送到servlet容器的時候,容器先會將請求的url減去當前應用上下文的路徑作為作為映射url,比如訪問的是http://localhost/demo/jinbei,我的應用上下文是demo,容器會將http://localhost/demo去掉,剩下的/jinbei將會拿做servlet的映射匹配
ps:不能同時的使用兩種模糊匹配 比如/test/.do是非法的路徑
當輸入的URL有多個servlet同時被匹配的情況下 :
精確匹配優先(長得最像優先被匹配)
以綴名結尾的模糊url-pattern優先級別最低
5.HttpServletRequest的使用
. HttpServletRequest 接口是對ServletRequest的擴展,HttpServletRequest 對象代表客戶端的請求,當客戶端通過HTTP協議訪問服務器的時候,HTTP請求頭中的所有信息都封裝在這這個對象中,通過這個對象提供的方法,可以獲取http請求的詳細信息 ,以下是常用的方法:
getRequestURL:返回客戶端創建請求的完整路徑,包含了協議(http或https),服務器的名稱,端口號和服務器的路徑,但不包含查詢字符串,如下:
http://www.jinbei6.com/getcouponlist/getCouponssList?number=1&state=0
返回的http://www.jinbei6.com/getcouponlist/getCouponssListgetRequestURI:只返回URL中服務器的路徑部分,返回的是:
/getcouponlist/getCouponssList
getServletPath:返回是用于匹配的Servlet映射的URL部分:/jinbei
getQueryString :返回請求行中的參數部分
getRemoteAddr:返回發出請求客戶機的IP地址
getRemoteHost:返回請求客戶機的完整的主機名
-
getMethod:得到客戶機請求的方式
1)獲取客戶端請求頭的消息方法
getheader(String name) //用來獲取想要的頭部信息- 獲取所有頭的方法
getheaders(String name)
3)獲取頭部信息 的名字和值
getHeadersNames()4)獲得客戶端請求的參數
getParameter(String) 返回參數的的單個值,如果參數是多個,getParameter將返回的是第一個值,而getParameterValues返回參數值的數組 ,如果參數只有一個將返回只有一個元素的數組,方法getParamaterMap將返回一個包含了所有參數名值對的 java.util.Map<String,String[]>,而getParameterNames方法將返回所有可用參數名字的枚舉; - 獲取所有頭的方法