servlet三大组件,简单servlet、过滤servlet、监听servlet,即Servlet、Filter、Listener ,三大组件注册方式大同小异。
Servlet主要用于处理客户端的请求,当我们在浏览器回车跳转时,请求就会被发送对应 的Servlet处理。
作用:接收请求数据
处理请求
完成响应
①创建一个Servlet类,继承HttpServlet
②编写一个Configuration类,注册Servlet的Bean
Servlet类
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response){
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response){
System.out.println("现在执行Servlet的doPost方法");
}
}
Configuration类
@Configuration
public class Config {
@Bean
public ServletRegistrationBean myServlet(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet());
registrationBean.addUrlMappings("/login");
return registrationBean;
}
}
它是基于函数回调实现链式对网络请求和响应的拦截和修改。拦截已有请求,对不需要或不符合的信息资源进行预处理。
执行顺序:过滤前—拦截前—Action处理—拦截后—过滤后
①创建一个Filter类,实现Filter接口
②编写一个Configuration类,注册Filter的Bean Filter类
Filter类,
init()初始化方法,只在过滤器创建的时候执行一次,用于初始化过滤器的属性
doFilter()过滤方法,调用该方法的入参 FilterChain对象的 doFilter 方法对请求放行执行后面的逻辑,若未调用 doFilter 方法则本次请求结束,并向客户端返回响应失败
destory()销毁方法, 此方法用于销毁过滤器,过滤器被创建以后只要项目一直运行,过滤器就会一直存在,在项目停止时,会调用该方法销毁过滤器
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException{
System.out.println("现在进行Filter的init初始化方法");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("现在执行doFilter方法");
HttpServletRequest hsr = (HttpServletRequest) servletRequest;
String url = hsr.getRequestURL().toString();
if(url.contains("/testfilter")){
System.out.println("不拦截:"+url);
filterChain.doFilter(servletRequest,servletResponse);
}
else if(url.contains("/test")){
System.out.println("进行拦截:"+url);
return ;
}
}
@Override
public void destroy() {
System.out.println("现在执行销毁方法");
}
}
Configuration类
public class Config {
// @Bean
// public ServletRegistrationBean myServlet(){
// ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet());
// registrationBean.addUrlMappings("/login");
// return registrationBean;
// }
@Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new MyFilter());
//设置拦截规则
registrationBean.setUrlPatterns(Arrays.asList("/testfilter","/test"));
return registrationBean;
}
}
测试结果:
监听器就是监听某个对象的状态变化的组件
(1)事件源:被监听的对象。主要有三个域对象:request、session、servletContext(application)。
(2)监听器:监听事件源对象的组件,事件源对象的状态变化就会触发监听器。
(3)注册监听器:将监听器与事件源进行绑定。
(4)响应行为:监听器听到事件源的转台变化是,所涉及的功能代码
①ServletContextListener 接口
ServletContext对象创建时:激发contextInitialized(ServletContextEvent sce)方法
ServletContext对象销毁时:激发contextDestroyed(ServletContextEvent sce)方法
②HttpSessionListener接口
HttpSession对象创建时:激发sessionCreated(HttpSessionEvent se)方法
HttpSession对象销毁时:激发contextDestroyed(ServletContextEvent sce)方法
③ServletRequestListener 接口
Request对象创建时:激发requestInitialized方法
Request对象销毁时:激发requestInitialized方法
监听器:
①ServletContextAttributeListener
②HttpSessionAttributeListener
③ServletRequestAttributeListener
监听对象属性的增加、删除和替换,三个监听器接口方法名称相同,参数不同
(1)监听对象增加属性,web容器调用事件监听器的这个方法
public void attributeAdded()方法,不同域对象参数分别为:ServletContextAttributeEvent scae 、HttpSessionBindingEvent hsbe、ServletRequestAttributeEvent srae
(2)监听对象删除属性,web容器调用事件监听器的这个方法
public void attributeRemoved (ServletContextAttributeEvent scae)方法,不同域对象参数分别为:ServletContextAttributeEvent scae、HttpSessionBindingEvent hsbe、ServletRequestAttributeEvent srae
(3)监听对象替换*属性,web容器调用事件监听器的这个方法
public void attributeReplaced (ServletContextAttributeEvent scae)方法,不同域对象参数分别为:ServletContextAttributeEvent scae、HttpSessionBindingEvent hsbe、ServletRequestAttributeEvent srae
对象绑定到HttpSession对象: void valueBound(HttpSessionBindingEvent event)
对象与HttpSession对象解绑:void valueUnbound(HttpSessionBindingEvent event)
当绑定到HttpSession对象中的对象将要随HttpSession对象被钝化之前:sessionWillPassivate(HttpSessionBindingEvent event)
当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后:
sessionDidActive(HttpSessionBindingEvent event)
一个 web.xml 文件中可以配置多个 Servlet 事件监听器
web 服务器按照它们在 web.xml 文件中的注册顺序来加载和注册这些 Serlvet 事件监听器
实现ServletContextListener接口
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce){
System.out.println("Servlet上下文--->当前web项目启动");
}
@Override
public void contextDestroyed(ServletContextEvent sce){
System.out.println("当前类销毁");
}
}
注册Listenner监听器
@Configuration
public class Config {
// @Bean
// public ServletRegistrationBean myServlet(){
// ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet());
// registrationBean.addUrlMappings("/login");
// return registrationBean;
// }
//注册过滤器
@Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new MyFilter());
//设置拦截规则
registrationBean.setUrlPatterns(Arrays.asList("/testfilter","/test"));
return registrationBean;
}
//注册监听器
@Bean
public ServletListenerRegistrationBean myListener(){
ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean(new MyListener());
return registrationBean;
}
}