<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Servlet3.0新特性:這些你都知道么??

          共 14040字,需瀏覽 29分鐘

           ·

          2021-03-14 16:37


          從今天開始,我們進入 springboot 系列了。

          本文是 springboot 系列第 1 篇,平常我們用 springboot 最多的場景是開發(fā) web 項目,而 springboot 中開發(fā) web 用的是 springmvc,而 springmvc 是依靠 servlet 建立起來的,所以我們需要先了解 servlet,servlet 比較早的版本是 2.5,然后 3.0 改動比較大,目前已經(jīng) 5.0 以上的版本了,3.0 改動比較大,所以本文主要以 servlet3.0 為例,來說一下 servlet3.0 中的一些新特性。

          1、依賴軟件及版本

          • jdk1.8
          • maven3.6.1
          • tomcat10

          2、Servlet3.0 新特性

          • 新增注解支持,通過注解的方式可以非常方便的定義 servlet、filter、listener
          • Servlet3.0 簡化文件上傳(@MultipartConfig)
          • Servlet3.0 對異步處理支持
          • Servlet3.0 對組件可插拔的支持(web-fragment.xml)
          • Servlet3.0 對三大組件(servlet、filter、listener)動態(tài)注冊的支持

          下面我們一個個來看下。

          2、通過注解定義三大組件

          servlet3.0 之前,定義 servlet、filter、listener,都需在 web.xml 中進行配置,而 3.0 及后面的版本中 web.xml 不是必須的了,可有可無,可以采用注解的方式來定義這些組件。

          Servlet 3.0 的部署描述文件 web.xml 的頂層標簽有一個 metadata-complete 屬性,如下圖,該屬性指定當前的部署描述文件是否是完全的,如果設(shè)置為 true,就是說整個 web 的配置信息都在 web.xml 中指定,則容器在部署時將只依賴 web.xml 文件,忽略所有的注解(同時也會跳過 web-fragment.xml 的掃描,亦即禁用可插性支持,具體請看后文關(guān)于可插性支持可插性支持) 的講解);如果不配置該屬性,或者將其設(shè)置為 false,則表示啟用注解支持(和可插性支持)。

          下面來看下如何通過注解的方式定義三大組件。

          3、@WebServlet:定義 servlet

          @WebServlet 主要屬性列表

          屬性名類型描述
          nameString指定 Servlet 的 name 屬性,如果沒有顯式指定,則該 Servlet 的取值即為類的全限定名。
          valueString[]該屬性等價于 urlPatterns 屬性,value 和 urlPatterns 兩個屬性不能同時使用。
          urlPatternsString[]指定一組 Servlet 的 URL 匹配模式
          loadOnStartupint指定 Servlet 的加載順序
          initParamsWebInitParam[]指定一組 Servlet 初始化參數(shù)
          asyncSupportedboolean聲明 Servlet 是否支持異步操作模式,默認是 false,后面會在 servlet 異步處理的部分講解
          descriptionString該 Servlet 的描述信息
          displayNameString該 Servlet 的顯示名,通常配合工具使用

          用法

          (1)、自定義一個類,需繼承jakarta.servlet.http.HttpServlet

          (2)、重寫service方法

          (3)、類上添加@WebServlet注解來定義 servlet 的配置信息,如下,大家重點看下@WebServlet 注解的幾個屬性,基本上和 web.xml 中定義 Servlet 參數(shù)是一致的。

          @WebServlet(
                  name = "myServlet"// servlet 名稱
                  urlPatterns = "/myServlet"// 哪些請求會被這個servlet處理
                  // value 參數(shù)同 urlPatterns,二者選其一
                  loadOnStartup = 1// 設(shè)置servlet加載屬性,當值為0或者大于0時,表示容器在應用啟動時就加載這個servlet;當是一個負數(shù)時或者沒有指定時,則指示容器在該servlet被選擇時才加載;正數(shù)的值越小,啟動該servlet的優(yōu)先級越高。
                  initParams = {
                          @WebInitParam(name = "param1", value = "value1"),
                          @WebInitParam(name = "param2", value = "value2")
                  }, // 定義servlet初始化參數(shù)
                  asyncSupported = false // 是否支持異步
          )

          案例

          創(chuàng)建一個 maven 項目,添加 servlet5.0 依賴


          <dependency>
              <groupId>jakarta.servletgroupId>
              <artifactId>jakarta.servlet-apiartifactId>
              <version>5.0.0-M1version>
              <scope>providedscope>
          dependency>

          創(chuàng)建 servlet,代碼如下,MyServlet 會處理/mySevlet 請求,servlet 接受到請求之后,會將當前 servlet 的初始化參數(shù)輸出到客戶端。

          package com.javacode2018.springboot.lesson001.demo1;

          import jakarta.servlet.ServletConfig;
          import jakarta.servlet.ServletException;
          import jakarta.servlet.annotation.WebInitParam;
          import jakarta.servlet.annotation.WebServlet;
          import jakarta.servlet.http.HttpServlet;
          import jakarta.servlet.http.HttpServletRequest;
          import jakarta.servlet.http.HttpServletResponse;

          import java.io.IOException;
          import java.util.Enumeration;

          @WebServlet(
                  name = "myServlet"// servlet 名稱
                  urlPatterns = "/myServlet"// 哪些請求會被這個servlet處理
                  // value 參數(shù)同 urlPatterns,二者選其一
                  loadOnStartup = 1// 設(shè)置servlet加載屬性,當值為0或者大于0時,表示容器在應用啟動時就加載這個servlet;當是一個負數(shù)時或者沒有指定時,則指示容器在該servlet被選擇時才加載;正數(shù)的值越小,啟動該servlet的優(yōu)先級越高。
                  initParams = {
                          @WebInitParam(name = "param1", value = "value1"),
                          @WebInitParam(name = "param2", value = "value2")
                  }, // 定義servlet初始化參數(shù)
                  asyncSupported = false // 是否支持異步
          )
          public class MyServlet extends HttpServlet {

              @Override
              public void init(ServletConfig config) throws ServletException {
                  super.init(config);
              }

              @Override
              protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  Enumeration initParameterNames = this.getInitParameterNames();
                  while (initParameterNames.hasMoreElements()) {
                      String initParamName = initParameterNames.nextElement();
                      String initParamValue = this.getInitParameter(initParamName);
                      try {
                          resp.getWriter().append(String.format("

          %s:%s

          "
          , initParamName, initParamValue));
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
              }
          }

          運行程序,通常我們會將 web 項目部署到 tomcat 中,tomcat 目前已經(jīng)到 10 了,每個版本支持的 servlet 不一樣,對應關(guān)系如下表

          tomcat版本和servlet版本對應關(guān)系:https://tomcat.apache.org/whichversion.html
          Servlet SpecJSP SpecEL SpecWebSocket SpecAuthentication (JASIC) SpecApache Tomcat VersionLatest Released VersionSupported Java Versions
          5.03.04.02.02.010.0.x10.0.28 and later
          4.02.33.01.11.19.0.x9.0.438 and later
          3.12.33.01.11.18.5.x8.5.637 and later
          3.12.33.01.1N/A8.0.x (superseded)8.0.53 (superseded)7 and later
          3.02.22.21.1N/A7.0.x7.0.1086 and later (7 and later for WebSocket)
          2.52.12.1N/AN/A6.0.x (archived)6.0.53 (archived)5 and later
          2.42.0N/AN/AN/A5.5.x (archived)5.5.36 (archived)1.4 and later
          2.31.2N/AN/AN/A4.1.x (archived)4.1.40 (archived)1.3 and later
          2.21.1N/AN/AN/A3.3.x (archived)3.3.2 (archived)1.1 and later

          這里我們使用最新的 tomcat10,下載地址

          https://tomcat.apache.org/download-10.cgi

          將案例發(fā)布到 tomcat 運行,然后訪問地址http://localhost:8080/myServlet即可訪問我們上面定義的 servlet,輸出如下圖

          4、@WebFilter:定義 Filter

          @WebFilter 的常用屬性

          屬性名類型描述
          filterNameString指定過濾器的 name 屬性
          valueString[]該屬性等價于 urlPatterns 屬性,value 和 urlPatterns 兩個屬性不能同時使用。
          urlPatternsString[]指定一組過濾器的 URL 匹配模式
          servletNamesString[]指定過濾器將應用于哪些 Servlet,取值是 @WebServlet 中的 name 屬性的取值,或者是 web.xml 中 的取值。
          dispatcherTypesDispatcherType指定過濾器的轉(zhuǎn)發(fā)模式,具體取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。
          initParamsWebInitParam[]指定一組過濾器初始化參數(shù),等價于 標簽。
          asyncSupportedboolean聲明過濾器是否支持異步操作模式
          descriptionString該過濾器的描述信息
          displayNameString該過濾器的顯示名,通常配合工具使用

          dispatcherTypes 參數(shù)有 4 個值

          說明
          REQUEST默認值,通過前端發(fā)送過來的請求會被攔截
          FOWARD通過 forward 轉(zhuǎn)發(fā)過來的請求會被攔截
          INCLUDE通過 include 過來的請求會被攔截
          ERROR這個可能開發(fā)者不是很熟悉,意思是當觸發(fā)了一次 error 的時候,就會走一次指定的過濾器
          ASYNC會攔截異步的請求,這個以后會在講 servlet 異步的時候會說。

          用法詳解

          (1)、自定義一個類,需繼承jakarta.servlet.http.HttpFilter

          (2)、重寫doFilter方法,注意是 protected 的 doFilter 方法,如下

          @Override
          protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
              super.doFilter(req, res, chain);
          }

          (3)、類上添加@WebFilter注解來定義 Filter 的配置信息,如下,大家重點看下@WebFilter 的幾個屬性,基本上和 web.xml 中定義 Filter 參數(shù)是一致的

          @WebFilter(
                  filterName = "myFilter"// filter名稱
                  urlPatterns = "/*"//攔截的地址
                  servletNames = "myServlet"//攔截的servlet名稱列表
                  dispatcherTypes = {DispatcherType.REQUEST},//攔截的請求類型
                  initParams = {@WebInitParam(name = "p1", value = "v1")}, //定義Filter初始化參數(shù)列表
                  asyncSupported = false // 是否支持異步
          )

          案例

          package com.javacode2018.springboot.lesson001.demo1;

          import jakarta.servlet.DispatcherType;
          import jakarta.servlet.FilterChain;
          import jakarta.servlet.ServletException;
          import jakarta.servlet.annotation.WebFilter;
          import jakarta.servlet.annotation.WebInitParam;
          import jakarta.servlet.http.HttpFilter;
          import jakarta.servlet.http.HttpServletRequest;
          import jakarta.servlet.http.HttpServletResponse;

          import java.io.IOException;

          @WebFilter(
                  filterName = "myFilter"// filter名稱
                  urlPatterns = "/*"//攔截的地址
                  servletNames = "myServlet"//攔截的servlet名稱列表
                  dispatcherTypes = {DispatcherType.REQUEST},//攔截的請求類型
                  initParams = {@WebInitParam(name = "p1", value = "v1")}, //定義Filter初始化參數(shù)列表
                  asyncSupported = false // 是否支持異步
          )
          public class MyFilter extends HttpFilter {

              @Override
              protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
                  System.out.println(req.getRequestURL()); // 輸出請求的地址
                  super.doFilter(req, res, chain);
              }
          }

          **Filter 會攔截哪些請求呢?**urlPatterns、servletNames、dispatcherTypes 都匹配的請求才會被攔截

          案例發(fā)布到 tomcat,瀏覽器中訪問http://localhost:8080/myServlet,控制臺輸出

          5、@WebListener:定義監(jiān)聽器

          @WebListener 的常用屬性

          屬性名類型是否可選描述
          valueString該監(jiān)聽器的描述信息。

          用法

          (1)、自定義一個類,實現(xiàn)下面任意一個監(jiān)聽器接口

          監(jiān)聽器類說明
          ServletContextListener監(jiān)聽 servlet 上下文的創(chuàng)建和銷毀,web 容器啟動和銷毀的時候會被調(diào)用
          ServletContextAttributeListener監(jiān)聽 ServletContext 中屬性變化
          HttpSessionListener監(jiān)聽 session 的創(chuàng)建和銷毀
          HttpSessionActivationListenerActivate 與 Passivate 是用于置換對象的動作,當 session 對象為了資源利用或負載平衡等原因而必須暫時儲存至硬盤或其它儲存器時(透 過對象序列化),所作的動作稱之為 Passivate,而硬盤或儲存器上的 session 對象重新加載 JVM 時所采的動作稱之為 Activate,所以容 易理解的,sessionDidActivate()與 sessionWillPassivate()分別于 Activeate 后與將 Passivate 前呼叫。
          HttpSessionAttributeListenersession 中添加值或者移除值的時候會被調(diào)用
          HttpSessionBindingListener實現(xiàn)了 HttpSessionBindingListener 的類,在和 session 綁定、解除綁定時觸發(fā)其事件
          ServletRequestListener監(jiān)聽 request 的創(chuàng)建和銷毀
          ServletRequestAttributeListenerrequet 中添加值和刪除值的時候會被調(diào)用

          (2)類上添加@WebListener 注解

          @WebListener("自定義的ServletContextListener")

          案例

          下面我們自定義一個 ServletContextListener,用來監(jiān)聽容器的啟動和銷毀,代碼如下

          package com.javacode2018.springboot.lesson001.demo1;

          import jakarta.servlet.ServletContextEvent;
          import jakarta.servlet.ServletContextListener;
          import jakarta.servlet.annotation.WebListener;

          /**
           * 通過 @WebListener 注解定義監(jiān)聽器
           */

          @WebListener("自定義的ServletContextListener")
          public class MyServletContextListener implements ServletContextListener {
              @Override
              public void contextInitialized(ServletContextEvent sce) {
                  System.out.println(this.getClass().getName() + ",監(jiān)聽servlet容器的啟動!!!!!");
              }

              @Override
              public void contextDestroyed(ServletContextEvent sce) {
                  System.out.println(this.getClass().getName() + ",監(jiān)聽servlet容器的銷毀!!!!!");
              }
          }

          啟動 tomcat,然后再停止 tomcat,控制臺輸出


          下一篇繼續(xù)介紹 servlet3.0 的其他部分。

          接下來介紹 2 個功能,比較適合小白

          • 使用 idea 如何創(chuàng)建 web 項目

          • 如何在 idea 中配置 tomcat

          下面我們來看看。

          6、使用 idea 創(chuàng)建 web 項目

          step1、先安裝 maven

          如果對 maven 不熟悉的可以先去看我的maven系列,springboot 系列每篇中都會用到 maven。

          這里我們使用 maven3.6.1,請大家也安裝這個版本,環(huán)境咱們保持一致,這樣運行的過程中,才能確保結(jié)果是一致,避免走一些不必要的彎路。

          maven3.6.1 下載地址:

          https://archive.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz

          maven 版本列表地址:

          https://archive.apache.org/dist/maven/maven-3/

          step2、idea 中配置 maven

          File->Settings->Maven

          step3:創(chuàng)建 web 項目

          File->New->Project->Maven,勾選Create from archetype,選擇maven-archetype-webapp,如下,這樣一個 web 項目就創(chuàng)建好了。

          7、idea 中配置 tomcat

          step1、下載 tomcat

          這里我們下載 tomcat10,下載地址,大家根據(jù)自己的機器選擇需要下載的包,我的機器是 window 64 位的,所以下載的是 64-bit windows.zip

          https://tomcat.apache.org/download-10.cgi

          step2、解壓下載的 tomcat 包

          解壓之后,tomcat 目錄結(jié)構(gòu)如下,大家復制這個目錄的地址,這就是 tomcat 的 home 目錄地址,稍后在 idea 中配置的時候需要用到

          step3、idea 中配置 tomcat


          我們把案例中的項目發(fā)布到 tomcat

          step4、將 tomcat 添加到 server 列表中

          需要先在 view 中找到 services,點擊之后打開 services 列表窗口,然后在列表窗口中將 tomcat 添加到 services 列表中,具體操作過程如下:

          8、源碼

          https://gitee.com/javacode2018/springboot-series

          9、更多好文章

          1. Spring 系列(共 56 篇)
          2. Java 高并發(fā)系列(共 34 篇)
          3. MySql 高手系列(共 27 篇)
          4. Maven 高手系列(共 10 篇)
          5. Mybatis 系列(共 12 篇)
          6. 聊聊 db 和緩存一致性常見的實現(xiàn)方式
          7. 接口冪等性這么重要,它是什么?怎么實現(xiàn)?
          8. 泛型,有點難度,會讓很多人懵逼,那是因為你沒有看這篇文章!


          瀏覽 93
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  丰满少妇一级A片 | 久草热在线 | 国产粉嫩小泬13p高潮 | 欧美性猛交XXXXX乱大交3免费 | 少妇性受XXXX黑人XYX性爽 |