JavaWeb学习总结——Servlet监听器

本文详细介绍了Servlet监听器的三大类别:监听域对象创建销毁、属性增删及HttpSession对象状态变化。重点关注ServletContextListener,用于初始化web应用资源。同时讲解了HttpSessionBindingListener和HttpSessionActivationListener,关注对象在session中的钝化和活化过程。监听器在统计在线访客、管理session等场景中发挥作用。
摘要由CSDN通过智能技术生成

Servlet监听器分类

  1. 监听域对象自身的创建和销毁的事件监听器
  2. 监听域对象中的属性的增加和删除的事件监听器
  3. 监听绑定到httpsession域中的某个对象的状态的事件监听器

监听域对象自身的创建和销毁

实现对应的接口,web.xml中进行注册

1.ServletContext

    ServletContextListener接口

ServletContextListener
1)监听ServletContext对象被创建或销毁的监听器
2)创建一个实现了ServletContextListener接口的类,并且实现其中的2个方法

public class HelloServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext contextInitialized 创建");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext contextDestroyed 销毁");
    }
}

在web.xml文件中配置这个listener

    <listener>
        <listener-class>com.atguigu.mvcapp.listener.HelloServletContextListener</listener-class>
    </listener>

3)这个是最常用的listener。可以在web应用被加载时对web应用的相关资源进行初始化操作(如创建数据库链接池。创建spring的ioc容器。读取当前web应用的初始化参数)

4)API

    //ServletContext对象创建时候(当前web应用被加载时候),servlet容器调用此方法。
    public void contextInitialized(ServletContextEvent servletContextEvent) 

    //ServletContext对象销毁时候(当前web应用被卸载时候),servlet容器调用此方法。
    public void contextDestroyed(ServletContextEvent servletContextEvent) 

    //ServletContextEvent对象中的一个方法,这个方法能得到ServletContext对象。
    ServletContext getServletContext() 

2.HttpSession

    HttpSessionListener接口

1)监听HttpSession对象被创建或销毁的监听器
2)


public class HelloServletContextListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
    }
}
HttpSessionEvent 对象里面的一个方法,可以获得session对象。
    public HttpSession getSession() 

3.ServletRequest

    ServletRequestListener接口

1)监听ServletRequest对象被创建或销毁的监听器
2)


public class HelloServletContextListener implements ServletRequestListener {

    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {

    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {

    }
}
 ServletRequestEvent 对象的2个方法:

    public ServletRequest getServletRequest() {
        return this.request;
    }

    public ServletContext getServletContext() {
        return (ServletContext)super.getSource();
    }

4.利用这个3个listener可以研究这3个域对象的生命周期


request: 是请求,当一个响应返回时就销毁。

通过超链接从一个jsp页面到另一个jsp页面,request2个。

通过forward,请求转发从一个jsp页面到另一个jsp页面,request1个。

同理,在servelt中使用请求转发到一个jsp也是一个请求。

每次刷新页面都会有个一个request创建,request销毁。

重定向是2request,和转发不一样。



session:会话,

当第一次访问web应用的一个jsp或者servlet时,且该jsp或sevlet中还需要创建session对象时,此时服务器才会创建session对象。

jsp中如果设置了session=“false”(jsp中不需要session那个隐含对象)的话,这个时候访问这个jsp不会创建session。
如果jsp其中调用了request.getSession(true)这个时候就会创建session。

session销毁,并不是浏览器一关闭session就销毁的。访问的时候能把那个JSESSIONID传给服务器,这个时候不会创建新的session。


session销毁的三种情况:
    session过期。
    调用session的invalidate()方法。
    当前web应用被卸载(web应用被卸载时候,有个session持久化的问题,会保存到这个session.ser文件中。)

session可以跨页面的。

application:贯穿于整个web应用的生命周期,当前web应用加载时候创建application对象,卸载时候销毁这个对象。
application 也叫 ServletContext

监听域对象中的属性的增加和删除

监听servletcontext,httpsession,serveltrequest中添加属性,替换属性,移除属性的事件监听器。
每个里面都有3个方法。
这个3个监听器使用的较少,了解。

ServletRequestAttributeListener

public class AttributeListener implements ServletRequestAttributeListener       {


    @Override
    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("向 servletRequest 中添加一个属性");
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("移除 servletRequest 中一个属性");
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
    }


}

API:

通过下面三个对象
    ServletRequestAttributeEvent
    HttpSessionBindingEvent
    ServletContextAttributeEvent
中的getName()getValue()方法就可以获得向对象的属性的名称,属性的值。

