servlet

1 Servlet執行過程

1.1 servlet簡介

servlet: 用java語言開發網頁動態資源的技術。html

servlet特色:java

1)servlet就是一個普通的java類,繼承HttpServlet類web

2)一個普通的java類實現了Servlet接口,也叫Servlet程序。咱們一般繼承HttpServlet是爲了建立一個基於http協議的servlet程序。瀏覽器

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

1.2 Servlet開發過程

1)編寫java類,繼承HttpServlet安全

2)servlet程序交給tomcat服務器運行服務器

A 把servlet的class字節碼拷貝到WEB-INF/classes目錄下session

B 在web.xml文件中配置多線程

1.3 Servlet的執行過程

前提: tomcat服務器啓動時,會加載%conf%/web.xml文件。而後再加載站點下的每一個web應用的web.xml文件。併發

瀏覽器輸入: http://localhost:8080/day8/first

 

http://       http協議

1)本地hosts文件查詢域名和ip的映射

2)找不到,聯網到運營商的DNS服務器找域名和ip的映射

8080       端口     tomcat:8080

/day8     站點下的web應用名稱

/first     資源名稱。截取到/first 字符串

1)在day8應用下的web.xml文件中查找是否存在匹配的url-pattern

2)使用servlet的內部名稱在web.xml文件中查找是否存在相同名稱的servlet配置

3)獲得對應的servlet-class內容。

經過反射構造FirstServlet對象,調用方法(doGet.......)

輸出內容到瀏覽器,看到效果!!!

2 Servlet的路徑映射

url-pattern: 表示servlet的路徑映射,也叫servlet訪問名稱。

url-patttern            瀏覽器輸入URL

精確匹配    

     /demo1     http://localhost:8080/day8/demo1       

     /test/demo1     http://localhost:8080/day8/test/demo1

