详解IDEA中SpringBoot整合Servlet三大组件的过程

 更新时间:2020年11月17日 10:13:35   作者:生于四海  
这篇文章主要介绍了详解IDEA中SpringBoot整合Servlet三大组件的过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Spring MVC整合
SpringBoot提供为整合MVC框架提供的功能特性

  • 内置两个视图解析器:ContentNegotiatingViewResolver和BeanNameViewResolver
  • 支持静态资源以及WebJars
  • 自动注册了转换器和格式化器
  • 支持Http消息转换器
  • 自动注册了消息代码解析器
  • 支持静态项目首页index.html
  • 支持定制应用图标favicon.ico
  • 自动初始化Web数据绑定器:ConfigurableWebBindingInitializer

Spring MVC功能扩展实现

  • 项目环境搭建(结构如这篇博客)
  • 功能扩展实现
  • 注册视图管理器
/*
	在config文件夹下编写配置类
 实现WebMvcConfigurer接口,扩展MVC功能
 测试前将LoginController控制类注释,更好的观察效果
 */
@Configuration
public class MyMVCConfig implements WebMvcConfigurer {
 //添加视图管理
 @Override
 public void addViewControllers(ViewControllerRegistry registry) {
  // 请求toLoginPage映射路径或者login.html页面都会自动映射到login.html页面
  registry.addViewController("/toLoginPage").setViewName("login");
  registry.addViewController("/login.html").setViewName("login");
 }
}

- 测试后发现,使用这种方式无法获取后台处理的数据,比如登录页面中的年份。
- 使用WebMvcConfigurer接口中的addViewControllers(ViewControllerRegistry registry)方法定制
视图控制,只适合较为简单的无参数视图Get方式的请求跳转,对于有参数或需要业务处理的跳转请求,最好还是采用传统方式处理请求。

注册自定义拦截器

/*
 自定义一个拦截器类,实现简单的拦截业务
 */
@Configuration
public class MyInterceptor implements HandlerInterceptor {
 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  // 用户请求/admin开头路径时,判断用户是否登录
  String uri = request.getRequestURI();
  Object loginUser = request.getSession().getAttribute("loginUser");
  if(uri.startsWith("/admin")&&null==loginUser){
   response.sendRedirect("/toLoginPage");
   return false;
  }
  return true;
 }

 @Override
 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable ModelAndView modelAndView) throws Exception {
  //向request域中存放当前年份用于页面动态展示
  request.setAttribute("currentYear", Calendar.getInstance().get(Calendar.YEAR));
 }

 @Override
 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

 }
}

- 自定义拦截器类MyInterceptor实现了HandlerInterceptor接口。在preHandle()方法中,如果用户请求以“/admin”开头,
则判断用户是否登录,如果没有登录,则重定向到“/toLoginPage”请求对应的登录页面。
- 在postHandle()方法中,使用request对象向前端页面传递表示年份的currentYear数据。
- 在自定义配置类MyMVCConfig中,重写addInterceptors()方法注册自定义的拦截器,如下

 @Autowired
 private MyInterceptor myInterceptor;
 //添加拦截器管理
 @Override
 public void addInterceptors(InterceptorRegistry registry) {
  registry.addInterceptor(myInterceptor)
    .addPathPatterns("/**")
    .excludePathPatterns("/login.html");
 }

- 使用@Autowired注解引入自定义的MyInterceptor拦截器组件,重写其中addInterceptors()方法注册自定义的拦截器
- 使用addPathPatterns("/**")方法拦截所有路径请求,excludePathPatterns("/login.html")方法对“login.html”路径请求放行处理。
- 项目重启后,访问localhost:8080/admin,跳转到登录界面,自定义拦截器生效。

Spring Boot 整合Servlet三大组件

组件注册方式整合Servlet三大组件

在Spring Boot中,使用组件注册方式整合内嵌Servlet容器的Servlet、Filter、Listener三大组件时,
  只需要将这些自定义组件通过ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean类注册到容器中即可

组件注册方式整合 Servlet

/*
 自定义Servlet类
 使用@Component注解将MyServlet类作为组件注入Spring容器。该类继承自HTTPServlet,
 通过HttpServletResponse对象向页面输出"hello MyServlet"
 */
@Component
public class MyServlet extends HttpServlet {
 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  this.doPost(req,resp);
 }

 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  resp.getWriter().write("hello MyServlet");
 }
}
/*
 嵌入式Servlet容器三大组件配置
 @Configuration注解将该类标注为配置类,getServlet()方法用于注册自定义MyServlet,
 返回ServletRegistrationBean类型的Bean对象
 */
@Configuration
public class ServletConfig {
 // 注册Servlet组件
 @Bean
 public ServletRegistrationBean<javax.servlet.Servlet> getServlet(MyServlet myServlet){
  return new ServletRegistrationBean<javax.servlet.Servlet>(myServlet,"/myServlet");
 }
}

启动测试,访问myServlet,显示数据说明成功整合Servlet组件

组件注册方式整合Filter

/*
 自定义Filter类
 使用@Component注解将当前MyFilter类作为组件注入到Spring容器中
 MyFilter类实现Filter接口,重写如下三个方法,在doFilter()方法中想控制台打印"hello MyFilter"
 */
