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 ...
随机推荐
- python 3.x 学习笔记16 (队列queue 以及 multiprocessing模块)
1.队列(queue) 用法: import queue q = queue.Queue() #先进先出模式 q.put(1) #存放数据在q里 作用: 1)解耦 2)提高效率 class qu ...
- 基于XMPP利用openfire简单的即时通讯
功能的实现结果:能够使自己编写客户端与spark客户端信息通讯,将接受到的信息更新到textview上. 1.下载openfire并安装.设置域名,添加用户 2.下载安装spark客户端 3.jar包 ...
- 自动化框架的两种断言设计(pytest 版)
自动化测试断言失败时,根据不同业务场景,可能需要立即终止或继续执行.这里以 Appium + pytest 为例. 一. 断言失败立即终止 用途一:用例的预期结果是其他用例的前提条件时,assert ...
- linux系统管理-软件包管理
概述: inux家族中的软件包管理有很多工具. 一种是在debiton系列的linux中,以像ubuntu的apt-get为代表.对于此种方式的管理方式,个人感觉挺简单方便的, 一种是在Fedora和 ...
- 如何将App从一个账号迁移到另一个账号?
App迁移(App transfer):将App从一个开发者账号迁移至另一个开发者账号.此文演示了整个迁移过程,为了方便解释,在此过程中,将App转出的开发者账号我们下文将会称之为A账号,接收杭州Ap ...
- BZOJ3529: [Sdoi2014]数表 莫比乌斯反演_树状数组
Code: #include <cstdio> #include <algorithm> #include <cstring> #define ll long lo ...
- pytorch 5 classification 分类
import torch from torch.autograd import Variable import torch.nn.functional as F import matplotlib.p ...
- Vue PC端框架
Vue PC端框架 1. Element 中文文档:http://element-cn.eleme.io/#/zh-CN github地址:https://github.com/ElemeFE/ele ...
- tortoiseGit怎么记住密码
tortoiseGit每次pull和push的时候都要输入git密码很是麻烦,下面是tortoiseGit记住密码的步骤 首先在你的项目界面右键 选择setting,这个步骤知识看一下你的名称和ema ...
- ajax 获取 json 数据乱码
打开json文本把json文件另存为 'utf-8' 编码格式的文件.....