IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> JavaWeb三大组件【Servlet、Filter、Listener】 -> 正文阅读

[移动开发]JavaWeb三大组件【Servlet、Filter、Listener】

目录

引言

Filter

Listener


引言

JavaWeb三大组件指的是:Servlet、Filter、Listener,这三个组件在JavaWeb开发中分别提供不同的功能。Servlet 是 JavaWeb 的三大组件之一,它属于动态资源,前面文章有写到(请参考):web阶段~Servlet学习_乔巴菌儿的博客-CSDN博客? 今天,我们将进行Filter(过滤器)与Listener(监听器)的学习。

Filter

【概念】

web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。filter与servlet在很多的方面极其相似,但是也有不同,例如filter和servlet一样都又三个生命周期方法,同时他们在web.xml中的配置文件也是差不多的、 但是servlet主要负责处理请求,而filter主要负责拦截请求,和放行。

快速入门:

????????1. 定义一个类,实现接口Filter

????????2. 复写方法

????????3. 配置拦截路径(web.xml、? 注解)

//    @WebFilter("/*") //访问所有资源之前都会执行该过滤器
public class FilterDemo1 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filterDemo1被执行了......");

        //执行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

过滤器细节:

????????web.xml配置

<filter>
?? ?<filter-name>demo1</filter-name>
?? ?<filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
</filter>

<filter-mapping>
?? ?<filter-name>demo1</filter-name>
?? ?<!-- 拦截路径 -->
?? ?<url-pattern>/*</url-pattern>
</filter-mapping>

【执行流程】

1. 执行过滤器

2. 执行放行后的资源
3. 回来执行过滤器放行代码下边的代码

【生命周期】

1. init:在服务器启动后,会创建Filter对象,然后调用init方法。用于加载资源,只执行一次

2. doFilter:每一次请求被拦截资源时,会执行。执行多次

3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。用于释放资源,只执行一次

@WebFilter("/*")
public class FilterDemo3 implements Filter {

    //每一次请求被拦截资源时,会执行(执行多次)
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("dofilter...");
        chain.doFilter(req, resp);
    }

    //在服务器启动后创建Filter对象,然后调用init方法(执行一次)
    //【加载资源】
    public void init(FilterConfig config) throws ServletException {
        System.out.println("init...");
    }

    //在服务器关闭后,Filter对象被销毁,如果服务器正常关闭,则会调用destroy方法(执行一次)
    //【释放资源】
    public void destroy() {
        System.out.println("destroy...");
    }
}

【配置详解】

1. 具体资源路径: /index.jsp? ?只有访问index.jsp资源时,过滤器才会被执行
2. 拦截目录: /user/*? ?访问/user下的所有资源时,过滤器都会被执行
3. 后缀名拦截: *.jsp? ?访问所有后缀名为jsp资源时,过滤器都会被执行
4. 拦截所有资源:/*? ?访问所有资源时,过滤器都会被执行

//@WebFilter("/index.jsp")
//1. 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行

//@WebFilter("/user/*")
//2. 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行

//@WebFilter("*.jsp")
public class FilterDemo4 implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filterDemo4...");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

    public void destroy() {

    }

}

【注解配置&web.xml配置】

设置dispatcherTypes属性:

????????1. REQUEST:默认值。浏览器直接请求资源
????????2. FORWARD:转发访问资源
????????3. INCLUDE:包含访问资源
????????4. ERROR:错误跳转资源
????????5. ASYNC:异步访问资源

web.xml配置:

????????设置<dispatcher></dispatcher>标签即可

//浏览器直接请求index.jsp资源时,该过滤器会被执行
//@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST)

//只有转发访问index.jsp时,该过滤器才会被执行
//@WebFilter(value = "/index.jsp",dispatcherTypes = DispatcherType.FORWARD)

//浏览器直接请求index.jsp或者转发访问index.jsp,该过滤器都会被执行
//@WebFilter(value = "/index.jsp",dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.REQUEST})
public class FilterDemo5 implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filterDemo5...");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

    public void destroy() {

    }

}

【过滤器链】

配置多个过滤器:(如果有两个过滤器:过滤器1和过滤器2)

1. 过滤器1
2. 过滤器2
3. 资源执行
4. 过滤器2
5. 过滤器1?
过滤器先后顺序问题:

注解配置:按照类名的字符串比较规则比较,值小的先执行
????????如: AFilter 和 BFilter,AFilter就先执行了。
2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行


Listener

这里参考此篇博客:JavaWeb三大组件(Servlet、Filter、Listener)_xiaojie119120的博客-CSDN博客_servlet三大组件

Listener就是监听器,我们在JavaSE开发或者Android开发时,经常会给按钮加监听器,当点击这个按钮就会触发监听事件,调用onClick方法,本质是方法回调。在JavaWeb的Listener也是这么个原理,但是它监听的内容不同,它可以监听Application、Session、Request对象,当这些对象发生变化就会调用对应的监听方法。?
应用域监听:?
? ServletContext(监听Application)

生命周期监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时调用;

void contextInitialized(ServletContextEvent sce):创建Servletcontext时

void contextDestroyed(ServletContextEvent sce):销毁Servletcontext时

属性监听:ServletContextAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

void attributeAdded(ServletContextAttributeEvent event):添加属性时;

void attributeReplaced(ServletContextAttributeEvent event):替换属性时;

void attributeRemoved(ServletContextAttributeEvent event):移除属性时;

? HttpSession(监听Session)

生命周期监听:HttpSessionListener,它有两个方法,一个在出生时调用,一个在死亡时调用;

voidsessionCreated(HttpSessionEvent se):创建session时

void sessionDestroyed(HttpSessionEvent se):销毁session时

属性监听:HttpSessioniAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

void attributeAdded(HttpSessionBindingEvent event):添加属性时;

void attributeReplaced(HttpSessionBindingEvent event):替换属性时

void attributeRemoved(HttpSessionBindingEvent event):移除属性时

? ServletRequest(监听Request)

生命周期监听:ServletRequestListener,它有两个方法,一个在出生时调用,一个在死亡时调用;

voidrequestInitialized(ServletRequestEvent sre):创建request时

void requestDestroyed(ServletRequestEvent sre):销毁request时

属性监听:ServletRequestAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

voidattributeAdded(ServletRequestAttributeEvent srae):添加属性时

void attributeReplaced(ServletRequestAttributeEvent srae):替换属性时

void attributeRemoved(ServletRequestAttributeEvent srae):移除属性时

感知Session监听:?
1:HttpSessionBindingListener监听?
⑴在需要监听的实体类实现HttpSessionBindingListener接口?
⑵重写valueBound()方法,这方法是在当该实体类被放到Session中时,触发该方法?
⑶重写valueUnbound()方法,这方法是在当该实体类从Session中被移除时,触发该方法?
2:HttpSessionActivationListener监听?
⑴在需要监听的实体类实现HttpSessionActivationListener接口?
⑵重写sessionWillPassivate()方法,这方法是在当该实体类被序列化时,触发该方法?
⑶重写sessionDidActivate()方法,这方法是在当该实体类被反序列化时,触发该方法

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:34:21  更:2022-04-24 09:35:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 23:33:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码