web.xml載入順序
1 順序
1、啟動一個WEB專案的時候,WEB容器會去讀取它的配置檔案web.xml,讀取<listener>和<context-param>兩個結點。
2、建立一個ServletContext(servlet上下文),這個web專案的所有部分都將共享這個上下文。
3、容器將<context-param>轉換為鍵值對,並交給servletContext。
4、容器建立<listener>中的類例項,建立監聽器。
context-param,它用於向 ServletContext提供鍵值對,即應用程式上下文資訊
context-param -> listener -> filter -> servlet
2 Load-on-startup
在servlet的配置當中,<load-on-startup>5</load-on-startup>的含義是: 標記容器是否在啟動的時候就載入這個servlet。
當值為0或者大於0時,表示容器在應用啟動時就載入這個servlet; 當是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才載入。 正數的值越小,啟動該servlet的優先順序越高。
3 java web的三大元件
1 servlet
1 接收請求資料:我們都知道客戶端請求會被封裝成HttpServletRequest物件,裡面包含了請求頭、引數等各種資訊。 2 處理請求:通常我們會在service、doPost或者doGet方法進行接收引數,並且呼叫業務層(service)的方法來處理請求。 3 完成響應:處理完請求後,我們一般會轉發(forward)或者重定向(redirect)到某個頁面,轉發是HttpServletRequest中的方法,重定向是HttpServletResponse中的方法,兩者是有很大區別的。
servlet生命週期:
Servlet的生命週期方法:
> void init(ServletConfig)
servlet的初始化方法,只在建立servlet例項時候呼叫一次,Servlet是單例的,整個伺服器就只建立一個同類型Servlet
> void service(ServletRequest,ServletResponse)
servlet的處理請求方法,在servle被請求時,會被馬上呼叫,每處理一次請求,就會被呼叫一次。ServletRequest類為請求類,ServletResponse類為響應類
> void destory()
servlet銷燬之前執行的方法,只執行一次,用於釋放servlet佔有的資源,通常Servlet是沒什麼可要釋放的,所以該方法一般都是空的
Servlet的其他重要方法:
> ServletConfig getServletConfig()
獲取servlet的配置資訊的方法,所謂的配置資訊就是WEB-INF目錄下的web.xml中的servlet標籤裡面的資訊
> String getServletInfo()
獲取servlet的資訊方法
Servlet的配置:
<servlet>
<servlet-name>Dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcher.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<multipart-config>
</multipart-config>
<!-- <multipart-config> <location>/tmp</location> <max-file-size>20848820</max-file-size>
<max-request-size>418018841</max-request-size> <file-size-threshold>1048576</file-size-threshold>
</multipart-config> -->
</servlet>
<servlet-mapping>
<servlet-name>Dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2 filter
(1)生命週期:init(),filter();destory();
(2)語法
<filter>
<filter-name>Filter的別名</filter-name>
<filter-class>Filter的全類名</filter-class>
</filter>
<filter-mapping>
<filter-name>別名</filter-name>
<url-pattern>需要Filter攔截的資源地址</url-pattern>
</filter-mapping>
(3)url-pattern匹配語法
1.精確匹配:只有當目標資源的地址和url-pattern的地址一模一樣時,Filter才會攔截資源
例子:/2.jsp , 只有當瀏覽器訪問專案根目錄下的2.jsp時,才會呼叫Filter
2.路徑匹配:當訪問的資源在url-pattern配置的路徑下時,Filter就會攔截資源。
例子1:/hello/* , 只要訪問專案根目錄下hello下的資源,就會呼叫Filter。
例子2:/* , 會攔截專案根目錄下所有資源
3.字尾匹配:只要訪問的資源地址和url-pattern的字尾一樣就會呼叫Filter
例子:*.jsp 只要是以jsp結尾的請求都會攔截
(4)主要作用
//依賴於servlet容器,基於filter介面中的doFilter回撥函式,interceptor則基於Java本身的反射機制;
比如編碼過濾;
3 listener
可以監聽Application、Session、Request物件,當這些物件發生變化就會呼叫對應的監聽方法。
(1)生命週期監聽:ServletContextListener,它有兩個方法,一個在出生時呼叫,一個在死亡時呼叫;
void contextInitialized(ServletContextEvent sce):建立Servletcontext時
void contextDestroyed(ServletContextEvent sce):銷燬Servletcontext時
(2)屬性監聽:ServletContextAttributeListener,它有三個方法,一個在新增屬性時呼叫,一個在替換屬性時呼叫,最後一個是在移除屬性時呼叫。
void attributeAdded(ServletContextAttributeEvent event):新增屬性時;
void attributeReplaced(ServletContextAttributeEvent event):替換屬性時;
void attributeRemoved(ServletContextAttributeEvent event):移除屬性時;
(3) HttpSession(Session監聽)
生命週期監聽:HttpSessionListener,它有兩個方法,一個在出生時呼叫,一個在死亡時呼叫;
voidsessionCreated(HttpSessionEvent se):建立session時
void sessionDestroyed(HttpSessionEvent se):銷燬session時
(4)屬性監聽:HttpSessioniAttributeListener,它有三個方法,一個在新增屬性時呼叫,一個在替換屬性時呼叫,最後一個是在移除屬性時呼叫。
(5)ServletRequest(監聽Request)
生命週期監聽:ServletRequestListener,它有兩個方法,一個在出生時呼叫,一個在死亡時呼叫;
voidrequestInitialized(ServletRequestEvent sre):建立request時
void requestDestroyed(ServletRequestEvent sre):銷燬request時
(6) 屬性監聽:ServletRequestAttributeListener,它有三個方法,一個在新增屬性時呼叫,一個在替換屬性時呼叫,最後一個是在移除屬性時呼叫。
voidattributeAdded(ServletRequestAttributeEvent srae):新增屬性時
void attributeReplaced(ServletRequestAttributeEvent srae):替換屬性時
void attributeRemoved(ServletRequestAttributeEvent srae):移除屬性時
監聽例項:可以監聽線上使用者數
/**
* HttpSessionListener 監聽器
*/
@WebListener
public class MyHttpSessionListener implements HttpSessionListener{
//當前使用者數
private int userCounts=0;
@Autowired
CustomUserDetailService customUserDetailService;
@Autowired
SessionRegistry sessionRegistry;
@Override
public void sessionCreated(HttpSessionEvent se) {
//sessionCreated 使用者數+1
userCounts++;
//重新在servletContext中儲存userCounts
se.getSession().getServletContext().setAttribute("userCounts", userCounts);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
//sessionDestroyed 使用者數-1
userCounts--;
//重新在servletContext中儲存userCounts
se.getSession().getServletContext().setAttribute("userCounts", userCounts);
ArrayList<User> userList=(ArrayList<User>) se.getSession().getServletContext().getAttribute("userList");
String sessionId=se.getSession().getId();
//如果當前使用者在userList中 在session銷燬時 將當前使用者移出userList
User remove = SessionUtil.getUserBySessionId(userList, sessionId);
if(remove!=null){
userList.remove(remove);
}
// 將userList集合 重新儲存到servletContext
se.getSession().getServletContext().setAttribute("userList", userList);
sessionDestroyed(se);
}
}
相關推薦
web.xml載入順序
1 順序 1、啟動一個WEB專案的時候,WEB容器會去讀取它的配置檔案web.xml,讀取<listener>和<context-param>兩個結點。 2、建立一個ServletContext(servlet上下文),這個web專案的所有部分都
JAVA Web.xml 載入順序
轉自:http://blog.163.com/qulei_lei/blog/static/186144231201141945740356/web.xml載入過程(步驟): 1.啟動WEB專案的時候,容器(如:Tomcat)會去讀它的配置檔案web.xml.讀兩個
WEB容器啟動之Web.xml載入順序
web.xml檔案載入順序 一、 1 、啟動一個 WEB 專案的時候, WEB 容器會去讀取它的配置檔案 web.xml ,讀取 <listener> 和 <context-param> 兩個結點。 2 、緊急著,容建立一個 ServletConte
web專案載入順序
@WEB web專案執行順序 現在主流的web開發框架一般都是基於Spring開發的,Spring生態圈量級非常之大,功能非常強大。今天講述一下普通的web專案載入順序。 雖然專案大部分都在使用SpringBoot、SpringCloud等微服務的架構來搭建專案,基本不會在進行這
JAVA WEB專案載入順序
web.xml載入過程(步驟): 1.啟動WEB專案的時候,容器(如:Tomcat)會去讀它的配置檔案web.xml.讀兩個節點: <listener></listener> 和 <context-param&g
web應用載入順序
1.啟動WEB專案的時候,容器(如:Tomcat)會去讀它的配置檔案web.xml.讀兩個節點: <listener></listener> 和 <context-param></context-param> 2.緊接著,容器建立一個ServletC
web.xml檔案載入順序
web.xml 中的listener、 filter、servlet 載入順序及其詳解 一、概述 1、啟動一個WEB專案的時候,WEB容器會去讀取它的配置檔案web.xml,讀取<listener>和<context-param>兩個結點。 2、緊急著
web.xml的載入順序和過程
Web.xml配置詳解之context-param <context-param> <param-name>contextConfigLocation</param-name> <param-value>contextConfigLocat
tomcat 中 web.xml 中的listener、 filter、servlet 載入順序及其詳解
在專案中總會遇到一些關於載入的優先順序問題,剛剛就遇到了一個問題,由於專案中使用了quartz任務排程,quartz在web.xml中是使用listener進行監聽的,使得在tomcat啟動的時候能馬上檢查資料庫檢視那些任務未被按時執行,而資料庫的配置資訊在是在web.xml中使用servlet配置
web.xml 中的listener、 filter、servlet 載入順序及其詳解
一、概述 1、啟動一個WEB專案的時候,WEB容器會去讀取它的配置檔案web.xml,讀取<listener>和<context-param>兩個結點。 2、緊急著,容建立一個ServletContext(servlet上下文),這個web專案的
web.xml中的listener、filter、servlet 載入順序及其詳解
轉發:https://www.cnblogs.com/shenliang123/p/3344555.html 在專案中總會遇到一些關於載入的優先順序問題,剛剛就遇到了一個問題,由於專案中使用了quartz任務排程,quartz在web.xml中是使用listener進行監聽的,使得在tomcat
JavaWeb(十二)---web.xml 中的listener、 filter、servlet 載入順序及其詳解
一、建立順序 1、web.xml檔案中的載入順序為:listener-filter-servlet 2、如果web.xml中配置了<context-param>,初始化順序: context-param > Listener > Filter
web.xml被檔案載入過程,各節點載入順序總結
web.xml載入過程(步驟):1.啟動WEB專案的時候,容器(如:Tomcat)會去讀它的配置檔案web.xml.讀兩個節點: <listener></listener> 和 <context-param></context-
讀Tomcat原始碼確定載入web.xml中節點元素的順序
有時候面試時會被問tomcat啟動時web.xml中節點(類似listener,filter等)被載入的順序,死記硬背那多沒品,正好手裡有tomcat7的原始碼,找了點時間翻了翻。 讓我們先來喵一眼tomcat的架構,大致瞭解下tomcat啟動的順序,那我們目前關心
伺服器啟動時Webapp的web.xml中配置的載入順序(轉
一 1、啟動一個WEB專案的時候,WEB容器會去讀取它的配置檔案web.xml,讀取<listener>和<context-param>兩個結點。 2、緊急著,容建立一個ServletContext(servlet上下文),這個web專案的所有部分都
web.xml檔案載入順序 一、 1 、啟動一個 WEB 專案的時候, WEB 容器會去讀取它的配置檔案 web.xml ,讀取 和
web.xml 中的listener、 filter、servlet 載入順序及其詳解 一、概述 1、啟動一個WEB專案的時候,WEB容器會去讀取它的配置檔案web.xml,讀取<listener>和<context-param>兩個結點。
web容器中web.xml中Servlet、Filter、context-param、listener的載入順序
web容器在啟動web專案的時候,會根據專案中的web.xml配置檔案進行專案的初始化操作, 通過對web容器的原始碼分析和專案實踐,我們可以大致得出以下載入順序: 1)、載入<contex
web.xml的context-param不僅配路徑也配資料夾/配置檔案的載入順序
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/
web.xml檔案中配置(servlet, spring, filter, listenr)的載入順序 研究
發現引起bug的原因是web.xml的下面幾行: <filter-mapping> <filter-name>SecurityFilter</filter-name> <url-pattern>*.do</url-patt
Tomcat原始碼研究之web.xml中元素的載入順序
本文主所關注的是web.xml檔案各類元素的解析載入順序。 2018/11/15 因為CSDN改良了markdown語法,進行重新排版。 1. 前言 等不及的可以直接拖到最後看總結。 在Tomcat中,web.xml對應於Tomcat中的WebXm