日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java listen_JavaWeb之Filter、Listener

發布時間:2025/3/8 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java listen_JavaWeb之Filter、Listener 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

昨天和大家介紹了一下JSON的用法,其實JSON中主要是用來和數據庫交互數據的。今天給大家講解的是Filter和Listener的用法。

一、Listenner監聽器

1.1、定義

Javaweb中的監聽器是用于監聽web常見對象HttpServletRequest,HttpSession,ServletContext。

1.2、監聽器的作用

監聽web對象創建與銷毀.

監聽web對象的屬性變化

監聽session綁定javaBean操作.

1.3、監聽機制中的概念

事件----一件事情

事件源---產生這件事情的源頭

注冊監聽---將監聽器與事件綁定,當事件產生時,監聽器可以知道,并進行處理。

監聽器---對某件事情進行處理監聽的一個對象

二、JavaWeb中常見的監聽器

2.1、創建一個監聽器的步驟

創建一個類,實現需要監聽器的接口

重寫接口中的方法

在web.xml中配置注冊該監聽器

2.2、監聽域對象的創建與銷毀

監聽ServletContext創建與銷毀 ServletContextListener

監聽HttpSession創建與銷毀 HttpSessionListener

監聽HttpServletRequest創建與銷毀 ServletRequestListener

下面為大家展示的實例,首先我們的實例在jsp中進行的話,我們要明確這三個域對象什么時候被jsp創建什么時候又被銷毀呢。

在ServletContext中是服務器開啟的時候就被創建,當服務器關閉的時候就被銷毀

在session中,jsp里的page指令中可以配置默認是ture的,所以當你加載這個jsp頁面的時候session就被創建了,而銷毀的話就有

四種方法:默認超時30分鐘、關閉服務器、invalidate()方法、setMaxInactiveInterval(int interval) 可以設置超時時間,在servlet中

需要通過request.getSseeion()來創建session。

在request中,發送請求服務器就會創建它,當響應產生時,request對象就會銷毀。在jsp頁面的話,你加載開始創建,加載完就銷毀了。

2.2.1、實例:監聽域對象的創建與銷毀

這里只演示一個,其他的兩個同理都是這樣子操作的。

HttpServletListener監聽器

a.創建類,實現HttpServletListener接口,并重寫方法

packagetest;importjavax.servlet.http.HttpSessionEvent;importjavax.servlet.http.HttpSessionListener;public class MyHttpSessionListener implementsHttpSessionListener {

@Overridepublic voidsessionCreated(HttpSessionEvent arg0) {

System.out.println("session被創建了");

}

@Overridepublic voidsessionDestroyed(HttpSessionEvent arg0) {

System.out.println("session被銷毀了");

}

}

View Code

b.在web.xml中的配置

c.在newFile.jsp中測試

注:在jsp中我添加了invalidate方法來測試銷毀

d.結果

2.3、監聽域對象的屬性變化

監聽ServletContext屬性變化 ServletContextAttributeListener

監聽HttpSession屬性變化 HttpSessionAttributeListener

監聽HttpServletRequest屬性變化 ServletRequestAttributeListener

2.3.1、實例:監聽域對象的實例變化

a.創建一個MyServletRequest類繼承ServletRequestAttributeListener接口,并實現改接口方法

packagetest;importjavax.servlet.ServletRequestAttributeEvent;importjavax.servlet.ServletRequestAttributeListener;public class MyServletRequest implementsServletRequestAttributeListener{

@Overridepublic voidattributeAdded(ServletRequestAttributeEvent arg0) {

System.out.println("requestAttribute添加了屬性");

}

@Overridepublic voidattributeRemoved(ServletRequestAttributeEvent arg0) {//TODO Auto-generated method stub

System.out.println("requestAttribute被移除了");

}

@Overridepublic voidattributeReplaced(ServletRequestAttributeEvent arg0) {//TODO Auto-generated method stub

System.out.println("requestAttribute被替換了");

System.out.println(arg0.getName()+arg0.getValue());

}

}

View Code

b.在web.xml中注冊該監聽器

test.MyServletRequest

c.在jsp測試一下

結果:

當我們在添加一個removeAttribute()方法時

2.4、監聽session綁定javabean

2.4.1、HttpSessionBindingListener(這個是用javabean去實現的,所以不需要去注冊)

