简介
本文针对基于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:当对组件的层次难以定位的时候使用这个注解
- @Controller:表示控制层的组件
- @Service:表示业务逻辑层的组件
- @Repository:表示数据访问层的组件
通过在类前添加注解可以实现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响应用户。