模糊匹配    

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

     /itcast/*   http://localhost:8080/day8/test/任意路徑   

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

    (*.do   *.action  *.jsf   *.html)

注意:

1)url-pattern要麼以/開頭,要麼以*開頭    例如: itcast/demo1錯誤寫法。  

2)不能同時使用兩種模糊匹配。例如: /itcast/*.html 錯誤寫法

3)當多個url-pattern同時符合匹配規則,那麼

A 精確匹配的url-pattern會優先被執行。

B 後綴名結尾的模糊匹配的url-pattern優先級最低!!!

3 Sevlet缺省路徑

/  : 表示servlet的缺省路徑。

tomcat服務器中配置了一個DefaultServlet,叫默認Servlet,該默認Servlet的url-pattern就是/ 。默認Servlet的做用,用於解析web應用下的靜態資源。

問題: 瀏覽器輸入一個資源名稱時,查找資源的順序是如何?

1)首先,在當前web應用下的web.xml文件中查找是否有匹配的url-pattern

2)若是匹配到,執行對應的servlet(動態資源)

3)若是沒有匹配到,就交給tomcat服務器的默認Servlet去處理

4)默認Servlet會到當前web應用下讀取對應名稱的靜態資源文件。

5)若是讀到對應的靜態資源文件,那麼就把內容返回給瀏覽器

6)若是讀不到對應的靜態資源文件,那麼就返回404的錯誤頁面。

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

4 Servlet的生命週期(重點)

4.1 生命週期

之前:之前的程序,java類,本身去new對象,本身去使用對象調用。

如今: sevlet程序。servlet的生命週期由tomcat服務器控制的。

servlet何時對象建立,什麼銷燬,何時調用什麼方法???

4.2 Servlet的四個生命週期

構造方法: 在建立servlet對象時調用。只調用1次。

證實servlet對象在tomcat服務器中是單實例的。

init方法:在建立完servlet對象後調用。只調用1次。

service方法: 在每次請求servlet時調用。調用n次。

destroy方法: servlet對象銷燬時調用。只調用1次。tomcat服務器中止或web應用從新部署時調用

4.3 Servlet自動加載

默認狀況下,第一次訪問servlet時建立servlet對象。建立對象的過程當中會調用構造方法和inti方法。若是init方法的業務邏輯須要消耗比較長的時間,用戶的第一次訪問servlet時須要等待較長的時間。

改變servlet對象建立的時機: tomcat服務器啓動的時候建立servlet對象。

    <!-- 正整數:數值越大,建立對象的優先級越低 -->

    <load-on-startup>1</load-on-startup>

5 Servlet線程安全問題

servlet對象特色: 在tomcat服務器中是單實例多線程的!!!

5.1 引起Servlet多線程問題

多個線程同時操做了Servlet的成員變量(共享數據)。

5.2 避免Servlet併發問題建議

1)儘可能不要在servlet類中使用成員變量。

2)若是要使用成員變量,那麼就要給使用到成員變量的代碼塊加上代碼鎖,儘可能縮小同步鎖的範圍,以免由於同步產生代碼併發執行效率下降的問題。

 

6 Init方法問題

GenericServlet中,有兩個init方法。

 

有參數的init方法:該方法是servlet的四個生命週期方法中的一個。由tomcat服務器默認調用的初始化方法。在GenericServlet的實現中,該方法會調用無參數的init方法。

無參數的init方法:該方法的是Sun公司設計出來用於給開發者去覆蓋,用於實現初始化邏輯的方法。

結論: 若是要編寫servlet的初始化邏輯,只須要覆蓋無參數的init方法便可!!!!

Servlet中重要對象:

1)HttpServletRequest對象:封裝請求信息

2)HttpServletResponse對象:封裝響應信息

3)ServletConfig對象: 封裝一個servlet配置參數信息

4)ServletContext對象: 封裝web應用環境信息

7 ServletConfig對象

7.1 ServletConfig建立

ServletConfig對象是在建立完servlet對象以後,被建立出來。而後經過有參數的init方法傳遞到servlet中。

ServetConfig對象主要用於加載servlet配置參數信息。

7.2 ServletConfigAPI

getInitParameter(String name)   --獲得參數

getInitParameterNames()  

ServletContext getServletContext()    獲得servlet上下文對象

getServletName()   獲得servlet名稱

<servlet>

    <servlet-name>ConfigDemo</servlet-name>

<servlet-class> ConfigDemo</servlet-class>

    <!--  配置servlet參數 -->

    <init-param>

     <param-name>path</param-name>

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

    </init-param>

    <init-param>

     <param-name>BBB</param-name>

     <param-value>BBB's value</param-value>

    </init-param>

  </servlet>

注意: servlet的配置參數只對當前servlet有效的!!對其餘servlet是無效的!!

8 ServletContext對象(重點)

8.1 ServletContext簡介

ServletContext叫Servlet上下文對象,該對象表示當前的web應用環境信息。一個web應用只會建立一個ServletContext對象。

8.2 ServletContext建立時機

ServletContext對象是在tomcat服務器加載完當前web應用後建立出來。ServletContext對象是做爲ServletConfig對象成員變量傳入servlet中。經過ServletConfig的getServletContext()方法獲得ServletContext對象。

8.3 ServletContext對象的API

獲得web應用的上下文路徑

getContextPath()  

獲得web應用的全局參數(全部servlet有效的!!)

getInitParameter(java.lang.String name)  

getInitParameterNames()

域對象相關的方法(對比request域與context域)

setAttribute(String name, Object object)保存數據

getAttribute(String name)  獲得數據

removeAttribute(String name)  清除數據

Request轉發相關的

RequestDispatcher getRequestDispatcher(String path)

Response重定向

SendRedirect(string path) 

web應用讀取資源文件

getRealPath(String path)

"/WEB-INF/classes/news.properties"

getResourceAsStream(String path)

 

8.4獲得web應用的上下文路徑

getContextPath()  獲得web應用上下路徑。也就是部署到tomcat服務器上運行的web應用名稱。

8.5獲得web應用的全局參數

getInitParameter(String name)  

getInitParameterNames()

<!-- 配置web應用全局的參數 -->

<context-param>

<param-name>AAA</param-name>

<param-value>AAA's value</param-value>

</context-param>

<context-param>

<param-name>BBB</param-name>

<param-value>BBB's value</param-value>

</context-param>

注意:

全局參數對當前web應用下的全部servlet都有效的!!!

8.6域對象相關的方法

ServetContext對象是一個域對象!!!

域對象的做用: 主要用於保存數據和獲取數據,用於在web應用中不一樣資源之間共享數據。

Servlet1          

response.sendRedirect(context.getContextPath+"/Servlet2?name=eric");     

Servlet2

request.getParameter("name");

1)參數形式:只能傳遞字符串數據

2)使用域對象形式:

Servlet1中保存數據

Servlet2中獲取數據

域對象相關的方法:

setAttribute(String name, Object object) 保存數據

getAttribute(String name)  獲得數據

removeAttribute(String name)  清除數據

ServletContext域做用範圍:

在當前的web應用中有效!!!

Servlet中全部域對象:

HttpServletRequest對象: request域

ServletContext對象: context域

HttpSession對象: session域

Jsp中域對象:

PageContext對象: page域

8.7轉發相關的

getRequestDispatcher(String path)  

servlet中實現頁面跳轉

請求重定向: response.sendRedirect(路徑);

請求轉發: request.getRequestDispacher(路徑).forward(request,respone);

=======請求重定向 vs  請求轉發  區別====

請求重定向:

1)地址欄改變,改變爲重定向到地址

2)能夠重定向到當前web應用,其餘web應用,甚至是其餘站點資源。

3)處於兩次不一樣的請求。不可使用request域對象來共享數據。

請求轉發:

1)地址欄不會改變。

2)只能轉發到當前web應用內部資源。

3)處於同一次請求。可使用request域對象來共享數據不一樣類型資源:

1)web應用內部資源。在當前web應用中的資源

2)其餘web應用資源。在同一個站點下的其餘web應用的資源。

3)站點外的資源。其餘站點下的資源。 

 

 

自定義servlet模板

https://www.cnblogs.com/ms-grf/p/7206196.html

package ${enclosing_package};

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet(urlPatterns = { "/${primary_type_name}" })
public class ${primary_type_name} extends HttpServlet {
    
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");        
        response.getWriter().append("Served at: ");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

}
相關文章
相關標籤/搜索