關於servlet的概述和相關示例

servlet是用java編寫的服務器端程序,其主要功能在於交互式的瀏覽和修改數據,生成動態的web內容。狹義的servlet是指java語言實現了一個接口,廣義的servlet是指任何實現了這和個接口的類。


servlet是javaweb的核心程序,是java web的三大組件之一(servlet,filter,listener)

在http請求過程中會把請求參數放入請求行或請求體中,這個參數需要服務器接收解析並處理,servlet就是用來處理這個的過程。

servlet的作用:用來處理客戶端發送過來的請求,並對該請求響應

  1. 獲取接收客戶端發送過來的請求

  2. 處理請求

  3. 將處理結果通過響應發送到客戶端

示例:編寫一個簡單的servlet

1.新建一個java web項目,注意選擇第二個,選擇第一個的要自己手動導servlet包。並部署到服務器。

關於servlet的概述和相關示例

2.為了區分其他項目,我們更改訪問主頁地址:localhost:8080/hello

關於servlet的概述和相關示例

3.新建一個類繼承servlet並重寫基類的方法

關於servlet的概述和相關示例

4.配置web.xml文件信息:

關於servlet的概述和相關示例

同意的class-name是為了通過url(hi)找到所對應的類HelloServlet。

運行結果就是,頁面無顯示,控制檯輸出123:

關於servlet的概述和相關示例關於servlet的概述和相關示例

當然我們也可以通過註解的方式創建servlet,這種方式則不需要手動配置web.xml。:

關於servlet的概述和相關示例

關於HttpServletRequest簡介:

在ServletAPI中定義了一個HttpServletRequest接口,它繼承ServletRequest,專門用於封裝http請求,所以HttpServletRequest請求包含接收請求行,請求頭和請求體的方法

關於servlet的概述和相關示例

示例:

關於servlet的概述和相關示例

關於servlet的概述和相關示例

關於servlet的概述和相關示例

關於servlet的概述和相關示例

示例:

關於servlet的概述和相關示例關於servlet的概述和相關示例

需注意URL:

關於servlet的概述和相關示例關於servlet的概述和相關示例

在ServletAPI中定義了一個HttpServltReponse接口,它繼承ServletReponse,專門用於響應http,所以HttpServletReponse請求包含響應行,響應頭和響應體的方法

發送響應行:

關於servlet的概述和相關示例

關於servlet的概述和相關示例

示例:

關於servlet的概述和相關示例關於servlet的概述和相關示例

servletConfig對象:

servletConfig對象是指它所對應哪個的servlet配置信息,每一個servlet對應一個servletConfig。servletConfig在多個對象之間是不共享的

關於servlet的概述和相關示例

關於servlet的概述和相關示例

servletContext對象:

關於servlet的概述和相關示例

使用servletContext對象獲取配置文件信息:

我們獲取properties的相關信息,一般存放無上下級關係的配置信息,如數據庫的url name password等。存在上下級關係映射的存放在xml文件中servlet servlet-mapping

關於servlet的概述和相關示例

關於servlet的概述和相關示例

當然,properties配置文件一般都存放在web目錄下。

關於請求和轉發示例:

在servlet中如果當前的web資源不想處理請求,可以通過forward方法將當前的請求傳遞給其他的web資源,這種方式稱為轉發

當servlet不處理該請求,返回狀態碼301/302 在響應頭中附加了url地址,瀏覽器獲取到該狀態碼後,重新發起請求,地址為響應頭中附加的url 這種方式為重定向。

登陸成功後的跳轉:

關於servlet的概述和相關示例

如果跳轉到我們自定義的頁面,則:

關於servlet的概述和相關示例

因為重定向中響應頭返回的地址是home.html ,所以瀏覽器解析的時候,就直接去訪問local:8080/home.html 並沒有加上項目名稱,所以404.

關於servlet的概述和相關示例

網頁自動刷新後跳轉:

設置響應頭即可
關於servlet的概述和相關示例

servlet線程安全問題示例:

代碼如下,兩個瀏覽器同時訪問這個servlet得出 I 的值

關於servlet的概述和相關示例

關於servlet的概述和相關示例

很明顯結果是錯誤的。servlet存在資源共享時(局部變量則不存在,servlet是可以多線程的)就會出現這種問題:

解決方案如下:

關於servlet的概述和相關示例

當然這也是不好的,一個線程必須等待另一個線程完成後才能執行,當併發數量很大時,造成的結果就像是排隊打飯。你沒搞完,我就得在旁邊站著看。所以儘量減少共享資源


分享到:


相關文章: