servlet編程

Servlet(Server Applet),全稱 Java Servlet,暫無中文譯文。是用Java編寫的服務器端程序。其主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,通常狀況下,人們將Servlet理解爲後者。Servlet運行於支持Java的應用服務器中。從原理上講,Servlet能夠響應任何類型的請求,但絕大多數狀況下Servlet只用來擴展基於HTTP協議的Web服務器。
servlet部署步驟
(1)編寫java類,並繼承HttpServlet類。
(2)重寫doGet和doPost方法。
(3)servlet類交給tomcat運行。
  (1) servlet程序的class碼拷貝到WEB-INF/classes目錄,通常這個過程有IDE自動完成。
  (2)在web.xml文件中進行配置<servlet></servlet>和<servlet-mapping></servlet-mapping>。
配置示例以下:
複製代碼
 1 <!-- 配置一個servlet -->
 2   <!-- servlet的配置 -->
 3   <servlet>
 4       <!-- servlet的內部名稱,自定義。儘可能有意義 -->
 5       <servlet-name>FirstServlet</servlet-name>
 6       <!-- servlet的類全名: 包名+簡單類名 -->
 7       <servlet-class>com.nick.FirstServlet</servlet-class>
 8   </servlet>
 9   
10   
11   <!-- servlet的映射配置 -->
12   <servlet-mapping>
13       <!-- servlet的內部名稱,必定要和上面的內部名稱保持一致!! -->
14       <servlet-name>FirstServlet</servlet-name>
15       <!-- servlet的映射路徑(訪問servlet的名稱) -->
16       <url-pattern>/first</url-pattern>
17   </servlet-mapping>
複製代碼

tomcat啓動時,首先加載webapps中的每一個web應用的web.xml配置文件,並根據web.xml配置文件中的信息來完成對應servlet類對象的建立。html

建立流程以下:java

(1)tomcat在web.xml中查找是否存在與請求URL匹配的url-pattern的內容web

(2)若是存在,就去servlet標籤下查找具備相同servlet-name的servlet-class標籤,並經過反射機制來完成servlet類的建立。若是不存在就去加載tomcat中的defaultServlet類,defaultServelt會在應用的根目錄下查找是否存在index.html的靜態文件,若是存在就讀取文件內容返回給瀏覽器。若是不存在則返回404錯誤頁面。瀏覽器

servlet的映射路徑--<url-pattern>映射路徑</url-pattern>tomcat

映射路徑分類兩種類型:精確匹配和模糊匹配。安全

精確匹配:如服務器

  /first: http://localhost:8080/FirstServlet/first多線程

  /first/demo :http://localhost:8080/FirstServlet/first/demo併發

