戲說java web開發中的listener和filter

火星人 @ 2014-03-09 , reply:0


  今天在公司看到有同事在寫filter,晚上一個人在家無聊,就想聊聊這個東西.

  jsp開發中的JianTingQi和過濾器,這兩個東西要說起來,很大,很繁.今天我想用一個現實的例子,來說明這兩個東東的作用.

  案例描述

  假設你平時生活在北京,有天你去一個很邊遠很貧窮的山村體驗生活,到了那個山村后,你想要什麼東西,村長都會同意,然後安排村民送給你,但是有一點例外的是,一旦你問他們要錢,村長堅決不給,還會帶領村民把你打回北京去.

  你為了從村民那裡帶走盡量多的東西,所以你在出發前準備了一個大袋子,希望把村民給的東西都放到袋子里;然後你在回到城市后,這個袋子就沒用了,你就把這個袋子給扔了.

  代碼模擬

  恩,我想用如下簡單代碼來模擬以上案例,大家可以想一下JianTingQi扮演者什麼角色?過濾器扮演什麼角色?

  1. 新建一個java web project;

  2. 默認的index.jsp頁面上加上兩個鏈接,模擬要村民要紅薯和要錢,如下:

  <html>

  <body>

  <h1>歡迎掉入無名村,哈哈</h1><br>

  <ahref="hongshu.jsp">給紅薯</a><br/>

  <ahref="money.jsp">給錢</a><br/>

  </body>

  </html>

  3. 新建一個大布袋類:BigBag.java,如下:

  packagechb.demo.web;

  importjava.util.HashMap;

  publicclassBigBag...{

  publicstaticHashMap<String,Integer>bag;//村民的東西就放在這個袋子里

  }

  4. 新建一個JianTingQi:MyListener.java,如下:

  packagechb.demo.web;

  importjava.util.HashMap;

  importjavax.servlet.ServletContextEvent;

  importjavax.servlet.ServletContextListener;

  publicclassMyListenerimplementsServletContextListener...{

  publicvoidcontextDestroyed(ServletContextEventarg0)...{

  BigBag.bag=null;

  System.out.println("回城了,讓掉爛袋子吧");

  }

  publicvoidcontextInitialized(ServletContextEventarg0)...{

  BigBag.bag=newHashMap<String,Integer>();

  System.out.println("要進山了,準備好布袋子");

  }

  }

  5. 再新建一個過濾器:MyFilter.java,如下:

  packagechb.demo.web;

  importjava.io.IOException;

  importjavax.servlet.Filter;

  importjavax.servlet.FilterChain;

  importjavax.servlet.FilterConfig;

  importjavax.servlet.ServletException;

  importjavax.servlet.ServletRequest;

  importjavax.servlet.ServletResponse;

  importjavax.servlet.http.HttpServletRequest;

  importjavax.servlet.http.HttpServletResponse;

  publicclassMyFilterimplementsFilter...{

  publicvoiddestroy()...{

  }

  publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,

  FilterChainchain)throwsIOException,ServletException...{

  HttpServletRequestreq=(HttpServletRequest)request;

  HttpServletResponsersp=(HttpServletResponse)response;

  if(req.getRequestURI().toString().endsWith("money.jsp"))...{

  //什麼時候有過錢啊?打回北京去

  rsp.sendRedirect("gohome.jsp");

  System.out.println("什麼時候有過錢啊,滾回家去!");

  return;

  }elseif(req.getRequestURI().toString().endsWith("hongshu.jsp"))...{

  if(BigBag.bag.containsKey("hongshu"))...{

  intnum=BigBag.bag.get("hongshu") 1;

  BigBag.bag.put("hongshu",num);

  System.out.println("得到第" num "個紅薯");

  }else...{

  BigBag.bag.put("hongshu",1);

  System.out.println("得到第1個紅薯");

  }

  //村長同意了,下面就是到村民家中拿了..

  chain.doFilter(request,response);

  }else...{

  //只要不要錢就行,放行

  chain.doFilter(request,response);

  }

  }

  publicvoidinit(FilterConfigfilterConfig)throwsServletException...{

  }

  }

  6. 在web.xml中配置JianTingQi和過濾器,如下所示:

  <?xmlversion="1.0"encoding="UTF-8"?>

  <web-appversion="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>myFilter</filter-name>

  <filter-class>chb.demo.web.MyFilter</filter-class>

  </filter>

  <filter-mapping>

  <filter-name>myFilter</filter-name>

  <url-pattern>/*</url-pattern>

  </filter-mapping>

  <listener>

  <listener-class>chb.demo.web.MyListener</listener-class>

  </listener>

  <welcome-file-list>

  <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

  </web-app>

  好了,大功告成,部署運行,觀察結果怎樣?

  分析結果

  我們會觀察到如下結果:

  當服務啟動過程中,控制台輸出「要進山了,準備好布袋子」

  當點擊一下「給紅薯」的鏈接時,控制台會輸出「得到第x個紅薯」

  當點擊一下「給錢」的鏈接時,控制台輸出「什麼時候有過錢啊,滾回家去!」

  怎麼樣?有點明白了?

  其實,JianTingQi就是在服務啟動之前做好保證服務正常運行的準備工作,服務結束的時候再善後一下;對應案例中的情況,就是在上路之前把袋子準備好,回來了把袋子扔掉;類似保姆的工作,照顧孩子起床,再照顧孩子睡下.

  過濾器就是針對伺服器的請求,加以過濾限制;對應案例中的情況,就是村長了,掌握著生殺大權,什麼事都得過我這關才行^_^




[火星人 via ] 戲說java web開發中的listener和filter已經有60次圍觀

http://www.coctec.com/docs/java/show-post-60589.html