@Component
public class MyFilter implements Filter {
 @Override
 public void init(FilterConfig filterConfig) throws ServletException {
 }
 @Override
 public void destroy() {
 }
 @Override
 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  System.out.println("hello MyFilter");
  filterChain.doFilter(servletRequest,servletResponse);
 }
}
 //注册Filter组件
 @Bean
 public FilterRegistrationBean<javax.servlet.Filter> getFilter(MyFilter myFilter){
  FilterRegistrationBean<javax.servlet.Filter> registrationBean = new FilterRegistrationBean<>(myFilter);
  registrationBean.setUrlPatterns(Arrays.asList("/toLoginPage","/myFilter"));
  return registrationBean;
 }

启动测试,访问/myFilter,控制台看到hello MyFilter

组件注册方式整合Listener

/*
 自定义Listener类
 */
@Component
public class MyListener implements ServletContextListener {
 @Override
 public void contextInitialized(ServletContextEvent sce) {
  System.out.println("contextInitialized ...");
 }

 @Override
 public void contextDestroyed(ServletContextEvent sce) {
  System.out.println("contextDestroyed ...");
 }
}
 //注册Listener组件
 @Bean
 public ServletListenerRegistrationBean<java.util.EventListener> getServletListener(MyListener myListener){
  return new ServletListenerRegistrationBean<>(myListener);
 }

程序启动成功后,会自动打印输出"contextInitialized ...",单击坐下的Exit关闭会输出销毁的监听信息,如果直接强制关闭程序,无法打印监听信息。

  • 注意:当自定义的Servlet组件配置类ServletConfig全部注释并重启项目后,自定义的Servlet、Filter、Listener组件仍然生效。
  • 原因:嵌入式Servlet容器对Servlet、Filter、Listener组件进行了自动化识别和配置,而自定义的Servlet、Filter、Listener都继承/实现了对应的类/接口,同时自定义的这三个组件都使用了@Component注解,会自动被扫描为Spring组件。

路径扫描整合Servlet三大组件

  • 使用路径扫描的方式整合三大组件,需要再自定义组件上分别添加@WebServlet、@WebFilter、@WebListener注解进行声明,并配置相关注解属性,在主程序启动类上使用@ServletComponentScan注解开启组件扫描。
  • 分别用以下三个注解代替@Component注解进行配置三个组件@WebFilter(value={"/antionLogin","/antionMyFilter"})
  • @WebListener
  • @WebServlet("/annotationServlet")
  • 启动类上加入@ServletComponentScan注解,开启基于注解的组件扫描支持
  • 对于Filter测试访问"/antionLogin","/antionMyFilter",对于Servlet测试访问"/annotationServlet",测试结果如上。

到此这篇关于详解IDEA中SpringBoot整合Servlet三大组件的过程的文章就介绍到这了,更多相关SpringBoot整合Servlet三大组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 定时器(Timer,TimerTask)详解及实例代码

    Java 定时器(Timer,TimerTask)详解及实例代码

    这篇文章主要介绍了 Java 定时器(Timer,TimerTask)详解及实例代码的相关资料,需要的朋友可以参考下
    2017-01-01
  • Mybatis中 mapper-locations和@MapperScan的作用

    Mybatis中 mapper-locations和@MapperScan的作用

    这篇文章主要介绍了Mybatis中 mapper-locations和@MapperScan的作用,mybatis.mapper-locations在SpringBoot配置文件中使用,作用是扫描Mapper接口对应的XML文件,需要的朋友可以参考下
    2023-05-05
  • Java请求流量合并和拆分提高系统的并发量示例

    Java请求流量合并和拆分提高系统的并发量示例

    这篇文章主要为大家介绍了Java请求流量合并和拆分提高系统的并发量示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 在SpringBoot框架下实现Excel导入导出的方法详解

    在SpringBoot框架下实现Excel导入导出的方法详解

    SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,今天我们就使用纯前对按表格控件带大家了解,如何在Spring Boot框架下实现Excel服务端导入导出,需要的朋友可以参考下
    2023-06-06
  • Spring Security如何基于Authentication获取用户信息

    Spring Security如何基于Authentication获取用户信息

    这篇文章主要介绍了Spring Security如何基于Authentication获取用户信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 利用SpringMVC和Ajax实现文件上传功能

    利用SpringMVC和Ajax实现文件上传功能

    这篇文章主要为大家详细介绍了利用SpringMVC和Ajax实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Spring Boot实现对文件进行压缩下载功能

    Spring Boot实现对文件进行压缩下载功能

    在Web应用中,文件下载功能是一个常见的需求,特别是当你需要提供用户下载各种类型的文件时,本文将演示如何使用Spring Boot框架来实现一个简单而强大的文件下载功能,需要的朋友跟随小编一起学习吧
    2023-09-09
  • 利用java获取某个文件夹下的所有文件

    利用java获取某个文件夹下的所有文件

    这篇文章主要给大家介绍了关于如何利用java获取某个文件夹下的所有文件的相关资料,在从事web开发工作中,经常需要对本地某一个目录下的文件进行处理,需要的朋友可以参考下
    2023-07-07
  • mybatisplus之使用@Select解读

    mybatisplus之使用@Select解读

    这篇文章主要介绍了mybatisplus之使用@Select解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • SpringMVC @ResponseBody 415错误处理方式

    SpringMVC @ResponseBody 415错误处理方式

    这篇文章主要介绍了SpringMVC @ResponseBody 415错误处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论