HttpSessionAttributeListener

public class AttributeListener implements HttpSessionAttributeListener {

    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
    }


}

API:

通过下面三个对象
    ServletRequestAttributeEvent
    HttpSessionBindingEvent
    ServletContextAttributeEvent
中的getName()getValue()方法就可以获得向对象的属性的名称,属性的值。

ServletContextAttributeListener

public class AttributeListener implements ServletContextAttributeListener {

    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("向 servletContext 中添加一个属性");
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
    }
}

API:

通过下面三个对象
    ServletRequestAttributeEvent
    HttpSessionBindingEvent
    ServletContextAttributeEvent
中的getName()getValue()方法就可以获得向对象的属性的名称,属性的值。

监听绑定到httpsession域中的某个对象的状态的事件监听器

HttpSessionBindingListener

这个不需要在web.xml 中注册配置。

帮助javabean对象了解自己在session域中的状态。

监听实现了该接口的java类对象 绑定到session时候,或者从中解除绑定的事件。

package com.atguigu.mvcapp.domain;


import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;


// 这里个Customer就是一个典型的javabean类。
public class Customer implements HttpSessionBindingListener{
    private Integer id;
    private String name;
    private String address;
    private String phone;

    private String cardType;
    private String cardId;


    public Customer() {
    }

    public Customer(String name, String address, String cardType, String cardId) {
        this.name = name;
        this.address = address;
        this.cardType = cardType;
        this.cardId = cardId;
    }

    public Customer(String name, String address, String phone) {
        this(0, name, address, phone);
    }

    public Customer(Integer id, String name, String address, String phone) {
        this.id = id;
        this.name = name;
        this.address = address;
        this.phone = phone;
    }

    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
        //当前对象被绑定到session时调用该方法
        httpSessionBindingEvent.getName();//获取名字,属性名。
        httpSessionBindingEvent.getValue();//获取值,这个值是和this是相等的。
        httpSessionBindingEvent.getSession();//获取session
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
        //解除绑定时调用该方法
    }

    @Override
    public String toString() {
        return "Customer{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }

    public String getCardType() {
        return cardType;
    }

    public void setCardType(String cardType) {
        this.cardType = cardType;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }


}
    HttpSessionBindingEvent对象中的3个方法:
        httpSessionBindingEvent.getName();//获取名字,属性名。

        httpSessionBindingEvent.getValue();//获取值,这个值是和this是相等的。

        httpSessionBindingEvent.getSession();//获取session

HttpSessionActivationListener

监听 实现了该接口和Serializable接口的java类对象随session钝化和活化 事件

活化,或者钝化,该类要实现Serializable接口,类的序列化
活化指的是从硬盘中读取session对象到内存中。
钝化指的是从内存中写入到硬盘,类的序列化

会存为SESSION.ser 文件

不需要在web.xml 中注册配置。


public class Customer implements Serializable, HttpSessionActivationListener {
    @Override
    public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
        //从内存中写入到硬盘,该类要实现Serializable接口,类的序列化
    }

    @Override
    public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
        //从硬盘中读取
    }
}


HttpSessionEvent中的一个方法,httpSessionEvent.getSession();获得session对象

监听器总结

  1. 专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。

  2. 监听器分类
    1. 监听域对象自身的创建和销毁的事件监听器(ServletContextListener,HttpSessionListener,ServletRequestListener)
    2. 监听域对象中的属性的增加和删除的事件监听器(ServletRequestAttributeListener, ServletContextAttributeListener, ttpSessionAttributeListener )
    3. 监听绑定到httpsession域中的某个对象的状态的事件监听器
    一共3种类型,8个java类。

  3. 如何编写监听器
    编写实现监听器接口的java类
    对应第一种和第二种监听器需要在web.xml文件中进行注册

  4. ServletContextListener最常用,可以在web应用被加载时对web应用的相关资源进行初始化操作(如创建数据库链接池。创建spring的ioc容器。读取当前web应用的初始化参数)
    注意这个初始化资源当然也可以在servlet 的init()方法中取初始化,但是这样不专业!

  5. 钝化和活化需要实现哪个Serializable接口,(若不实现只能写到硬盘上,不能读取处理!)

监听器举例

统计在线访客,可以把访客剔除其所在的session。

  1. 利用HttpSessionListener可以知道是否有用户访问当前的web应用
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        //这个方法被调用说明有新的访客来
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        //这个方法被调用说明有访客离开
    }
  1. jsp页面显示当前的访客,显示访客,IP等信息
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值