java-servlet

1 如何開發一個Servlet(重點)

1.1 步驟:

1)編寫java類,繼承HttpServlet類

2)重新doGet和doPost方法

3)Servlet程序交給tomcat服務器運行!!

3.1 servlet程序的class碼拷貝到WEB-INF/classes目錄

3.2 在web.xml文件中進行配置

<!--配置一個servlet-->

<!--servlet的配置-->

<servlet>

?<!--servlet的內部名稱,自定義,盡量有意義-->

<servlet-name>FirstServlet<servlet-name>

<!--servlet的類全名:包名+簡單類名-->

</servlet>


<!--servlet的映射配置-->

<servlet-mapping>

<!--servlet的內部名稱,一定要和上面的內部名稱保持一致!!-->

<servlet-name>FirstServlet</servlet-name>

<!--servlet的映射路徑(訪問servlet的名稱)

<url-pattern>/first</url-pattern>

</servlet-mapping>


訪問次URL:? http://localhost:8080/day10/first 即可

前提: tomcat服務器啟動時,首先加載webapps中的每個web應用的web.xml配置文件

http://: http協議

localhost: 到本地的hosts文件中查找是否存在該域名對應的IP地址

127.0.0.1

8080:? ? 找到tomcat服務器

/day10? ? 在tomcat的webapps目錄下找 day10的目錄

/first? ? 資源名稱。

1)在day10的web.xml中查找是否有匹配的url-pattern的內容(/first)

2)如果找到匹配的url-pattern,則使用當前servlet-name的名稱到web.xml文件中查詢是否相同名稱的servlet配置

3)如果找到,則取出對應的servlet配置信息中的servlet-class內容:

字符串: gz.itcast.a_servlet.FirstServlet

通過反射:

a)構造FirstServlet的對象

b)然后調用FirstServlet里面的方法

精確匹配? ? ? ? ? ? /first? ? ? ? ? ? ? ? http://localhost:8080/day10/first

