900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > spring boot没有web.xml 如何向嵌入式的servlet容器中注册servlet组件

spring boot没有web.xml 如何向嵌入式的servlet容器中注册servlet组件

时间:2024-01-20 20:08:25

相关推荐

spring boot没有web.xml 如何向嵌入式的servlet容器中注册servlet组件

1. Spring boot默认使用Tomcat作为嵌入式的servlet容器,只要引入spring-boot-starter-web依赖,就会默认用Tomcat作为servlet容器。

2. Spring boot默认以jar包的方式启动嵌入式的servlet容器,来启动spring boot的web应用,没有web.xml

3. 以往要注册servlet组件都是在web.xml文件中配置,现在没有了web.xml,该如何注册。

4. spring boot提供ServletRegistrationBean,FilterRegistrationBean以及ServletListenerRegistrationBean类,供我们向嵌入式的servlet容器中注册Servlet、Filter、Listener组件,获取完全控制。

🆗回顾一下,以往的web应用程序中,是如何来向servlet容器中注册servlet组件

自定义servlet组件

import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServlet;import java.io.IOException;import java.io.PrintWriter;public class MyServlet extends HttpServlet {@Overridepublic void init() throws ServletException {System.out.println("配置自动加载后会自动执行init()方法");}@Overridepublic void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {System.out.println("正在执行服务...");response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.println("<a href=''>百度一下</a>");}}

在web.xml中注册servlet,并指定映射路径

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--注册MyServlet--><servlet><servlet-name>myServlet</servlet-name><servlet-class>com.cd.servlet.MyServlet</servlet-class></servlet><!--指定MyServlet的映射路径--><servlet-mapping><servlet-name>myServlet</servlet-name><url-pattern>/baidu</url-pattern></servlet-mapping></web-app>

效果

/cd是项目的根路径(应用上下文路径),/baidu是MyServlet这个servlet组件的映射路径

🆗接下来看看,spring boot是如何来向servlet容器中注册servlet组件

自定义servlet组件

import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServlet;import java.io.IOException;import java.io.PrintWriter;public class MyServlet extends HttpServlet {@Overridepublic void init() throws ServletException {System.out.println("配置自动加载后会自动执行init()方法");}@Overridepublic void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {System.out.println("正在执行服务...");response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.println("<a href=''>百度一下</a>");}}

通过ServletRegistrationBean类向servlet容器注册servlet,并指定映射路径

import org.springframework.boot.web.servlet.ServletRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class MyServletConfig {//注册servlet@Bean(name = "myServlet")public ServletRegistrationBean servletRegistrationBean(){//注册MyServlet类到servlet容器中,并指定映射路径ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new MyServlet(),"/baidu");return servletRegistrationBean;}}

效果

/cd是项目的根路径(应用上下文路径),/baidu是MyServlet这个servlet组件的映射路径

Servlet容器有三大组件servlet、filter、listener。前面我们讲了spring boot注册servlet组件的方式,下面顺便介绍filter组件的注册

自定义一个编码过滤器

import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("过滤器初始化. . .");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");//放行,继续执行过滤器链的下一个组件(下一个过滤器)filterChain.doFilter(request,response);}}

通过spring boot提供的FilterRegistrationBean类,向servlet容器注册filter组件

import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.Arrays;@Configurationpublic class MyFilterConfig {//注册Filter@Bean(name = "myFilter")public FilterRegistrationBean filterRegistrationBean() {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();//指定要注册的FilterfilterRegistrationBean.setFilter(new MyFilter());//指定映射路径filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));return filterRegistrationBean;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。