用于監聽javaBean對象是否綁定到了session域

創建一個User去實現HttpSessionBindingListener接口

packagetest;importjavax.servlet.http.HttpSessionBindingEvent;importjavax.servlet.http.HttpSessionBindingListener;public class User implementsHttpSessionBindingListener {privateString name;private intage;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

@Overridepublic voidvalueBound(HttpSessionBindingEvent arg0) {

System.out.println("User對象被session綁定了!");

}

@Overridepublic voidvalueUnbound(HttpSessionBindingEvent arg0) {

System.out.println("User對象解除session綁定了!");

}

}

View Code

在jsp頁面中測試

結果:

注意:不需要再web.xml中去配置該監聽器,在執行setAttrubute()方法的時候自動去識別該監聽器

2.4.2.HttpSessionActivationListener

用于監聽javaBean對象的活化與鈍化。

HttpSessionActivationListener如果javaBean實現了這個接口,那么當我們正常關閉服務器時,session中的javaBean對象就會被鈍化到我們指定的文件中。

當下一次在啟動服務器,因為我們已經將對象寫入到文件中,這時就會自動將javaBean對象活化到session中。

首先我們要明白什么是活化與鈍化等下單獨寫一篇文章介紹活化與鈍化

我們還需要個context.xml文件來配置鈍化時存儲的文件

三、Filter

接下來為大家講解的是Filter,這個相對于Listener來說就重要的多了,它的應用非常的廣泛,主要是起到一個過濾、攔截的作用。

3.1、Filter的定義

Javaweb中的過濾器可以攔截所有訪問web資源的請求或響應操作。執行過濾任務的對象,這些任務是針對對某一資源(servlet 或靜態內容)的請求或來自某一資源的響應執行的,抑或同時針對這兩者執行。

3.2、怎么創建一個過濾器

創建一個類實現Filter接口

重寫接口中方法 doFilter方法是真正過濾的

在web.xml文件中配置

注意:在Filter的doFilter方法內如果沒有執行chain.doFilter(request,response)那么資源是不會被訪問到的。

3.3、實例

首先我創建了一個MyFilter.java實現Filter接口

packagecom.jxlg.filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;public class MyFilter implementsFilter{

@Overridepublic voiddestroy() {

}

@Overridepublic voiddoFilter(ServletRequest req, ServletResponse res,

FilterChain chain)throwsIOException, ServletException {

System.out.println("doFilter執行了");

chain.doFilter(req, res);//放行

System.out.println("執行完返回到客戶端");

}

@Overridepublic void init(FilterConfig arg0) throwsServletException {

}

}

View Code

在web.xml中配置過濾器

MyFilter

com.jxlg.filter.MyFilter

MyFilter

/demo1

View Code

寫一個servlet讓MyFilter進行過濾

結果

3.4、FilterChain

FilterChain 是 servlet 容器為開發人員提供的對象,它提供了對某一資源的已過濾請求調用鏈的視圖。過濾器使用 FilterChain 調用鏈中的下一個過濾器,如果調用的過濾器是鏈中的最后一個過濾器,則調用鏈末尾的資源。

問題:怎樣可以形成一個Filter鏈?

只要多個Filter對同一個資源進行攔截就可以形成Filter鏈

問題:怎樣確定Filter的執行順序?

由來確定,在web.xml文件中哪一個過濾器的放到了前面誰就先執行。

3.5、Filter的生命周期

Servlet生命周期:

實例化 --》 初始化--》 服務--》 銷毀

當服務器啟動,會創建Filter對象,并調用init方法,只調用一次.

當訪問資源時,路徑與Filter的攔截路徑匹配,會執行Filter中的doFilter方法,這個方法是真正攔截操作的方法.

當服務器關閉時,會調用Filter的destroy方法來進行銷毀操作.

3.6、FilterConfig

在Filter的init方法上有一個參數,類型就是FilterConfig.

FilterConfig它是Filter的配置對象,它可以完成下列功能

1.獲取Filtr名稱

2.獲取Filter初始化參數

3.獲取ServletContext對象。

怎么獲取到一個filterConfig對象

fiterConfig中的方法

實例:獲取web.xml文件中的字符編碼,用來過濾,告知服務器請求用的是什么編碼。

