javaWeb的執行流程
一、javaWeb的執行
javaWeb中的重要三個元件Filter、servlet、Listening,其中所有的基礎框架(spring、springmvc、struts2、mybatis、hibernate、spring boot)都是在這個基礎上進行的,而其他功能框架(shiro、spring security、pio、quartz、activity等等)是在基礎框架的基礎上再使用的,而javaweb中的元件都是配置在web.xml中,其中在啟動的順序中是:
二、執行流程
1)javaweb的執行順序context-param——> listener——>filter——>servlet
context-param:該元素用來宣告應用範圍(整個WEB專案)內的上下文初始化引數。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mybatis.xml</param-value>
</context-param>
<!--
param-name 設定上下文的引數名稱。必須是唯一名稱
param-value 設定的引數名稱的值,這裡的例子是指定spring配置檔案的位置
-->
listener:該元素用來註冊一個監聽器類。可以收到事件什麼時候發生以及用什麼作為響應的通知。事件監聽程式在建立、修改和刪除會話或servlet環境時得到通知。常與context-param聯合使用。
//listen-class 指定監聽類,該類繼承ServletContextListener 包含初始化方法contextInitialized(ServletContextEvent event) 和銷燬方法contextDestoryed(ServletContextEvent event)
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
filter:用於指定WEB容器的過濾器, filter能夠在一個請求到達servlet之前預處理使用者請求,也可以在離開servlet時處理http響應;在執行servlet之前,首先執行filter程式,併為之做一些預處理工作;根據程式需要修改請求和響應;在servlet被呼叫之後截獲servlet的執行。
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
servlet : 建立並返回一個包含基於客戶請求性質的動態內容的完整的html頁面; 建立可嵌入到現有的html頁面中的一部分html頁面(html片段); 讀取客戶端發來的隱藏資料; 讀取客戶端發來的顯示資料; 與其他伺服器資源(包括資料庫和java的應用程式)進行通訊;
//配置Spring MVC,指定處理請求的Servlet,有兩種方式:
//1. 預設查詢MVC配置檔案的地址是:/WEB-INF/${servletName}-servlet.xml
//2. 可以通過配置修改MVC配置檔案的位置,需要在配置DispatcherServlet時指定MVC配置檔案的位置。
//這裡使用的是第二種方式
<!-- Springmvc的核心控制器 -->
<servlet>
<servlet-name>dispatchServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatchServlet</servlet-name>
<url-pattern>*.shtml</url-pattern>
</servlet-mapping>
2)web.xml載入過程(步驟):
啟動web專案,容器(如Tomcat、Apache)會去讀取它的配置檔案web.xml 中的兩個節點,context-param和listener。
緊接著,容器將建立一個ServletContext(又稱為:Servlet上下文),應用範圍內即整個WEB專案都能使用這個Servlet上下文。
容器將<context-param>轉化為鍵值對,並交給ServletContext。
容器建立< listener >中的類例項,即建立監聽。(備註:listener定義的類可以是自定義的類但必須需要繼承ServletContextListener)。
在監聽中會有contextInitialized(ServletContextEvent args)初始化方法,在這個方法中獲得:ServletContext = ServletContextEvent.getServletContext(); context-param的值 = ServletContext.getInitParameter(“context-param的鍵”); 在這個類中還必須有一個contextDestroyed(ServletContextEvent event) 銷燬方法。用於關閉應用前釋放資源,比如說資料庫連線的關閉。
得到這個context-param的值之後,你就可以做一些操作了。注意,這個時候你的WEB專案還沒有完全啟動完成。這個動作會比所有的Servlet都要早。 換句話說,這個時候,你對 < context-param > 中的鍵值做的操作,將在你的WEB專案完全啟動之前被執行。舉例.你可能想在專案啟動之前就開啟資料庫。那麼這裡就可以在< context-param >中設定資料庫的連線方式,在監聽類中初始化資料庫的連線。
補充知識:ServletContext,是一個全域性的儲存資訊的空間,伺服器開始,其就存在,伺服器關閉,其才釋放。request,一個使用者可有多個;session,一個使用者一個;而servletContext,所有使用者共用一個。所以,為了節省空間,提高效率,ServletContext中,要放必須的、重要的、所有使用者需要共享的執行緒又是安全的一些資訊。例如,一個購物網站,使用者要訪問商品的詳細資訊,如果放在session域,每個使用者都要訪問一遍資料庫,這樣效率太低;而放在ServletContext中,伺服器一啟動,就訪問資料庫將商品資訊放入資料庫,這樣所有使用者只需要通過上下文就能訪問到商品的資訊。 |
3)web.xml節點載入順序:
注意:web.xml節點的載入順序與它們在web.xml中位置的先後無關,即不會因為< filter >寫在< context-param >前面就先載入< filter >。
上文也提到到了,< context-param >用於對ServletContext提供鍵值對,即應用程式的上下文資訊。而listener、servlet等節點在初始化的過程中會使用到這些上下文資訊,所以最後我們得出web.xml節點的載入順序應該為:context-param->listener->filter->servlet。
對於某類配置節點而言,位置的先後是有要求的。以servlet舉例,與servlet相關的配置節點是servlet-mapping,對於擁有相同配置節servlet-name的servlet和servlet-mapping來說,servlet-mapping必須在servlet後定義,否則當解析到servlet-mapping時,它的servlet-name還沒有定義。web 容器啟動時初始化每個 servlet時,是按照 servlet配置節出現的順序來初始化的。
最終結論: web.xml 的載入順序是:[context-param -> listener -> filter -> servlet -> spring] ,而同型別節點之間的實際程式呼叫的時候的順序是根據對應的 mapping 的順序進行呼叫的。
三、過濾的方法
1)/
說明:攔截所有資源,對靜態資源都會攔截,但是不會攔截jsp,要對靜態資源進行處理。
springmvc的處理方法
<mvc:resources location="/js/" mapping="/js/**"/>
struts2的處理方法
2)/*
說明:攔截所有的資源,這個才是真正意義上的攔截所有,這個會將靜態資源和jsp都進行攔截
/*和/的區別的原因: (1)web server有幾個預設的servlet,其Servlet-Mapping對映路徑包括“*.jsp”(用於處理jsp頁面響應),以及“”(用於預設頁面響應)等 (2)“/*”會覆蓋掉以上所有的預設servlet,從而將所有的請求都攔截了下來 (3)“/”不會覆蓋預設servlet,所以預設的“*.jsp”servlet仍然可以正常工作,(精確匹配優先)優先攔截jsp頁面請求,並響應。 |
3)*.action
說明:所有請求的url副檔名為.do或.action將被攔截,不會導致靜態檔案(jpg,js,css)被攔截。3)
四、攔截的方法
1)攔截的基本規則
Wildcard | Description |
? | 匹配任何單字元 |
* | 匹配0或者任意數量的字元 |
** | 匹配0或者更多的目錄 |
2)攔截例項說明
四、過濾器和攔截器、監聽器的區別
1)攔截器和過濾器的區別
過濾器Filter依賴於Servlet容器,基於回撥函式,過濾範圍大。
攔截器Interceptor依賴於框架容器,基於反射機制,只過濾請求。
2)攔截器和過濾器的url配置區別
相關文章
- MapReduce的執行流程概述
- SpringMvc - SpringMvc的執行流程SpringMVC
- Seata的AT模式的執行流程模式
- 深入理解執行緒池的執行流程執行緒
- MyBatis執行流程MyBatis
- Mysql 執行流程MySql
- MapReduce執行流程
- HA執行流程
- SpringMVC執行流程SpringMVC
- docker-執行JavaWeb服務(jar包)DockerJavaWebJAR
- WEB程式執行的基本流程Web
- for 迴圈執行流程
- Dapr Outbox 執行流程
- Ansible playbook 執行流程
- 「MySQL」 MySQL執行流程MySql
- MapReduce程式執行流程
- 執行緒池的工作流程執行緒
- mysql的sql語句執行流程MySql
- Shiro(認證的執行流程Authentication)
- JavaWeb專案執行在單獨的tomcat 以及單獨的jdk執行環境JavaWebTomcatJDK
- Spark學習(一)——執行模式與執行流程Spark模式
- eBPF 執行原理和流程eBPF
- 執行流程原始碼分析原始碼
- SQL 解析與執行流程SQL
- PHP執行流程回顧PHP
- 框架執行流程總結框架
- thinkphp3.2 執行流程PHP
- docker執行javaWeb服務,操作檔案異常DockerJavaWeb
- MySQL 主從複製的執行流程MySql
- 一條更新語句的執行流程
- Ansible ad-hoc 執行流程
- 深入Mybatis原始碼——執行流程MyBatis原始碼
- Mybatis執行流程原始碼分析MyBatis原始碼
- 【java學習】控制執行流程Java
- 一條查詢語句的執行流程
- MyBatis執行流程的各階段介紹MyBatis
- Spark Task 的執行流程② - 建立、分發 TaskSpark
- Servlet基本概念及執行流程Servlet