Spring中listener监听器解析

     引言:listener顾名思义就是监听的意思,作用就是监听程序中的一些变化,并根据其做出一些相应的响应。通俗的语言就是在session,request,application三个对象创建消亡或者往其中进行修改增加删除属性时自动执行代码的功能组件。 

     定义:listener监听器主要是实现了javax.servlet.ServletContextListener接口的服务器端程序,它跟过滤器一样随web应用启动而启动,只需要初始化一次,以后都可以进行监听。一般主要用于ServletContextHttpSessionHttpServletSession这三个对象中的属性变更信息事件监听。

    应用实例:实现对javax.servlet.ServletRequestListener接口的监听,也就是HttpRequestServlet进行监听。

    1、Web.xml中的配置:   

 <listener>   
       <description>HttpRequestListner监听器</description>
       <listener-class>com.check.listener.MyRequestContextListener</listener-class>
 </listener>
    2 、在 MyRequestContextListener类中对ServletRequestListener接口的实现     

package com.check.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyRequestContextListener implements ServletRequestListener{

	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
		System.out.println("Request销毁成功"+sre.getServletRequest());
		
	}
	@Override
	public void requestInitialized(ServletRequestEvent sre) {
		System.out.println("Request创建成功"+sre.getServletRequest());
		
	}	

}
     总结这:样就可以对request请求进行监听,其中对象的创建和销毁时间为:request请求发生的时候对象创建,当响应产生的时候request对象销毁。   

、对session进行监听

   1、web.xml中的配置    

<!--注册针对HttpSession对象监听器  -->
  <listener>
       <description>HttpSessionListener监听器</description>
       <listener-class>com.check.listener.MySessionContextListener</listener-class>
  </listener>
   2、 MySessionContextListener对HttpSessionListener 实现

package com.check.listener;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MySessionContextListener implements HttpSessionListener {
   SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		Date date=new Date();
		System.out.println("session创建成功"+se.getSession()+" "+sdf.format(date));
		
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		Date date=new Date();
		System.out.println("session销毁成功"+se.getSession() + " "+sdf.format(date));
		
	}
}

总结:我在运行的时候,报这个session创建的时间是在一次Httprequest请求成功后创建的,也就是相当于一个request请求会创建一个session,而session的创建包括如下几种情况。

1.session对象创建:

    reqeust.getSession();它是用于获取session.

    是否创建,分以下几种情况:

    1.请求中如果没有jsessionid,那么就是创建session对象。

    2.如果请求头中有jsessionid值:

    1.如果在服务器端,有一个sessionid值与其一样,不创建,直接使用。

    2.如果在服务器端,没有这个sessionid值,那么会创建。

 2. session销毁:

    1.默认超时  30分钟

    2.设置session超时时间

    setMaxInactiveInterval(int interval)

    3.invalidate()手动销毁.

   4.关闭服务器

而我在创建的时候,在web.xm中配置session的销毁时间:1分钟

<session-config>
     <session-timeout>1</session-timeout>
</session-config>

三、实现对ServletContext事件的监听

   1、web.xml配置

<listener>
      <description>ServletContextListener监听器</description>
      <!-- 实现了ServletContextListener接口的监听器类 -->
      <listener-class>com.check.listener.MyServletContextListener</listener-class>
</listener>
   2、实现类MyServletContextListener;
package com.check.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("ServletContext 对象创建"+sce.getServletContext());
		
	}
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("ServletContext 对象销毁"+sce.getServletContext());	
	}
}

四、对其中属性进行一个监听:例如ServletContextAttributeListener

  1、web.xml配置

<listener>
     <description>MyServletContextAttributeListener监听器</description>
     <listener-class>com.check.listener.MyServletContextAttributeListener</listener-class>
</listener>
   2、实现类
package com.check.listener;

import java.text.MessageFormat;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextListener;

public class MyServletContextAttributeListener implements ServletContextAttributeListener{

	    @Override
public void attributeAdded(ServletContextAttributeEvent scab) {
	        String str =MessageFormat.format(
	                "ServletContext域对象中添加了属性:{0},属性值是:{1}"
	                ,scab.getName()
	                ,scab.getValue());
	        System.out.println(str);
	    }

	    @Override
 public void attributeRemoved(ServletContextAttributeEvent scab) {
	        String str =MessageFormat.format(
	                "ServletContext域对象中删除属性:{0},属性值是:{1}"
	                ,scab.getName()
	                ,scab.getValue());
	        System.out.println(str);
	    }

	@Override
	public void attributeReplaced(ServletContextAttributeEvent scab) {
	        String str =MessageFormat.format(
	                "ServletContext域对象中替换了属性:{0}的值"
	                ,scab.getName());
	        System.out.println(str);
	    }

}
    总结:当往servletContext中添加数据或者其它属性的时候就会被监听到。监听结果

   










  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring6 ,参数监听器(Parameter Listener)已经被移除了,取而代之的是参数解析器(Parameter Resolver)。参数解析器是一种更高效、更灵活的参数处理机制,它可以更好地支持各种参数类型和参数校验规则,并且还可以提供更好的错误处理机制。 在 Spring6 ,我们可以通过实现 `HandlerMethodArgumentResolver` 接口来定义自己的参数解析器。下面是一个示例: ```java public class MyParamResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterType().equals(MyParam.class); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { String value = webRequest.getParameter("myParam"); if (value == null) { return null; } return new MyParam(value); } } ``` 在上面的示例,我们定义了一个参数解析器 `MyParamResolver`,用于解析类型为 `MyParam` 的参数。在 `supportsParameter` 方法,我们判断参数类型是否匹配;在 `resolveArgument` 方法,我们获取请求参数并将其转换为 `MyParam` 类型的对象。如果无法解析,则返回 `null`。 最后,我们需要将这个参数解析器注册到 Spring6 的配置,以便让 Spring6 能够识别和使用它。可以通过以下方式进行注册: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(new MyParamResolver()); } } ``` 上面的代码片段将 `MyParamResolver` 注册为参数解析器,使它可以在控制器方法被自动调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伏特加的滋味

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值