packagecom.jxlg.filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;public class MyFilterConfig implementsFilter {privateFilterConfig filterConfig;

@Overridepublic voiddestroy() {

}

@Overridepublic voiddoFilter(ServletRequest request, ServletResponse response,

FilterChain chain)throwsIOException, ServletException {//通過filterConfig來獲取配置信息中的初始化參數

String encoding = filterConfig.getInitParameter("encoding");

request.setCharacterEncoding(encoding);

chain.doFilter(request, response);//放行

}

@Overridepublic void init(FilterConfig filterConfig) throwsServletException {this.filterConfig =filterConfig;

}

}

View Code

web.xml中的配置信息

MyFilterConfig

com.jxlg.filter.MyFilterConfig

encoding

UTF-8

MyFilterConfig

/*

View Code

3.7、Filter配置

基本配置

filter名稱

Filter類的包名.類名

filter名稱

路徑

關于其它配置

1.

完全匹配 以”/demo1”開始,不包含通配符*

目錄匹配 以”/”開始 以*結束

擴展名匹配 *.xxx 不能寫成/*.xxx

2.

它是對指定的servlet名稱的servlet進行攔截的。

3.

可以取的值有 REQUEST FORWARD ERROR INCLUDE

它的作用是:當以什么方式去訪問web資源時,進行攔截操作.

1.REQUEST 當是從瀏覽器直接訪問資源,或是重定向到某個資源時進行攔截方式配置的 它也是默認值

2.FORWARD 它描述的是請求轉發的攔截方式配置

3.ERROR 如果目標資源是通過聲明式異常處理機制調用時,那么該過濾器將被調用。除此之外,過濾器不會被調用。

4.INCLUDE 如果目標資源是通過RequestDispatcher的include()方法訪問時,那么該過濾器將被調用。除此之外,該過濾器不會被調用。

四、使用Fliter實現自動登錄

這個例子就是一個簡單的登錄驗證與數據庫交互,我們使用Fliter來實現自動登錄。

思路分析:

login.jsp

${msg}

用戶名:密碼:

自動登陸

View Code

FindUserServlet.java

這里獲取了表單提交的數據,然后如果按了自動登錄,我們就會把用戶名和密碼保存到cooki中去

packagecom.jxlg.web.servlet;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.jxlg.web.domain.User;importcom.jxlg.web.service.UserService;public class FindUserServlet extendsHttpServlet {public voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {//獲取表單數據

String username = request.getParameter("username");

String password= request.getParameter("password");//處理業務邏輯

UserService us = newUserService();

User user=us.findUser(username,password);if(user!=null){

String autoLogin= request.getParameter("autoLogin");

Cookie cookie= new Cookie("user",user.getUsername()+"&"+user.getPassword());

cookie.setPath("/");if(autoLogin!=null){//將用戶名和密碼保存到cookie中

cookie.setMaxAge(60*60*24*7);

}else{//清除cookie

cookie.setMaxAge(0);

}

response.addCookie(cookie);//把cookie保存到客戶端

request.getSession().setAttribute("u", user);

request.getRequestDispatcher("/home.jsp").forward(request, response);

}else{

request.setAttribute("msg", "用戶名或密碼輸入錯誤,請重新登陸");

request.getRequestDispatcher("/login.jsp").forward(request, response);

}

}public voiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

doGet(request, response);

}

}

View Code

UserService

這里是service業務層代碼

ackage com.jxlg.web.service;importjava.sql.SQLException;importcom.jxlg.Dao.UserDao;importcom.jxlg.web.domain.User;public classUserService {

UserDao ud= newUserDao();publicUser findUser(String username, String password) {try{returnud.findUser(username,password);

}catch(SQLException e) {

e.printStackTrace();

}return null;

}

}

View Code

UserDao

這里是DAO實現類,與數據庫交互,我這里是用的是C3P0連接池,和dbUtils與數據庫交互

packagecom.jxlg.Dao;importjava.sql.SQLException;importorg.apache.commons.dbutils.QueryRunner;importorg.apache.commons.dbutils.handlers.BeanHandler;importcom.jxlg.util.C3P0Util;importcom.jxlg.web.domain.User;public classUserDao {public User findUser(String username, String password) throwsSQLException {

QueryRunner qr= newQueryRunner(C3P0Util.getDateSource());return qr.query("select * from user where username=? and password=?", new BeanHandler(User.class),username,password);

}

}

View Code

home.jsp

登錄成功跳轉的界面

View Code

MyFilter

這是一個過濾器,記住一定要去web.xml配置,如果我們在longin.jsp中選擇了自動登錄的話,我們可以直接訪問home.jsp實現自動登錄。

packagecom.jxlg.web.domain;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.jxlg.web.service.UserService;public class MyFilter implementsFilter{

@Overridepublic voiddestroy() {

}

@Overridepublic voiddoFilter(ServletRequest request, ServletResponse response,

FilterChain Chain)throwsIOException, ServletException {//轉化兩個對象

HttpServletRequest req =(HttpServletRequest)request;

HttpServletResponse res=(HttpServletResponse) response;

String uri=req.getRequestURI();//System.out.println(uri);///StudentLogin/login.jsp

String path =req.getContextPath();

path=uri.substring(path.length());//System.out.println(path);///login.jsp

if("/login.jsp".equals(path)||"/servlet/findUserServlet".equals(path)){

User user= (User) req.getSession().getAttribute("u");//如果用戶沒有登錄過,我們就執行登錄操作。

if(user==null){//得到cookies數組

Cookie[] cookies =req.getCookies();

String username="";

String password="";//從cookie中找到想要的user對象

for(int i=0;cookies!=null&&i

String value= cookies[i].getValue(); //tom&123

String[] values = value.split("&");

username= values[0];

password= values[1];

}

}//執行登錄操作

UserService us = newUserService();

User u=us.findUser(username, password);//如果登錄成功,把user保存到session中

if(user!=null){

req.getSession().setAttribute("u", u);

}

}

}//放行

Chain.doFilter(request, response);

}

View Code

開發中遇到的問題

1.在寫MyFilter中,在遍歷保存在客戶端的cookie的時候,我沒有家伙寫cookies!=null,這樣會導致空指針異常

2.在使用HttpServletRequest時,記住在Filter中一定要記住,進行轉化,因為在Filter中是ServletRequest對象。

3.因為我在Filter中web.xml文件中配置的url-pattern是當前應用的所有url,所以當我們請求的每一個資源都會調用Filter進行過濾,但是我們并不需要在login.jsp等也自動登錄,所以就記得要排除掉這些。

提供源碼,收好不謝:

鏈接:http://pan.baidu.com/s/1c1K6UJ2 密碼:mewe

五、全局編碼的過濾器

前言:

使用過濾器對post請求的亂碼進行過濾,測試之后是沒有問題的,但是當我們是get請求的時候,我們該怎么去處理呢?

怎樣可以做成一個通用的,可以處理post,get所有的請求的?

在java中怎樣可以對一個方法進行功能增強?

1.繼承

2.裝飾設計模式

1.創建一個類讓它與被裝飾類實現同一個接口或繼承同一個父類

2.在裝飾類中持有一個被裝飾類的引用

3.重寫要增強的方法

分析:我們獲取請求參數無非就三種方式:getParameter、getParameterValues、getParameterMap.

我們知道getParameter與getParameterValue方法可以依賴于getParamterMap方法來實現。

login.jsp

username:
username:

View Code

LoginServlet

public voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

String name1= request.getParameter("username1");

String name= request.getParameterValues("username")[0];

System.out.println(name);

System.out.println(name1);

}

View Code

MyFilter

packagecom.itheima.filter;importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.util.Map;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.HttpServletRequestWrapper;public class MyFilter implementsFilter {public void init(FilterConfig filterConfig) throwsServletException {

}public voiddoFilter(ServletRequest request, ServletResponse response,

FilterChain chain)throwsIOException, ServletException {

HttpServletRequest req=(HttpServletRequest) request;//解決post方式//req.setCharacterEncoding("UTF-8");

req = newMyRequest(req);

chain.doFilter(req, response);

}public voiddestroy() {

}

}//實現與被包裝對象相同的接口//定義一個與被包裝類相對象的引用//定義一個構造方法,把被包裝對象傳過來//對于不需要改寫方法,直接調用//對于無需要改寫方法,寫自己的方法體

class MyRequest extendsHttpServletRequestWrapper {

HttpServletRequest request;//是用于接收外部傳遞的原始的request

publicMyRequest(HttpServletRequest request) {super(request);//是因為父類沒有無參數構造

this.request =request;

}/** @Override public String getParameter(String name) { name =

* request.getParameter(name);//亂碼 try { return new

* String(name.getBytes("iso-8859-1"),"UTF-8"); } catch

* (UnsupportedEncodingException e) { e.printStackTrace(); } return null; }*/@OverridepublicString getParameter(String name) {

Map map =getParameterMap();return map.get(name)[0];

}

