简介
本文针对基于Spring MVC的作业管理系统分析其启动流程,包括serlvet注册、IoC容器创建、bean初始化、MVC的流程。
流程分析
1.servlet注册
1.1 web.xml文件
在为原来的项目添加Spring MVC框架支持或者使用Spring MVC新建项目以后,我们可以看到在web目录下的WEB-INF文件夹下可以看到生成了web.xml文件。该文件下有如下配置用于设置servlet:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
其中init-param标签指定了servlet配置文件的路径,该项目中配置文件为resources目录下的dispatcher-servlet.xml文件。
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
另外通过servlet-mapping标签下的url-pattern标签可以指定url的格式。
1.2 dispatcher-servlet.xml文件
<context:component-scan base-package="org.example.javaee.class01.controller"/>
配置文件中的以上一行代码指定了controller文件夹的路径,controller即为MVC中的C的部分。
<!--指定视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 视图的路径,value值根据你命名的文件夹一致 -->
<property name="prefix" value="/jsp/"/>
<!-- 视图名称后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
该部分代码配置了视图解析器的使用以及jsp文件的路径与后缀。
1.3 controller
controller文件夹下有一个HMSController.java。所有servlet的执行函数均位于该文件下。
@Controller
@RequestMapping("/hms")
类之前的两个注解分别指定了该类为一个controller类以及url的之前的一部分。
@RequestMapping("/addHk")
public String addHk() {
return "addHomework";
}
方法前都有一个注解,访问对应注解的url就会执行该函数,如以上接口表示访问https://localhost:8080/hms/addHk这个url即可访问jsp目录下的addHomework.jsp,jsp文件的前缀和后缀已经在servlet配置文件中设定好了。
2.IoC容器创建与bean的初始化
Spring IOC容器是框架的核心,IOC是控制反转的意思,可以用来降低程序代码之间的耦合度。把强耦合的代码依赖从代码中移出去,放到统一的XML配置文件中,将程序对组件的主要控制权交给IOC,由IOC统一加载和管理。bean共有以下三种方式定义
2.1 基于XML的配置
web.xml下指定了定义bean的xml文件位置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
在applicationContext.xml文件下进行了bean的定义:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="Homework" class="org.example.javaee.class01.model.Homework" scope="prototype"></bean>
<bean id="Student" class="org.example.javaee.class01.model.Student" scope="prototype"></bean>
<bean id="StudentHomework" class="org.example.javaee.class01.model.StudentHomework" scope="prototype"></bean>
<bean id="HomeworkJDBC" class="org.example.javaee.class01.jdbc.HomeworkJDBC"></bean>
</beans>
2.2 基于注解的配置
Spring提供了四个注解,这些注解的作用与上面的XML定义bean效果一致,在于将组件交给Spring容器管理。组件的名称默认是类名(首字母变小写),可以自己修改:
- @Component:当对组件的层次难以定位的时候使用这个注解
通过在类前添加注解可以实现bean的定义:
@Component
public class Homework {
.....
}
HMSController类前添加注解扫描model文件夹:
@ComponentScan("org.example.javaee.class01.model.*")
使用AnnotationConfigApplicationContext来获取bean:
public AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(HMSController.class);
2.3 基于Java类的配置
步骤如下:
- 使用@Configuration注解需要作为配置的类,表示该类将定义Bean的元数据。
- 使用@Bean注解相应的方法,该方法名默认就是Bean的名称,该方法返回值就是Bean的对象。
- AnnotationConfigApplicationContext或子类进行加载基于java类的配置。
@Configuration
public class BeansConfiguration {
@Bean
public Student student(){
Student student=new Student();
return student;
}
}
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeansConfiguration.class);
Student student = (Student) context.getBean("student");
3.MVC的流程
该项目技术架构主要由javaBean组件、业务逻辑处理、实体、前端四部分组成,主要基于Spring MVC框架,其流程可由下图解释:

Spring MVC流程
主要过程为:
- 用户发送请求至前端控制器DispatcherServlet。
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter处理器适配器。
- HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
- Controller执行完成返回ModelAndView。
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
- ViewReslover解析后返回具体View。
- DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户。