模糊匹配:如app

  /*:http://localhost:8080/FirstServlet/任意路徑

  /first/*:http://localhost:8080/FirstServlet/first/任意路徑

  *.後綴名:http://localhost:8080/day10/任意路徑.後綴名

注意事項:

  1)url-pattern要麼以 / 開頭,要麼以*開頭。

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

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

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

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

servlet的缺省路徑:

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

servlet類的聲明週期

(1)四個生命週期函數

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

      init方法: 建立完servlet對象的時候調用。只調用1次。--public void init(ServletConfig config);

      service方法: 每次發出請求時調用。調用n次。--public void service(ServletRequest req, ServletResponse res);

      destroy方法: 銷燬servlet對象的時候調用。中止服務器或者從新部署web應用時銷燬servlet對象。只調用1次。--public void destroy();

(2)應用的生命週期時序圖

servlet自動加載

默認狀況下,第一次訪問servlet的時候建立servlet對象。若是servlet的構造方法或init方法中執行了比較多的邏輯代碼,那麼致使用戶第一次訪問sevrlet的時候比較慢。經過在servlet的web.xml配置信息中,加上一個<load-on-startup>1</load-on-startup>來改變servlet對象在web應用加載的時候就進行建立。

配置示例以下:

<servlet>
    <servlet-name>LifeDemo</servlet-name>
    <servlet-class>com.nick.LifeDemo</servlet-class>
    <!-- 讓servlet對象自動加載 -->
    <load-on-startup>1</load-on-startup>  注意: 整數值越大,建立優先級越低!!
  </servlet>

注意:在啓動servlet的時候進行的邏輯處理應該重寫無參的init方法中寫,而不用有參的init方法。

servlet線程安全問題

servlet對象在tomcat服務器是單實例多線程的。當多個線程同時訪問共享資源的時候,如成員變量等就匯引起線程安全問題。

解決辦法:

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

      2)建議在servlet類中儘可能不要使用成員變量。若是確實要使用成員,必須同步。並且儘可能縮小同步代碼塊的範圍。(哪裏使用到了成員變量,就同步哪裏!!),以免由於同步而致使併發效率下降。

servlet中的對象

(1)HttpServletRequest

(2)HttpServletResponse

(3)ServletConfig

(4)ServletContext

其中HttpServletRequest和HttpServletResponse對象的使用在上一篇博客有介紹,下面主要來看一下ServletConfig和ServletContext對象。

ServletConfig對象

做用:主要是用於加載servlet的初始化參數。在一個web應用能夠存在多個ServletConfig對象(一個Servlet對應一個ServletConfig對象)。

web應用servlet初始化參數的配置方式:在web.xml中對應的<servlet></servlet>標籤下添加初始化參數,配置示例以下:

複製代碼
1  <servlet>
2     <servlet-name>ConfigDemo</servlet-name>
3     <servlet-class>com.nick.ConfigDemo</servlet-class>
4     <!-- 初始參數: 這些參數會在加載web應用的時候,封裝到ServletConfig對象中 -->
5     <init-param>
6         <param-name>path</param-name>
7         <param-value>e:/b.txt</param-value>
8     </init-param>
9   </servlet>
複製代碼

獲取servletConfig的API:

  ServletConfig getServletConfig()

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對象。

servletContext對象的核心API:

  java.lang.String getContextPath()   --獲得當前web應用的路徑

  java.lang.String getInitParameter(java.lang.String name)  --獲得web應用的初始化參數

  java.util.Enumeration getInitParameterNames() 

  void setAttribute(java.lang.String name, java.lang.Object object) --域對象有關的方法

  java.lang.Object getAttribute(java.lang.String name) 

  void removeAttribute(java.lang.String name)

  RequestDispatcher getRequestDispatcher(java.lang.String path)   --轉發(相似於重定向)

  java.lang.String getRealPath(java.lang.String path)     --獲得web應用的資源文件

  java.io.InputStream getResourceAsStream(java.lang.String path)

(1) 獲取web應用路徑(其實就是項目的名稱)--經常使用於重定位時,代碼以下:

 View Code

(2) 獲得web應用的初始化參數

在web.xml中配置web應用參數代碼以下:

複製代碼
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7     
 8     <!-- 配置web應用參數 -->
 9     <context-param>
10         <param-name>AAA</param-name>
11         <param-value>AAA's value</param-value>
12     </context-param>
13     <context-param>
14         <param-name>BBB</param-name>
15         <param-value>BBB's value</param-value>
16     </context-param>
17     <context-param>
18         <param-name>CCC</param-name>
19         <param-value>CCC's value</param-value>
20     </context-param>
21 
22 </web-app>
複製代碼

注意:

  (1)web應用參數可讓當前web應用的全部servlet獲取。

   (2)  web應用的參數放在<web-app>標籤的第一層,每一個<context-param></context-param>就是一個web應用的參數。

獲取web應用的代碼示例以下:

 View Code

(3) 域對象

域對象的做用:用於保存數據,獲取數據。能夠在不一樣的動態資源之間共享數據。

常見的域對象:

  HttpServletRequet 域對象

      ServletContext域對象

      HttpSession 域對象

     PageContext域對象

ServletContext做爲域對象的使用代碼示例以下:

保存對象的java類:

 View Code

ServletContext做爲域對象保存數據

 View Code

ServletContext做爲域對象獲取數據

 View Code

注意:ServletContext域對象的做用於爲整個web工程。

(4) 轉發

一個web資源收到客戶端請求後,通知服務器去調用另一個web資源進行處理,稱之爲請求轉發。

一個web資源收到客戶端請求後,通知瀏覽器去訪問另一個web資源,稱之爲請求重定向。

轉發的代碼示例以下:

 View Code

轉發和重定向的區別:

1)轉發

  a)地址欄不會改變。

  b)轉發只能轉發到當前web應用內的資源。

  c)能夠在轉發過程當中,能夠把數據保存到request域對象中。

2)重定向                             

     a)地址欄會改變,變成重定向到地址。

     b)重定向能夠跳轉到當前web應用,或其餘web應用,甚至是外部域名網站。

     c)不能在重定向的過程,把數據保存到request中。

(5) 獲得web應用中的資源文件

web應用中用到路徑先寫上/。

web應用中經常使用的路徑符號:
/:在不一樣的使用環境下表明不一樣的含義
  給服務器使用:表示在當前的web應用的根目錄(webRoot或者webContent下)。
  給瀏覽器使用:表示在webapps的根目錄下。
區別代碼以下:
 View Code

.:表明java命令行目錄,即tomcat/bin目錄。

使用ServletContext加載資源文件的方法示例以下:

 View Code
相關文章
相關標籤/搜索