@OverridepublicString[] getParameterValues(String name) {

Map map =getParameterMap();returnmap.get(name);

}private boolean flag = true;

@Overridepublic MapgetParameterMap() {

Map map = request.getParameterMap();//亂碼

if(flag) {for (Map.Entrym : map.entrySet()) {

String[] values=m.getValue();for (int i = 0; i < values.length; i++) {try{

values[i]= newString(

values[i].getBytes("iso-8859-1"), "UTF-8");

}catch(UnsupportedEncodingException e) {

e.printStackTrace();

}

}

}

flag= false;

}returnmap;

}

}

View Code

總結

以上是生活随笔為你收集整理的java listen_JavaWeb之Filter、Listener的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美女屁股眼视频网站 | 拔插拔插海外华人永久免费 | 美女主播在线观看 | 91大神精品在线 | 欧美一区二区三区四区视频 | 男生女生操操操 | 国内一区二区三区 | 婷婷六月综合网 | 久久久久久久美女 | 国产婷婷色一区二区 | 成人区人妻精品一区二 | 久久奇米| 黄页网址大全免费观看 | 久久99国产精品久久99果冻传媒 | 日本wwww视频 | 免费在线a | 99视频这里有精品 | 婷婷在线视频观看 | 吊视频一区二区三区 | 日韩精品一区二区亚洲av观看 | 公交上高潮的丁芷晴 | 免费看黄网址 | 草逼视频免费看 | 国产又黄又猛的视频 | 色秀视频网 | 久热精品视频在线观看 | 美女免费看片 | 啪啪五月天 | 国产精品羞羞答答 | 久久人妻免费视频 | 成人av一级 | 午夜天堂视频 | 久久精品大全 | 欧美在线aa| 久热只有精品 | 中国字幕一色哟哟 | 香蕉视频在线免费 | 男人天堂视频网站 | 国产午夜精品久久久久久久久久 | a黄色一级片 | 精品国产人妻一区二区三区 | 人人超碰97 | 天天摸天天操天天干 | 第一章婶婶的性事 | 亚洲国产福利视频 | 久久综合区 | 国产91免费在线观看 | 成人免费视频网 | 四虎影视免费永久大全 | 久久精品视频8 | av夜夜操 | 欧美婷婷 | 性——交——性——乱免费的 | 宗合久久| av动漫天堂 | 射影院 | 黄色免费网 | 爆乳熟妇一区二区三区 | 日韩中文电影 | 肥臀熟女一区二区三区 | av在线免播放器 | 国产高潮又爽又无遮挡又免费 | 韩日精品在线观看 | www色| 婷婷爱五月天 | 日韩欧美亚洲视频 | 亚洲一区二区三区av无码 | 国产精品国产一区二区三区四区 | 久久久久久一 | 日本午夜免费福利视频 | 伊人影院在线观看 | 四虎久久久 | 波多野结衣一区在线 | 丰满白嫩尤物一区二区 | 影音先锋在线看片资源 | 日本人xxxⅹ18hd19hd | 久久国产精品波多野结衣 | 日韩在线视频免费播放 | av色欲无码人妻中文字幕 | 日韩免费av一区二区 | 日韩网站在线 | 91玉足脚交白嫩脚丫 | 2019中文字幕在线免费观看 | chinese国产精品 | av激情在线 | 亚洲精品美女网站 | 国产成人精品视频一区二区 | 免费啪视频在线观看 | 深爱五月综合网 | 快播久久 | 99视频在线免费 | 日韩在线三区 | 国产日韩欧美在线 | 久草大| 国产微拍精品一区 | 中文字幕女同女同女同 | 麻豆tv在线| 日本在线小视频 | 久久99久久99精品中文字幕 |