❶ web.xml文件主要配置有哪些,都有什麼含義
①web.xml文件是用來配置:歡迎頁、servlet、filter等配置文件用的。當你的web工程沒用到這些時,你可以不用web.xml文件來配置你的web工程
web.xml的模式文件中定義的標簽並不是定死的,模式文件也是可以改變的,一般來說,隨著web.mxl模式文件的版本升級,裡面定義的功能會越來越復雜,
也即標簽元素的種類會越來越多,但有些是不常用的,我們只需記住一些常用的就可以了。
首先是定義頭和根元素
聲明為xml文件,版本為1.0,編碼為utf-8
聲明該文件的內容可以使用xsi的標簽庫
聲明標簽的使用范圍是被javaee的開發使用的
聲明可以使用的標簽庫和對應的具體的標簽庫版本地址。
web.xml的模式(Schema)文件中定義了多少種標簽元素,它就能擁有定義出來的那些功能
隨著web.mxl模式文件的版本升級,裡面定義的功能會越來越復雜,也即標簽元素的種類會越來越多.
定義項目的名稱.
項目名稱
歡迎頁面
servlet
配置springmvc DispatcherServlet( 前台控制器)-->example這個Servlet的名字是example,可以有多個DispatcherServlet,是通過名字來區分的。
async-supported
啟動一個新的線程去處理你的請求,完成之後調用你指定的回調函數來完成整個非同步操作。
一般的jsp是通過地址欄輸入一個地址,或者提交表單的方式發送請求的,這樣網頁都會被刷新。但是如果你在jsp頁面發送一個ajax請求的話,跟前兩種不同,
後台會返回給jsp頁面內容,頁面不會直接刷新,這樣可以把返回的數據寫在頁面的div中,這樣就完成了頁面的局部刷新。
舉個例子,你做一個查詢功能,頁面上有查詢條件和查詢結果顯示區域,你可以點查詢按鈕的時候通過ajax非同步發送你的查詢條件,
而你得到後台返回的查詢結果後,更新你的jsp頁面的查詢結果,jsp的其他部分,比如查詢條件,都沒有更新,jsp沒有刷新,而是更新了查詢結果這一塊內容
url-pattern 默認匹配所有請求Servlet攔截匹配規則可以自已定義1、攔截*.do、*.htm, 例如:/user/add.do,這是最傳統的方式,最簡單也最實用。不會導致靜態文件(jpg,js,css)被攔截。2、攔截/,例如:/user/add,可以實現現在很流行的REST風格。很多互聯網類型的應用很喜歡這種風格的URL。弊端:會導致靜態文件(jpg,js,css)被攔截後不能正常顯示。
監聽器
Listener獲取的是Web應用ServletContext(application)的配置參數。-為Web應用配置Listener的兩種方式: 使用@WebListener修飾Listener實現類即可 在web.xml文檔中使用進行配置。我們選擇web.xml這種配置方式,只有一個元素指定Listener的實現類.
②啟動WEB項目的時候,Tomcat容器首先會去它的配置文件讀取兩個節點listener和context-param。
然後Tomcat會創建一個ServletContext(application),WEB項目所有部分都將共享這個上下文
將applicationContext.xml存入ServletContext中
Tomcat容器根據class類路徑來創建監聽
上面這些都是在web項目還沒有完全啟動起來就完成的工作,而servlet是在第一次發起請求時被實例化的
而且一般不會被容器銷毀,並服務於多個用戶的請求.
web.xml的載入順序是: context-param-> listener -> filter -> servlet.
filter
Filter可認為是Servlet的「增強版」,因此Filter配置與Servlet的配置非常相似,需要配置兩部分:配置Filter名稱和Filter攔截器URL模式。區別在於Servlet通常只配置一個URL,而Filter可以同時配置多個請求的URL。配置Filter有兩種方式:
在Filter類中通過Annotation進行配置。
在web.xml文件中通過配置文件進行配置。
①網路
②http://blog.csdn.net/believejava/article/details/43229361
1.在web.xml里配置監聽器、過濾器、攔截器,書寫順序有沒有什麼要求?
根據網上資料來分析,應該是沒有書寫順序的要求,容器會按照自己的載入方式去載入順序.
2.監聽器是必須要配置的嗎?
不是必須要配置.
3假設配置了多個listener,那麼會先載入哪個listener
如果有多個listener的情況下,我們可以根據自己的需要去手動設置先去載入哪個listener.
今天的分享就到這里啦,歡迎大家點贊、轉發、留言、拍磚~
技能樹.IT修真院
「我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,掌控自己學習的節奏,學習的路上不再迷茫」。
這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學習路線,學習透明化,成長可見化,師兄1對1免費指導。快來與我一起學習吧~
http://www.jnshu.com/login/1/14708688
PPT : https://ptteng.github.io/PPT/PPT-java/Java-task2-webxml.html#/
❷ web.xml的過濾器路徑錯了,怎樣知道正確的過濾器路徑
1、用servlet寫一個請求過濾器就可以了。
2、在web.xml中配置上這個過濾器,然後寫上後綴「*.jsp"就可以了。
❸ 在web.xml中,配置過濾器出現的問題
你把順序寫錯了,它是根據上面的dtd規范來的,你把滑鼠移上錯誤那裡去看,它有每個標簽的先後順序,看那filter和filter-mapping是寫在servlet前面的,明白問題所在了么
❹ java項目和web項目中的過濾器文件怎麼使用
過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在伺服器上。過濾器可附加到一個或多個servlet或JSP頁面上,並且可以檢查進入這些資源的請求信息。在這之後,過濾器可以作如下的選擇:
1. 以常規的方式調用資源(即,調用servlet或JSP頁面)。
2.利用修改過的請求信息調用資源。
3. 調用資源,但在發送響應到客戶機前對其進行修改
4. 阻止該資源調用,代之以轉到其他的資源,返回一個特定的狀態代碼或生成替換輸出。
1. 建立基本過濾器
建立一個過濾器涉及下列五個步驟:
1)建立一個實現Filter介面的類。這個類需要三個方法,分別是:doFilter、init和destroy。
doFilter方法包含主要的過濾代碼(見第2步),init方法建立設置操作,而destroy方法進行清楚。
2)在doFilter方法中放入過濾行為。doFilter方法的第一個參數為ServletRequest對象。此對象給過濾器提供了對進入的信息(包括表單數據、cookie和HTTP請求頭)的完全訪問。第二個參數為ServletResponse,通常在簡單的過濾器中忽略此參數。最後一個參數為FilterChain,如下一步所述,此參數用來調用servlet或JSP頁。
3)調用FilterChain對象的doFilter方法。Filter介面的doFilter方法取一個FilterChain對象作為它的一個參數。在調用此對象的doFilter方法時,激活下一個相關的過濾器。如果沒有另一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被激活。
4)對相應的servlet和JSP頁面注冊過濾器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
5)禁用激活器servlet。防止用戶利用預設servlet URL繞過過濾器設置。
1.1 建立一個實現Filter介面的類
所有過濾器都必須實現javax.servlet.Filter。這個介麵包含三個方法,分別為doFilter、init和destroy。
public void doFilter(ServletRequset request,
ServletResponse response,
FilterChain chain)
thows ServletException, IOException
每當調用一個過濾器(即,每次請求與此過濾器相關的servlet或JSP頁面)時,就執行其doFilter方法。正是這個方法包含了大部分過濾邏輯。第一個參數為與傳入請求有關的ServletRequest。對於簡單的過濾器,大多數過濾邏輯是基於這個對象的。如果處理HTTP請求,並且需要訪問諸如getHeader或getCookies等在ServletRequest中無法得到的方法,就要把此對象構造成HttpServletRequest。
第二個參數為ServletResponse。除了在兩個情形下要使用它以外,通常忽略這個參數。首先,如果希望完全阻塞對相關servlet或JSP頁面的訪問。可調用response.getWriter並直接發送一個響應到客戶機。其次,如果希望修改相關的servlet或JSP頁面的輸出,可把響應包含在一個收集所有發送到它的輸出的對象中。然後,在調用serlvet或JSP頁面後,過濾器可檢查輸出,如果合適就修改它,之後發送到客戶機。
DoFilter的最後一個參數為FilterChain對象。對此對象調用doFilter以激活與servlet或JSP頁面相關的下一個過濾器。如果沒有另一個相關的過濾器,則對doFilter的調用激活servlet或JSP本身。
public void init(FilterConfig config) thows ServletException
init方法只在此過濾器第一次初始化時執行,不是每次調用過濾器都執行它。對於簡單的過濾器,可提供此方法的一個空體,但有兩個原因需要使用init。首先,FilterConfig對象提供對servlet環境及web.xml文件中指派的過濾器名的訪問。因此,普遍的辦法是利用init將FilterConfig對象存放在一個欄位中,以便doFilter方法能夠訪問servlet環境或過濾器名.其次,FilterConfig對象具有一個getInitParameter方法,它能夠訪問部署描述符文件(web.xml)中分配的過濾器初始化參數。
public void destroy( )
大多數過濾器簡單地為此方法提供一個空體,不過,可利用它來完成諸如關閉過濾器使用的文件或資料庫連接池等清除任務。
1.2 將過濾行為放入doFilter方法
doFilter方法為大多數過濾器地關鍵部分。每當調用一個過濾器時,都要執行doFilter。對於大多數過濾器來說,doFilter執行的步驟是基於傳入的信息的。因此,可能要利用作為doFilter的第一個參數提供的ServletRequest。這個對象常常構造為HttpServletRequest類型,以提供對該類的更特殊方法的訪問。
1.3 調用FilterChain對象的doFilter方法
Filter介面的doFilter方法以一個FilterChain對象作為它的第三個參數。在調用該對象的doFilter方法時,激活下一個相關的過濾器。這個過程一般持續到鏈中最後一個過濾器為止。在最後一個過濾器調用其FilterChain對象的doFilter方法時,激活servlet或頁面自身。
但是,鏈中的任意過濾器都可以通過不調用其FilterChain的doFilter方法中斷這個過程。在這樣的情況下,不再調用JSP頁面的serlvet,並且中斷此調用過程的過濾器負責將輸出提供給客戶機。
1.4 對適當的servlet和JSP頁面注冊過濾器
部署描述符文件的2.3版本引入了兩個用於過濾器的元素,分別是:filter和filter-mapping。filter元素向系統注冊一個過濾對象,filter-mapping元素指定該過濾對象所應用的URL。
下面是一個完整的例子:
//建立一個實現Filter介面的類。這個類需要三個方法,分別是:doFilter、init和destroy。
//doFilter方法包含主要的過濾代碼,init方法建立設置操作,而destroy方法進行清
package filterpkg;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class testFilter implements Filter{
public void init(FilterConfig filterConfig) throws ServletException
{
}
//在doFilter方法中放入過濾行為。doFilter方法的第一個參數為ServletRequest對象。
//此對象給過濾器提供了對進入的信息(包括表單數據、cookie和HTTP請求頭)的完全訪問。
//第二個參數為ServletResponse,通常在簡單的過濾器中忽略此參數。
//最後一個參數為FilterChain,如下一步所述,此參數用來調用servlet或JSP頁。
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain)
{
PrintWriter wout=null;
try
{
wout=response.getWriter();
}
catch(IOException e)
{
}
HttpServletRequest req=(HttpServletRequest)request;//將request轉化為它的子類HttpServletRequest
String uri=req.getRequestURI();//獲得傳入的URI
if (uri.indexOf("MyJsp.jsp")>0 ||uri.indexOf("MainForm.do")>0 )//如果是我們指定的登錄頁面或驗證頁面
{
try
{
//調用FilterChain對象的doFilter方法。Filter介面的doFilter方法取一個FilterChain對象作為它的一個參數。
//在調用此對象的doFilter方法時,激活下一個相關的過濾器。如果沒有另一個過濾器與servlet或JSP頁面關聯,則servlet或JSP頁面被激活。
filterChain.doFilter(request, response);
}
catch(Exception e)
{
}
return;
}
if (req.getSession()!=null)
if (req.getSession().getAttribute("USERID")==null)
{
wout.write("<HTML><BODY> Check error! <br/> </BODY> </HTML>");
wout.flush();
return;
}
try
{
filterChain.doFilter(request, response);
}
catch(Exception e)
{
}
}
public void destroy()
{
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>CHECKCODE</filter-name>
<filter-class>filterpkg.testFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CHECKCODE</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>ControlServlet</servlet-name>
<servlet-class>filterpkg.ControlServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ControlServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
❺ Servlet 3.0 之@WebFilter怎麼控制多個filter的執行順序
之前我們控制多個filter的執行順序是通過web.xml中控制filter的位置來控制的,放在上面的會比放在下面的先執行,如下「用戶登錄檢查過濾器」會比「介面日誌過濾器」先執行
<!--用戶登錄檢測過濾器-->
<filter>
<filter-name>UserLoginFilter</filter-name>
<filter-class>net.tfgzs.demo.filter.UserLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UserLoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--介面日誌過濾器-->
<filter>
<filter-name>ApiLog</filter-name>
<filter-class>net.tfgzs.demo.filter.ApiLog</filter-class>
</filter>
<filter-mapping>
<filter-name>ApiLog</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
但是當我們使用@WebFilter註解的時候發現註解裡面沒有提供可以控制執行順序的參數
通過實踐發現如果想要控制filer的執行順序可以通過控制filter的文件名來控制
比如:
UserLoginFilter.java 和 ApiLog.java 這兩個文件裡面分別是「用戶登錄檢查過濾器」和「介面日誌過濾器」,因為這兩個文件的
首字母A排U之前
,導致每次執行的時候都是先執行「介面日誌過濾器」再執行「用戶登錄檢查過濾器」,所以我們現在修改兩個文件的名稱分別為
Filter0_UserLogin.java
Filter1_ApiLog.java
這樣就能先執行「用戶登錄檢查過濾器」再執行「介面日誌過濾器」
❻ spring中過濾器(filter)、攔截器(interceptor)和切面(aop)的執行順序
過濾器是服務端的一個組件,是基於servlet實現從客戶端訪問服務端web資源的一種攔截機制,對請求request和響應response都進行過濾,依賴於serverlet容器,使用時,實現Filter介面,在web.xml里配置對應的class還有mapping-url。
攔截器,顧名思義,它的作用就是攔截,這個要和過濾器區分開,過濾器依賴serverlet容器,獲取request和response處理,是基於函數回調(框架本身調用的,它會遍歷所有注冊的過濾器,並且一一調用doFilter()),簡單說就是「去取你想取的」。攔截器是通過Java反射機制來攔截web請求,是「拒你想拒絕的」,它只攔截web請求,但不攔截靜態資源。
攔截器,在AOP中用於在某個方法或欄位被訪問之前,進行攔截,然後在之前或之後加入某些操作。攔截是AOP的一種實現策略。
相比過濾器,攔截器能夠知道用戶發出的請求最終被哪個控制器處理,但是攔截器還有一個明顯的不足,即不能夠獲取request的參數以及控制器處理之後的response。(注意 ,我曾經試過,獲得被攔截方法的一些參數,但是通過methodParaters無法獲得,後來只能通過request.getParameter(..)來獲取)所以就有了切片的用武之地了。
【Filter與Interceptor的區別】
【Interceptor 與spring AOP的區別】
❼ web.xml配置詳解
1、首先打開myeclipse新建web項目,如下圖所示。
❽ 當定義多個過濾器時,執行的順序是什麼樣的
filter和攔截器的區別和執行順序
1.Filter過濾器只過濾jsp文件不過濾action請求解決回方案
解決辦法:在web.xml中將答filter的配置放在struts2配置的前面。
2.攔截器與Filter的區別
Spring的攔截器與Servlet的Filter有相似之處,比如二者都是AOP編程思想的體現,都能實現許可權檢查、日誌記錄等。不同的是:
使用范圍不同:Filter是Servlet規范規定的,只能用於Web程序中。而攔截器既可以用於Web程序,也可以用於Application、Swing程序中。
規范不同:Filter是在Servlet規范中定義的,是Servlet容器支持的。而攔截器是在Spring容器內的,是Spring框架支持的。
使用的資源不同:同其他的代碼塊一樣,攔截器也是一個Spring的組件,歸Spring管理,配置在Spring文件中,因此能使用Spring里的任何資源、對象,例如Service對象、數據源、事務管理等,通過IoC注入到攔截器即可;而Filter則不能。
❾ web.xml中怎麼修改servlet,filter執行順序
servlet可以通過<load-on-startup>n</load-on-startup>設置,但是filter不可以,filter會早於servlet執行,所以需要在filter設置具體的過濾
❿ 在web.xml中加入過濾器
在web.xml中加入過濾器,參考代碼如下:
<filter>
<filter-name>authority</filter-name> //過濾器的名稱,可以自行修改
<filter-class>com.topcheer.filter.AuthorityFilter</filter-class>
<init-param> //初始化的參數
<param-name>NotRequiredAuthorityURL</param-name>
<param-value>/downloadImageControl.action,/initLogin.action,/default.jsp,/logout.jsp,/invalidation.jsp,/login.action,/default.action</param-value>
</init-param> //初始化的參數
<init-param> //初始化的參數
<param-name>invalidURL</param-name> //過濾器要過濾的對象,可自行設置
<param-value>/invalidation.jsp</param-value>
</init-param>
</filter>
<filter-mapping> //過濾器映射
<filter-name>authority</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping> //過濾器映射
<filter-mapping> //過濾器映射
<filter-name>authority</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>