1: MyCharsetFilter.java 編碼過(guò)濾器
2: package ...;
3: import ...;
4:
5: // 主要目的:過(guò)濾字符編碼;其次,做一些應(yīng)用邏輯判斷等.
6: // Filter跟web應(yīng)用一起啟動(dòng)
7: // 當(dāng)web應(yīng)用重新啟動(dòng)或銷毀時(shí),F(xiàn)ilter也被銷毀
8: public class MyCharsetFilter implements Filter {
9: private FilterConfig config = null;
10:
11: public void destroy() {
12: System.out.println("MyCharsetFilter準(zhǔn)備銷毀...");
13: }
14:
15: public void doFilter(ServletRequest arg0, ServletResponse arg1,
16: FilterChain chain) throws IOException, ServletException {
17: // 強(qiáng)制類型轉(zhuǎn)換
18: HttpServletRequest request = (HttpServletRequest)arg0;
19: HttpServletResponse response = (HttpServletResponse)arg1;
20: // 獲取web.xm設(shè)置的編碼集,設(shè)置到Request、Response中
21: request.setCharacterEncoding(config.getInitParameter("charset"));
22: response.setContentType(config.getInitParameter("contentType"));
23: response.setCharacterEncoding(config.getInitParameter("charset"));
24:
25: // 將請(qǐng)求轉(zhuǎn)發(fā)到目的地
26: chain.doFilter(request, response);
27: }
28:
29: public void init(FilterConfig arg0) throws ServletException {
30: this.config = arg0;
31: System.out.println("MyCharsetFilter初始化...");
32: }
33: }
以下是 MyCharsetFilter.java 在web.xml 中配置:
1: <filter>
2: <filter-name>filter</filter-name>
3: <filter-class>dc.gz.filters.MyCharsetFilter</filter-class>
4: <init-param>
5: <param-name>charset</param-name>
6: <param-value>UTF-8</param-value>
7: </init-param>
8: <init-param>
9: <param-name>contentType</param-name>
10: <param-value>text/html;charset=UTF-8</param-value>
11: </init-param>
12: </filter>
13: <filter-mapping>
14: <filter-name>filter</filter-name>
15: <!-- * 代表截獲所有的請(qǐng)求 或指定請(qǐng)求/test.do /xxx.do -->
16: <url-pattern>/*</url-pattern>
17: </filter-mapping>
以上的例子簡(jiǎn)單的說(shuō)明了Filter的使用,具體其他的應(yīng)用可以看具體的場(chǎng)景。
現(xiàn)在來(lái)說(shuō)說(shuō)Servlet的監(jiān)聽(tīng)器Listener,它是實(shí)現(xiàn)了javax.servlet.ServletContextListener 接口的服務(wù)器端程序,它也是隨web應(yīng)用的啟動(dòng)而啟動(dòng),只初始化一次,隨web應(yīng)用的停止而銷毀。主要作用是: 做一些初始化的內(nèi)容添加工作、設(shè)置一些基本的內(nèi)容、比如一些參數(shù)或者是一些固定的對(duì)象等等。下面利用監(jiān)聽(tīng)器對(duì)數(shù)據(jù)庫(kù)連接池DataSource的初始化演示它的使用:
1: MyServletContextListener.java
2: package dc.gz.listeners;
3: import javax.servlet.ServletContext;
4: import javax.servlet.ServletContextEvent;
5: import javax.servlet.ServletContextListener;
6: import org.apache.commons.dbcp.BasicDataSource;
7:
8: /**
9: * Web應(yīng)用監(jiān)聽(tīng)器
10: */
11: public class MyServletContextListener implements ServletContextListener {
12:
13: // 應(yīng)用監(jiān)聽(tīng)器的銷毀方法
14: public void contextDestroyed(ServletContextEvent event) {
15: ServletContext sc = event.getServletContext();
16: // 在整個(gè)web應(yīng)用銷毀之前調(diào)用,將所有應(yīng)用空間所設(shè)置的內(nèi)容清空
17: sc.removeAttribute("dataSource");
18: System.out.println("銷毀工作完成...");
19: }
20:
21: // 應(yīng)用監(jiān)聽(tīng)器的初始化方法
22: public void contextInitialized(ServletContextEvent event) {
23: // 通過(guò)這個(gè)事件可以獲取整個(gè)應(yīng)用的空間
24: // 在整個(gè)web應(yīng)用下面啟動(dòng)的時(shí)候做一些初始化的內(nèi)容添加工作
25: ServletContext sc = event.getServletContext();
26: // 設(shè)置一些基本的內(nèi)容;比如一些參數(shù)或者是一些固定的對(duì)象
27: // 創(chuàng)建DataSource對(duì)象,連接池技術(shù) dbcp
28: BasicDataSource bds = new BasicDataSource();
29: bds.setDriverClassName("com.mysql.jdbc.Driver");
30: bds.setUrl("jdbc:mysql://localhost:3306/hibernate");
31: bds.setUsername("root");
32: bds.setPassword("root");
33: bds.setMaxActive(10);//最大連接數(shù)
34: bds.setMaxIdle(5);//最大管理數(shù)
35: //bds.setMaxWait(maxWait); 最大等待時(shí)間
36: // 把 DataSource 放入ServletContext空間中,
37: // 供整個(gè)web應(yīng)用的使用(獲取數(shù)據(jù)庫(kù)連接)
38: sc.setAttribute("dataSource", bds);
39: System.out.println("應(yīng)用監(jiān)聽(tīng)器初始化工作完成...");
40: System.out.println("已經(jīng)創(chuàng)建DataSource...");
41: }
42: }
web.xml中配置如下,很簡(jiǎn)單:
1: <!-- 配置應(yīng)用監(jiān)聽(tīng)器 -->
2: <listener>
3: <listener-class>dc.gz.listeners.MyServletContextListener</listener-class>
4: </listener>
這樣配置好了之后,以后在web應(yīng)用中就可以通過(guò)ServletContext取得BasicDataSource對(duì)象,從而獲取與數(shù)據(jù)庫(kù)的連接,提高性能,方便使用。
上面通過(guò)兩個(gè)示例演示了Filter和Listener的基本使用,對(duì)于其它的應(yīng)用則需要我們?cè)陧?xiàng)目開(kāi)發(fā)中根據(jù)具體的場(chǎng)景選擇。多多去挖掘。
聯(lián)系客服