[Servlet]深刻掌握Servlet

Servlet的線程安全

在Servlet的整個生命週期中,構造方法只被執行一次。也就是說,在Servlet的整個生命週期中,只存在一個Servlet實例對象。這說明Servlet是單例多線程的,可能會引發線程安全問題。html

所謂線程安全就是一個Servlet實例對象會同時處理多個請求,這樣的Servlet工做效率的確很高。但若是Servlet中包含成員變量的話,可能一個線程對該成員變量進行寫操做,而另外一個線程對該成員變量進行讀操做。因此,單例多線程的Servlet不能建立成員變量。java

服務器啓動建立Servlet

經過以前的測試操做,咱們發現Servlet並非在Tomcat服務器啓動時建立實例對象,而是在第一次請求以後才一併建立實例對象、初始化並處理邏輯的。Servlet又是單例的,在整個生命週期中只建立一個Servlet實例對象。若是能夠在Tomcat服務器啓動時,進行建立實例對象並完成初始化工做,在請求以後只調用service()方法處理請求邏輯便可。web

能夠在web.xml配置文件增長相關配置便可,具體增長內容以下:apache

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <servlet-name>LifeServlet</servlet-name>
    <servlet-class>app.java.servlet.LifeServlet</servlet-class>
    <!-- load-on-startup標籤:配置當前Servlet在啓動時建立實例對象 * 標籤中的數字,表示級別(0-9級),通常設置爲0便可. -->
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>LifeServlet</servlet-name>
    <url-pattern>/servlet/LifeServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

增長配置信息以後,從新啓動Tomcat服務器,查看控制檯信息以下:瀏覽器

這裏寫圖片描述

經過查看控制檯打印的信息,能夠看出在啓動Tomcat服務器時,已經建立並初始化了Servlet實例對象。安全

url-pattern的三種配置

在web.xml配置文件中配置有關Servlet的時候,標籤是用於配置當前Servlet攔截的路徑,也就是說,客戶端瀏覽器訪問標籤配置的路徑才能訪問對應Servlet內容。服務器

關於攔截路徑的配置方式其實有三種方式:markdown

  • 徹底路徑匹配:是以「/」開始,路徑中間不能包含通配符「*」,例如:/firstServclet,表示訪問路徑爲http://localhost:8080/08_servlet/firstServlet
  • 目錄匹配:是以「/」開始,以「/」結尾的,例如:/firstServlet/,表示訪問路徑爲http://localhost:8080/08_servlet/firstServlet路徑下任意內容。
  • 擴展名匹配:是以「」開始,不能以「/」開始,以「.xxx」結尾,例如:.do,表示訪問路徑爲全部擴展名爲「.do」的路徑。

值得注意的問題:多線程

  • 在一個標籤中,能夠配置多個標籤。也就是說,一個Servlet能夠攔截多個不一樣路徑的訪問。
  • 上述三種配置路徑方式具備優先級:徹底路徑匹配 -> 目錄匹配 -> 擴展名匹配。

下面經過一些測試,來看看路徑配置的三種方式:app

  • 以下有一些映射關係:
    • Servlet1 映射到 /abc/*
    • Servlet2 映射到 /*
    • Servlet3 映射到 /abc
    • Servlet4 映射到 *.do
  • 問題:
    • 當請求URL爲「/abc/a.html」,「/abc/」和「/」都匹配,哪一個servlet響應?Servlet1
    • 當請求URL爲「/abc」時,「/abc/*」和「/abc」都匹配,哪一個servlet響應?Servlet3
    • 當請求URL爲「/abc/a.do」時,「/abc/」和「.do」都匹配,哪一個servlet響應?Servlet1
    • 當請求URL爲「/a.do」時,「/」和「.do」都匹配,哪一個servlet響應?Servlet2
    • 當請求URL爲「/xxx/yyy/a.do」時,「/」和「.do」都匹配,哪一個servlet響應?Servlet2

若是客戶端瀏覽器請求的路徑是錯誤時,頁面會顯示404錯誤內容。這是由於全部發布到Tomcat服務器的Web應用程序的web.xml文件都繼承了Tomcat服務器安裝目錄中conf目錄中的web.xml文件。當訪問路徑是錯誤的,或者對應Servlet沒有配置,實際上會執行Tomcat服務器中的web.xml的相關配置,具體內容以下:

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

轉載說明:請註明做者及原文連接,謝謝!

相關文章
相關標籤/搜索