SpringBoot学习笔记(6)----SpringBoot中使用Servlet,Filter,Listener的三种方式
在一般的运用开发中Controller已经大部分都能够实现了,但是也不排除需要自己实现Servlet,Filter,Listener的方式,SpringBoot提供了三种实现方式。
1. 使用Bean的实现方式
首先创建一个Servlet,一个Filter,一个Listener,
DemoServlet.java
package com.wangx.boot.util.servlet; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; public class DemoServlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get method");
doPost(req,resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post method");
resp.getWriter().write("hello world");
}
}
DemoFilter.java
package com.wangx.boot.util.filter; import javax.servlet.*;
import java.io.IOException; public class DemoFilter 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("开始拦截了....");
} @Override
public void destroy() { }
}
DemoListener.java
package com.wangx.boot.util.listener; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class DemoListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("contextInitialized");
} @Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("contextDestroyed");
}
}
然后直接在SpringBoot的启动类中将上面几个方法注册为Bean,
SpringBootDemo01Application.java
package com.wangx.boot; import com.wangx.boot.util.filter.DemoFilter;
import com.wangx.boot.util.listener.DemoListener;
import com.wangx.boot.util.servlet.DemoServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean; @SpringBootApplication
public class SpringBootDemo01Application { /**
* 注册Servlet
* @return
*/
@Bean
public ServletRegistrationBean createServlet () {
//第二个参数为urlPartern
return new ServletRegistrationBean(new DemoServlet(), "/demoServlet");
} /**
* 注册Filter
* @return
*/
@Bean
public FilterRegistrationBean createFilter() {
//第二个参数为需要拦截的路径,不传则拦截所有
return new FilterRegistrationBean(new DemoFilter(), createServlet());
} /**
* 注册Listener
* @return
*/
@Bean
public ServletListenerRegistrationBean createrListener() {
//自定义个Listener.监听整个Context的Servlet
return new ServletListenerRegistrationBean(new DemoListener());
} public static void main(String[] args) {
SpringApplication.run(SpringBootDemo01Application.class, args);
}
}
启动项目时会Listener会打印contextInitialized,关闭时会打印contextDestroyed,访问时拦截器打印"开始拦截了....",并成功访问到Servlet,并输入hello world到浏览器上。
2. 实现ServletContextInitializer接口
直接在SpringBoot的启动类中实现ServletContextInitializer,重写onStartup()方法也可以使用Servlet.Filter,Listener,以上面三个Demo类为例,使用ServletContextInitializer的方式的代码:
package com.wangx.boot; import com.wangx.boot.util.filter.DemoFilter;
import com.wangx.boot.util.listener.DemoListener;
import com.wangx.boot.util.servlet.DemoServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletContextInitializer; import javax.servlet.DispatcherType;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.util.EnumSet; @SpringBootApplication
public class SpringBootDemo01Application implements ServletContextInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemo01Application.class, args);
} @Override
public void onStartup(ServletContext servletContext) throws ServletException {
//创建Servlet,并映射访问路径为demoServlet
servletContext.addServlet("demoServlet", new DemoServlet()).addMapping("/demoServlet");
//创建Filter,拦截的Servlet
servletContext.addFilter("demoFilter", new DemoFilter()).addMappingForServletNames(EnumSet.of(DispatcherType.FORWARD), true, "demoServlet"); //创建Listener servletContext.addListener(new DemoListener()); } }
运行结果与1相同
3. 使用注解的方式
这是一个SpringBoot官方推荐的方式,也是三种方式中最简单的方式,只需要在SpringBoot的启动类上添加@ServletComponentScan注解,在DemoServlet类上添加@WebServlet(name = "demoServlet", urlPatterns = "/demoServlet")注解,DemoFilter类上添加@WebFilter(urlPatterns = "/*", dispatcherTypes = DispatcherType.FORWARD)(拦截所有请求),DemoListener类上添加@WebListener即可,运行结果与1相同。
SpringBoot学习笔记(6)----SpringBoot中使用Servlet,Filter,Listener的三种方式的更多相关文章
- 转 Velocity中加载vm文件的三种方式
Velocity中加载vm文件的三种方式 velocitypropertiespath Velocity中加载vm文件的三种方式: 方式一:加载classpath目录下的vm文件 Prope ...
- Velocity中加载vm文件的三种方式
Velocity中加载vm文件的三种方式: a. 加载classpath目录下的vm文件 /** * 初始化Velocity引擎 * --VelocityEngine是单例模式,线程安全 * @th ...
- SpringBoot学习笔记(6) SpringBoot数据缓存Cache [Guava和Redis实现]
https://blog.csdn.net/a67474506/article/details/52608855 Spring定义了org.springframework.cache.CacheMan ...
- spring in action学习笔记十五:配置DispatcherServlet和ContextLoaderListener的几种方式。
在spring in action中论述了:DispatcherServlet和ContextLoaderListener的关系,简言之就是DispatcherServlet是用于加载web层的组件的 ...
- Action 中获取表单数据的三种方式
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/53138905 冷血之心的博客) Action 中获取表单提交数据 ...
- vue中通过路由跳转的三种方式
原文:https://blog.csdn.net/qq_40072782/article/details/82533477 router-view 实现路由内容的地方,引入组件时写到需要引入的地方需要 ...
- Maven中解决jar包冲突的三种方式
首先我们在idea中创建一个maven工程,我们只关注pom.xml以及External Libraries中导入的jar包 导入spring-beans.jar <dependency> ...
- SpringBoot学习笔记(5)----SpringBoot中异常处理的三种方法
对于异常的处理,Spring Boot中提供默认的一个异常处理界面,如下图: 但是在实际的运用开发中,这样的页面显然是不友好的,Spring Boot也提供了自定义异常处理的方式,如下总结三种一场处理 ...
- Hibernate学习笔记2.5(Hibernate核心开发接口和三种状态)
1.configuration(配置信息管理,产生sessionfactory) sessionfactory管理一系列的连接池 opensession 永远打开新的,需要手动close getcur ...
随机推荐
- jmeter的认识
jmeter JMeter是Apache组织开发的开源项目,设计之初是用于做性能测试的,同时它在实现对各种接口的调用方面做的比较成熟,因此,常被用做接口功能测试和性能测试. 它能够很好的支持各种常见接 ...
- web前端页面优化——个人见解
web前端页面优化,我们从JavaScript.css.html这3个方面说下,我的见解,希望大神们能有刚好优化方法,一起探讨. 一. 有关javascript方面 优化见解. 1. 首先举个例子: ...
- HDU 2955 Robberies【01背包】
解题思路:给出一个临界概率,在不超过这个概率的条件下,小偷最多能够偷到多少钱.因为对于每一个银行都只有偷与不偷两种选择,所以是01背包问题. 这里有一个小的转化,即为f[v]代表包内的钱数为v的时候, ...
- Linux(1)---常用命令
1.将tgz文件解压到指定目录: # tar zxvf test.tgz -C 指定目录 比如将 /lyl/test.tgz解压到 /lyl/linux 目录下 # tar zxvf /lyl/tes ...
- 小程序(Wepy)--生成海报图片
对于小程序的分享, 除了分享给朋友, 好友群,是可以直接做到的, 但是要想扩大推广范围, 通过生成海报图片, 将自己小程序码带进去,应该是目前我所知的好办法了. 但是海报也不是那么好搞.之前自己手写出 ...
- BZOJ 5020 [THUWC2017]Drown in the math ocean (LCT+求导)
题目大意: 太长了略 洛谷题面传送门 嗯,数学题 感觉考试要是出这种题我就死翘翘了[逃 不用想都知道要$LCT$维护断边连边,但询问该如何处理呢 利用题目给出的公式 $f(x)=\sum_{i=0}^ ...
- 关于一些运算(&(与运算)、|(或运算)、^(异或运算)........)的本质理解【转】
看到一篇博客,关于一些运算的解析,觉得有用,怕以后找不着,直接复制下来,以备以后学习用 原文链接:https://blog.csdn.net/xiaopihaierletian/article/det ...
- STM32 软件模拟 IIC 代码,标准库、HAL库可用
#ifndef _IIC_H #define _IIC_H #include "stdio.h" #include "stm32f1xx_hal.h" /* 定 ...
- ArcGIS 安装
百度网盘下载链接 密码:tvm6 打开解压的文件后,第一步为安装licence manager(安装监听) 打开\ArcGIS10.4\LicenseManager中的Setup.exe 傻瓜式安装 ...
- shell 键盘录入和运算
一.read 命令,从键盘读入数据,赋给变量 1.脚本代码 #!/bin/sh read arg1 arg2 echo "第一个参数: $arg1" echo "第二个参 ...