SpringBoot 中使用 Servlet 开发

介绍:
a. SpringBoot为我们自动配置了一个开箱即用的DispatcherServlet, 映射路径为"/";
b. SpringBoot默认是不支持JSP的,所有想用JSP就必须使用外来的容器来运行,即不能使用嵌入的tomcat或jetty;
c. 那么SpringBoot如何快速的支持Servlet呢?

场景:
a. 老项目使用JSP写的页面,后台用Servlet; 现在要改造为SpringBoot
b. SpringBoot项目使用Druid数据库连接池时,需要保留Druid对SQL的监控.也迫切需要SpringBoot对Servlet的支持
c. 项目中有多个服务,为了对不同服务进行不同的配置管理,需要对不同的服务设置不同的上下文;

解决方案:
  前奏:
  传统SpringMVC项目,在web.xml中直接配置就可以了;
  通过指定init-param中的contextConfigLocation就能够为这个DispatcherServlet指定上下文。

  <servlet>
        <servlet-name>restServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring2.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>ModelRestServlet</servlet-name>
        <url-pattern>/service/*</url-pattern>
    </servlet-mapping>

  SpringBoot默认我们提供了注册Servlet的三大组件:Servlet Filter Listener接口,我们只需按需配置和添加少量的代码即可实现添加 Servlet 的功能。
  
  正解:
  由于SpringBoot默认是以jar包的方式启动嵌入式的 Servlet 容器来启动 SpringBoot 的 web 应用,没有 web.xml 文件。所以想             用使用 Servlet 功能,就必须要借用 Spring Boot 提供的 ServletRegistrationBean 接口.这个Bean是由SpringBoot提供专门            注册servlet的,可以像注册bean一样去注册Servlet;
  
  示例代码一:
  因此整个实现就变得很简单了。我们只需要在 @Configuration 注解过的类中做以下配置即可使用 Servlet 功能

//注册Servlet组件
@Bean
public ServletRegistrationBean myServlet(){
	ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(),"/myServlet");
	return registrationBean;
}

  示例代码二:

    @Bean
    public ServletRegistrationBean restServlet(){
        //注解扫描上下文
        AnnotationConfigWebApplicationContext applicationContext
                = new AnnotationConfigWebApplicationContext();
        //base package
        applicationContext.scan("com.jerryl.rest");
        //通过构造函数指定dispatcherServlet的上下文
        DispatcherServlet rest_dispatcherServlet
                = new DispatcherServlet(applicationContext);

        //用ServletRegistrationBean包装servlet
        ServletRegistrationBean registrationBean
                = new ServletRegistrationBean(rest_dispatcherServlet);
        registrationBean.setLoadOnStartup(1);
        //指定urlmapping
        registrationBean.addUrlMappings("/rest/*");
        //指定name,如果不指定默认为dispatcherServlet
        registrationBean.setName("rest");
        return registrationBean;
    }

   示例二说明:
   1.registrationBean.setName("rest");  这个自定义Servlet的名称很重要; 因为name一样的ServlerRegistrationBean只会生效一个;
   2.registrationBean.setName("rest"); 这个自定义Servlet的名称必须指定, 如果不指定,默认为"dispatcherServlet",而spring boot          提供的DispatcherServlet的name就是“dispatcherServlet”。
   参考代码:

   public ServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
            ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet, new String[]{this.serverProperties.getServletMapping()});
            registration.setName("dispatcherServlet");
            registration.setLoadOnStartup(this.webMvcProperties.getServlet().getLoadOnStartup());
            if(this.multipartConfig != null) {
                registration.setMultipartConfig(this.multipartConfig);
            }

            return registration;
        }
    }

同时
    在自定义的DispathcerServlet绑定的配置类上,要配置报扫描的话,必须要加上@EnableWebMvc注解,不然不会扫描@Contrller注解。

参考文献: https://www.jianshu.com/p/be2dafc8c644

                https://www.xttblog.com/?p=2812

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值