在 Servlet3.0
之前,我们在使用 Spring MVC
的时候,必须依赖web.xml
配置文件,并且DispatcherServlet
必须要在web.xml
里配置。而 Servlet3.0
可以支持全部采用注解驱动,现在启动一个Web容器
并不强制依赖于web.xml
部署描述文件了,这大大简化了配置web.xml
的麻烦。
既然用注解代替了了web.xml
配置文件,那如何使用Spring MVC
呢,下面通过一个例子来探索其中的原理。
准备一个SpringMVC
的Maven
工程
写一个最基本的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
配置的方式相比,省事太多了。
之前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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?