您当前的位置: 首页 >  容器

止步前行

暂无认证

  • 0浏览

    0关注

    247博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Servlet3.0新特性和Web容器如何整合SpringMVC

止步前行 发布时间:2019-12-25 22:21:08 ,浏览量:0

一、引言

Servlet3.0 之前,我们在使用 Spring MVC 的时候,必须依赖web.xml配置文件,并且DispatcherServlet必须要在web.xml 里配置。而 Servlet3.0 可以支持全部采用注解驱动,现在启动一个Web容器并不强制依赖于web.xml部署描述文件了,这大大简化了配置web.xml的麻烦。

既然用注解代替了了web.xml配置文件,那如何使用Spring MVC呢,下面通过一个例子来探索其中的原理。

二、创建一个SpringBoot工程

准备一个SpringMVCMaven工程

写一个最基本的Servlet,然后就可以访问了http://localhost:8080/index

@WebServlet(urlPatterns = "/index")
public class IndexServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    				throws ServletException, IOException {
        resp.getWriter().write("hello from servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
    				throws ServletException, IOException {
        doGet(req,resp);
    }
}

// 启动类
@SpringBootApplication
@ServletComponentScan //启动器启动时,扫描本目录以及子目录带有的webservlet注解的
public class SpringbootHelloworldApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootHelloworldApplication.class, args);
    }

}

在这里插入图片描述 是不是发现比之前采用web.xml配置的方式相比,省事太多了。

三、原理 1、ServletContainerInitializer

之前Web容器要整合其它模块,都是通过web.xml配置文件,但现在使用注解驱动的话,就没有了web.xml配置文件了,那怎么做呢?这就是Servlet3.0带来的特别特别重要的一个类:ServletContainerInitializer。我们用它来整合Web容器和其它模块。这里只做说明,不做解释,说明来源于官方文档。

Servlet容器启动会扫描当前应用里每一个jar包中,指定目录下META-INF/services/javax.servlet.ServletContainerInitializer中的实现类,并回调其中的onStartup()方法。

当然,我们可以自己提供ServletContainerInitializer的实现类,然后自己书写逻辑。但是一定且必须将实现类绑定在META-INF/services/javax.servlet.ServletContainerInitializer这个文件里,文件内容就是ServletContainerInitializer实现类的全类名;

这样Servlet容器在启动的时候就会自动调用我们提供ServletContainerInitializer的实现类,并执行其中的onStartup()方法。

好,下面来证明一下。特此说明,此处如果创建SpringBoot工程,使用内嵌的Tomcat是不会起作用的,亲测。

// 容器启动的时候会将@HandlesTypes指定的这个类型下面的子类(实现类,子接口等)传递过来,
// 但不包括它自己
@HandlesTypes(value = {IndexService.class})
public class MyServletContainerInitializer implements ServletContainerInitializer {

    /**
     * 应用启动的时候,会运行onStartup方法
     * Set            
关注
打赏
1657848381
查看更多评论
0.0425s