模糊匹配? ? ? ? ? ? /*? ? ? ? ? ? ? ? ? http://localhost:8080/day10/任意路徑

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *.do? ? ? ? ? ? ? ? http://localhost:8080/day10/任意路徑.do

? ? ? ? ? ? ? ? ? ? ? ? ? ? *.action? ? ? ? http://localhost:8080/day10/任意路徑.action

注意:1)url-pattern要么以 / 開頭,要么以*開頭。 例如, itcast是非法路徑。、

2)不能同時使用兩種模糊匹配,例如 /itcast/*.do是非法路徑

3)當有輸入的URL有多個servlet同時被匹配的情況下:

3.1 精確匹配優先。(長的最像優先被匹配)

3.2 以后綴名結尾的模糊url-pattern優先級最低!!!

3 servlet缺省路徑servlet的缺省路徑

servlet的缺省路徑(<url-pattern>/</url-pattern>)是在tomcat服務器內置的一個路徑。該路徑對應的是一個DefaultServlet(缺省Servlet)。這個缺省的Servlet的作用是用于解析web應用的靜態資源文件。

問題: URL輸入http://localhost:8080/day10/index.html 如何讀取文件????

1)到當前day10應用下的web.xml文件查找是否有匹配的url-pattern。

2)如果沒有匹配的url-pattern,則交給tomcat的內置的DefaultServlet處理

3)DefaultServlet程序到day10應用的根目錄下查找是存在一個名稱為index.html的靜態文件。

4)如果找到該文件,則讀取該文件內容,返回給瀏覽器。

5)如果找不到該文件,則返回404錯誤頁面。

結論: 先找動態資源,再找靜態資源。

4 Sevlet的生命周期(重點)

Servlet程序的生命周期由tomcat服務器控制的!!!

構造方法: 創建servlet對象的時候調用。默認情況下,第一次訪問servlet的時候創建servlet對象 只調用1次。證明servlet對象在tomcat是單實例的。

init方法: 創建完servlet對象的時候調用。只調用1次。

service方法: 每次發出請求時調用。調用n次。

destroy方法: 銷毀servlet對象的時候調用。停止服務器或者重新部署web應用時銷毀servlet對象。只調用1次

2. 偽代碼演示servlet的生命周期(重點)

Tomtcat內部代碼運行:

1)通過映射找到到servlet-class的內容,字符串: gz.itcast.a_servlet.FirstServlet

2)通過反射構造FirstServlet對象

2.1 得到字節碼對象

Class clazz = class.forName("gz.itcast.a_servlet.FirstServlet");

2.2 調用無參數的構造方法來構造對象

Object obj = clazz.newInstance();? ? ---1.servlet的構造方法被調用

3)創建ServletConfig對象,通過反射調用init方法

3.1 得到方法對象

Method m = clazz.getDeclareMethod("init",ServletConfig.class);

3.2 調用方法

m.invoke(obj,config);? ? ? ? ? ? --2.servlet的init方法被調用

4)創建request,response對象,通過反射調用service方法

4.1 得到方法對象

Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);

4.2 調用方法

m.invoke(obj,request,response);? --3.servlet的service方法被調用

5)當tomcat服務器停止或web應用重新部署,通過反射調用destroy方法

5.1 得到方法對象

Method m = clazz.getDeclareMethod("destroy",null);

3. Servlet的自動加載?默認情況下,第一次訪問servlet的時候創建servlet對象。如果servlet的構造方法或init方法中執行了比較多的邏輯代碼,那么導致用戶第一次訪問sevrlet的時候比較慢。改變servlet創建對象的時機: 提前到加載web應用的時候!!!在servlet的配置信息中,加上一個即可!!(了解)

<load-on-startup>1<load-on-startup>注意: 整數值越大,創建優先級越低!!

4.Servlet的多線程并發問題(了解)

注意: servlet對象在tomcat服務器是單實例多線程的。

因為servlet是多線程的,所以當多個servlet的線程同時訪問了servlet的共享數據,如成員變量,可能會引發線程安全問題。

解決辦法:

1)把使用到共享數據的代碼塊進行同步(使用synchronized關鍵字進行同步)

2)建議在servlet類中盡量不要使用成員變量。如果確實要使用成員,必須同步。而且盡量縮小同步代碼塊的范圍。(哪里使用到了成員變量,就同步哪里!!),以避免因為同步而導致并發效率降低。

Servlet學習:

HttpServletRequest? 請求對象:獲取請求信息

HttpServletResponse 響應對象: 設置響應對象

ServletConfig對象? ? servlet配置對象

ServletContext對象; servlet的上下文對象


5 ServletConfig對象(重點)

作用:ServletConfig對象: 主要是用于加載servlet的初始化參數。在一個web應用可以存在多個ServletConfig對象(一個Servlet對應一個ServletConfig對象)

5.2 對象創建和得到

創建時機: 在創建完servlet對象之后,在調用init方法之前創建。

得到對象: 直接從有參數的init方法中得到!!!

9.3 servlet的初始化參數配置

<servlet>

<servlet-name>FirstName</servlet-name>

<servlet-class>boomin.類名 <servlet-class>

!-- 初始參數: 這些參數會在加載web應用的時候,封裝到ServletConfig對象中 --

<init-param>

<param-name>path < param-name>

<param-value>e:/b.txt</ param-value>

</init-param>

<servlet>

注意: servlet的參數只能由當前的這個sevlet獲取!!!!

ServletConfig的API:

java.lang.String getInitParameter(java.lang.String name)? 根據參數名獲取參數值

java.util.Enumeration getInitParameterNames()? ? 獲取所有參數

ServletContext getServletContext()? ? 得到servlet上下文對象

java.lang.String getServletName()? ? ? 得到servlet的名稱

ServletContext對象

ServletContext對象 ,叫做Servlet的上下文對象。表示一個當前的web應用環境。一個web應用中只有一 個ServletContext對象。

10.2 對象創建和得到

創建時機:加載web應用時創建ServletContext對象。

得到對象: 從ServletConfig對象的getServletContext方法得到

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 簡書 賈小強轉載請注明原創出處,謝謝! Servlet是一種允許響應請求的Java類。雖然Servlet可以響應任...
    賈小強閱讀 10,643評論 1 44
  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,372評論 11 349
  • Servlet學習的大綱 servlet概念及相關接口簡介 servet 執行過程 servlet映射路徑 缺省s...
    奮斗的老王閱讀 1,213評論 1 51
  • 本文包括: Servlet簡介關于Servlet的一些類 Servlet生命周期 ServletConfig獲得初...
    廖少少閱讀 3,906評論 1 67
  • Servlet編程需要使用到javax.servlet 和 javax.servlet.http兩個包下面的類和...
    誰吃了我的薯條閱讀 348評論 0 0