Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ifan112/demo-spring-webmvc
spring-webmvc学习项目
https://github.com/ifan112/demo-spring-webmvc
java spring spring-webmvc
Last synced: about 16 hours ago
JSON representation
spring-webmvc学习项目
- Host: GitHub
- URL: https://github.com/ifan112/demo-spring-webmvc
- Owner: ifan112
- Created: 2019-02-22T06:09:36.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2019-03-01T07:21:45.000Z (over 5 years ago)
- Last Synced: 2024-10-12T02:41:19.000Z (about 1 month ago)
- Topics: java, spring, spring-webmvc
- Language: Java
- Homepage:
- Size: 8.79 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 引入spring-webmvc
Java Servlet Web项目引入Spring WebMVC的方式有两种,第1中基于注解,第2中基于xml配置文件。
1. 监听servlet容器,启动时创建spring容器,使用java注解的形式对spring容器进行配置,注册dispatcherServlet到servlet容器中。
```java
@WebListener
public class DemoSpringWebMvcApplicationInitializer implements ServletContextListener {
/**
* spring容器
*/
private AnnotationConfigWebApplicationContext springContext;
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
// 初始化一个基于java注解的Web应用类型的spring容器
springContext = new AnnotationConfigWebApplicationContext();
// 向spring容器注册配置类,spring将解析该类上的注解,然后对容器进行配置
springContext.register(DemoSpringWebMvcApplicationConfiguration.class);
// 注册dispatcherServlet到Servlet容器中。此后,该servlet将会接收和分发所有请求
ServletRegistration.Dynamic dispatcherServlet
= servletContext.addServlet("dispatcherServlet", new DispatcherServlet(springContext));
dispatcherServlet.setLoadOnStartup(1);
dispatcherServlet.addMapping("/");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
if (springContext != null) {
// 关闭spring容器
springContext.close();
}
}
}
``````java
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.ifan112.demo.swmvc")
public class DemoSpringWebMvcApplicationConfiguration {
}
```2. web.xml中注册dispatcherServlet,添加默认的spring配置文件/WEB-INF/dispatcherServlet-servlet.xml。
web.xml
```xml
Archetype Created Web Application
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
1
dispatcherServlet
/
```/WEB-INF/dispatcherServlet-servlet.xml
```xml
```# spring web容器启动入口
不管是使用java注解配置还是xml配置文件的形式,spring web容器的启动过程都是一致的。将spring的DispatcherServlet注册到了servlet容器(tomcat)中,这就是启动spring web容器的入口。
先看下DispatcherServlet的继承结构:
```
GenericServlet
.init() // servlet容器初始化时会调用该方法,子类可以实现自定义逻辑。例如,初始化spring容器。
|
HttpServlet ---- servlet规范
|
HttpServletBean ---- spring实现
.init() // 重写了GenericServlet中的方法,调用initServletBean()方法
.initServletBean() // 留给子类重写,实现自定义逻辑
|
FrameworkServlet
.initServletBean() // 重写了HtppServletBean中的方法,用于初始化spring容器
|
DispatcherServlet ---- 最主要的Servlet
```servlet容器在初始化DispatcherServlet时,会调用继承自其父类GenericServlet的init()方法。spring DispatcherServlet的父类HttpServletBean重写了这个方法,并且留下了initServletBean()这个方法给子类用于实现自定义的逻辑。spring DispatcherServlet的父类FrameworkServlet重写了initServletBean(),并在该方法中初始化了spring容器。
```java
/**
* servlet规范
*/
public abstract class GenericServlet
implements Servlet, ServletConfig, java.io.Seralizable {public void init() throws ServletException {
// DispatcherServlet的父类HttpServletBean重写了这个方法
}
}public abstract class HttpServletBean extends HttpServlet implements .. {
/**
* spring DisptacherServlet的父类HttpServletBean重写了init()方法,
*/
@Override
public final void init() throws ServletException {
// ... 其它逻辑
// 留给子类重写的方法
initServletBean();
}
}public abstract class FrameworkServlet extends HttpServletBean implements .. {
/**
* spring DispatcherServlet的父类FrameworkServlet重写了initSevletBean()方法
*/
@Override
protected final void initServletBean() throws ServletException {
// ... 其它逻辑
try {
// 初始化spring web容器
this.webApplicationContext = initWebApplicationContext();
initFrameworkServlet(); // 又是留给子类重写的方法
} catch (Exception e) {
// ...
}
}
}public class DispatcherServlet extends FrameworkServlet {
}
```![启动入口截图](https://ws2.sinaimg.cn/large/006tKfTcgy1g0fcxmmx2gj30zh0u04ae.jpg)
spring web容器启动入口调试截图
# spring web容器启动过程分析