SpringBoot系列教程web篇Servlet 注册的四种姿势 您所在的位置:网站首页 servlet与springboot SpringBoot系列教程web篇Servlet 注册的四种姿势

SpringBoot系列教程web篇Servlet 注册的四种姿势

2023-08-12 03:08| 来源: 网络整理| 查看: 265

原文: 191122-SpringBoot系列教程web篇Servlet 注册的四种姿势

前面介绍了 java web 三要素中 filter 的使用指南与常见的易错事项,接下来我们来看一下 Servlet 的使用姿势,本篇主要带来在 SpringBoot 环境下,注册自定义的 Servelt 的四种姿势

@WebServlet 注解 ServletRegistrationBean bean 定义 ServletContext 动态添加 普通的 spring bean 模式 I. 环境配置 1. 项目搭建

首先我们需要搭建一个 web 工程,以方便后续的 servelt 注册的实例演示,可以通过 spring boot 官网创建工程,也可以建立一个 maven 工程,在 pom.xml 中如下配置

org.springframework.boot spring-boot-starter-parent 2.2.1.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-maven-plugin spring-snapshots Spring Snapshots https://repo.spring.io/libs-snapshot-local true spring-milestones Spring Milestones https://repo.spring.io/libs-milestone-local false spring-releases Spring Releases https://repo.spring.io/libs-release-local false

特别说明:

为了紧跟 SpringBoot 的最新版本,从本篇文章开始,博文对应的示例工程中 SpringBoot 版本升级到2.2.1.RELEASE

II. Servlet 注册

自定义一个 Servlet 比较简单,一般常见的操作是继承HttpServlet,然后覆盖doGet, doPost等方法即可;然而重点是我们自定义的这些 Servlet 如何才能被 SpringBoot 识别并使用才是关键,下面介绍四种注册方式

1. @WebServlet

在自定义的 servlet 上添加 Servlet3+的注解@WebServlet,来声明这个类是一个 Servlet

和 Fitler 的注册方式一样,使用这个注解,需要配合 Spring Boot 的@ServletComponentScan,否则单纯的添加上面的注解并不会生效

/** * 使用注解的方式来定义并注册一个自定义Servlet * Created by @author yihui in 19:08 19/11/21. */ @WebServlet(urlPatterns = "/annotation") public class AnnotationServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("name"); PrintWriter writer = resp.getWriter(); writer.write("[AnnotationServlet] welcome " + name); writer.flush(); writer.close(); } }

上面是一个简单的测试 Servlet,接收请求参数name, 并返回 welcome xxx;为了让上面的的注解生效,需要设置下启动类

@ServletComponentScan @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class); } }

然后启动测试,输出结果如:

➜ ~ curl http://localhost:8080/annotation\?name\=yihuihui # 输出结果 [AnnotationServlet] welcome yihuihui% 2. ServletRegistrationBean

在 Filter 的注册中,我们知道有一种方式是定义一个 Spring 的 Bean FilterRegistrationBean来包装我们的自定义 Filter,从而让 Spring 容器来管理我们的过滤器;同样的在 Servlet 中,也有类似的包装 bean: ServletRegistrationBean

自定义的 bean 如下,注意类上没有任何注解

/** * Created by @author yihui in 19:17 19/11/21. */ public class RegisterBeanServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("name"); PrintWriter writer = resp.getWriter(); writer.write("[RegisterBeanServlet] welcome " + name); writer.flush(); writer.close(); } }

接下来我们需要定义一个ServletRegistrationBean,让它持有RegisterBeanServlet的实例

@Bean public ServletRegistrationBean servletBean() { ServletRegistrationBean registrationBean = new ServletRegistrationBean(); registrationBean.addUrlMappings("/register"); registrationBean.setServlet(new RegisterBeanServlet()); return registrationBean; }

测试请求输出如下:

➜ ~ curl 'http://localhost:8080/register?name=yihuihui' # 输出结果 [RegisterBeanServlet] welcome yihuihui% 3. ServletContext

这种姿势,在实际的 Servlet 注册中,其实用得并不太多,主要思路是在 ServletContext 初始化后,借助javax.servlet.ServletContext#addServlet(java.lang.String, java.lang.Class



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有