可以看到web容器一啟動就會實例化監聽器的contextInitialized(ServletContextEvent event)方法,然后是過濾器的init()方法,最后在用戶訪問web應用的 時候會先執行過濾器的doFilter()方法,以及過濾器鏈,最后執行繼承了HttpServlert的自定義Servlet里復寫的doPost()方法或者doGet方法。


1 web容器初始化:
初始化順序:
a.監聽器ServletContextListener接口實現類復寫的
1 public void contextInitialized(ServletContextEvent event) { 2 3 }
b.過濾器Filter接口的實現類復寫的
public void init(FilterConfig filterConfig) throws ServletException { String para1 = filterConfig.getInitParameter("para1"); System.out.println("衛永樂WylFilter.init()..."); }
如果有多個過濾器,那么過濾器的初始化順序是web.xml中配置由下到上的(注意:容器啟動的時候的初始化順序是由下到上,但是在用戶進行資源的訪問的時候,過濾器復寫的
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)方法是由上至下的,也就是還是按照web.xml中配置的順序由上到下執行,只是初始化的時候的順序是相反的
)。
2 用戶訪問web資源:
容器的執行順序:
a.過濾器的doFilter方法,
@SuppressWarnings("all")
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("衛永樂WylFilter.doFilter() begin...");
/**
* 設置編碼集,統一為UTF-8,這樣就不會有亂碼的存在,因為除了web容器啟動完成后,
* 每次的請求都會最先被WylFilter先攔截,所以只要在這個地方設置一下字符集就行了,
* 不需要每次都在自定義的Servlet里設置字符集
*/
HttpServletRequest httpReq = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
resp.setCharacterEncoding("UTF-8");
resp.setHeader("Content-type", "text/html;charset=UTF-8");
//增加登錄校驗
checkLoginStatus(request,response);
String requestURI = httpReq.getRequestURI().substring(
httpReq.getRequestURI().indexOf("/", 1),
httpReq.getRequestURI().length());
System.out.println("requestURI:"+requestURI);
//如果請求uri不包含 login.jsp,那么就檢查是否已經登錄了。
if(requestURI.indexOf("login.jsp")==-1){
//獲取請求內容,對請求內容進行過濾
String reqContent = httpReq.getQueryString();
List<String> list = UtilProperties.GetContentByKeytoStringArr("keyContent.properties","invalidWords");
//先清空
response.getWriter().write("");
//只有reqContent不等於null的時候才能對其進行內容的過濾
if(null!=reqContent){
for(int i=0;i<list.size();i++){
if(reqContent.indexOf(list.get(i))!=-1){
response.getWriter().write("the request is not valid because it contains:"+list.get(i));
System.out.println("the request is not valid because it contains: "+list.get(i));
}
}
}
//getParameterValues()獲取鍵為df的所有值,返回值是數組
String[] paraValues = request.getParameterValues("df");
String sss = request.getParameter("df");
System.out.println("sss:"+sss);
request.getScheme();//獲取請求使用的通訊協議,比如通過http請求,那么返回值就是"http"
request.getServerName();//獲取服務器主機名,實際上就是獲取服務器ip地址
request.getServerPort();//獲取服務器端口號
Enumeration em = request.getAttributeNames();
Map map = new HashMap();
if(em.hasMoreElements()){
Object o = em.nextElement();
map.put(""+o, o);
}
System.out.println("map:"+map);
}
chain.doFilter(request, response);
System.out.println("衛永樂WylFilter.doFilter() end...");
}
b.Servlet的doGet(HttpServletRequest req, HttpServletResponse resp)方法或者protected void doPost(HttpServletRequest req, HttpServletResponse resp)方法。
如果有多個過濾器,那么在第一個過濾器中執行了chain.doFilter(request,response)這行代碼后就會執行下一個過濾器的doFilter(request,response)方法,直到執行最后一個過濾器的doFilter(request,response)方法,然后執行Servlet里的doGet(HttpServletRequest req, HttpServletResponse res)方法,
例如:
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("衛永樂WylServlet1.doGet() begin..."); Enumeration<Object> em = req.getHeaderNames(); if(em.hasMoreElements()){ String headName = (String)em.nextElement(); String head = req.getHeader(headName); System.out.println("衛永樂WylServlet1.doGet()方法執行中...,header:"+head); } String path = req.getContextPath(); /*resp.setCharacterEncoding("UTF-8"); resp.setHeader("Content-type", "text/html;charset=UTF-8"); */ String content = "我是PrintWriter對象輸入到頁面的內容,哈哈哈哈,HttpServletRequest.getContextPath()"+path; PrintWriter out = resp.getWriter(); out.write(content); System.out.println("衛永樂WylServlet1.doGet() end..."); }
