基于Spring MVC的作业管理系统启动流程分析

简介: 本文针对基于Spring MVC的作业管理系统分析其启动流程,包括serlvet注册、IoC容器创建、bean初始化、MVC的流程。

简介


本文针对基于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类的配置


步骤如下:


  1. 使用@Configuration注解需要作为配置的类,表示该类将定义Bean的元数据。


  1. 使用@Bean注解相应的方法,该方法名默认就是Bean的名称,该方法返回值就是Bean的对象。


  1. 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框架,其流程可由下图解释:


微信图片_20220531171945.png


                                                  Spring MVC流程


主要过程为:


  1. 用户发送请求至前端控制器DispatcherServlet。


  1. DispatcherServlet收到请求调用HandlerMapping处理器映射器。


  1. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。


  1. DispatcherServlet调用HandlerAdapter处理器适配器。


  1. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。


  1. Controller执行完成返回ModelAndView。


  1. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。


  1. DispatcherServlet将ModelAndView传给ViewReslover视图解析器。


  1. ViewReslover解析后返回具体View。


  1. DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。


  1. DispatcherServlet响应用户。



相关文章
|
18天前
|
前端开发 Java Spring
Spring MVC 是如何对对象参数进行校验的
【6月更文挑战第4天】对象参数校验是使用 SpringMVC 时常用的功能,这篇文章尝试分析了,Spring 是如何实现这一功能的。
29 5
|
5天前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
10 1
|
5天前
|
前端开发 Dubbo Java
spring面试题_spring mvc面试题_springboot面试题库
spring面试题_spring mvc面试题_springboot面试题库
|
7天前
|
JSON 前端开发 Java
【JavaEE进阶】 关于Spring MVC 响应
【JavaEE进阶】 关于Spring MVC 响应
14 3
|
11天前
|
Java Linux Spring
在 Linux 系统中将 Spring Boot 应用作为系统服务运行
【6月更文挑战第11天】最近由于一些原因,服务器经常会重启,每次重启后需要手动启动 Spring Boot 的工程,因此我需要将其配置成开启自启动的服务。
171 1
|
16天前
|
JSON 前端开发 Java
Spring MVC 级联对象参数校验
【6月更文挑战第6天】在 Spring MVC 的使用过程中,我们会发现很多非常符合直觉的功能特性,但往往我们会习惯这种「被照顾得很好」的开发方式,依靠直觉去判断很多功能特性的用法。
18 1
|
20天前
|
JSON 前端开发 Java
Spring第四课,MVC终章,应用分层的好处,总结
Spring第四课,MVC终章,应用分层的好处,总结
|
22天前
|
JSON 前端开发 Java
Spring Web MVC入门(3)——响应
Spring Web MVC入门(3)——响应
26 1
|
21小时前
|
JSON 前端开发 Java
spring mvc 请求与响应
spring mvc 请求与响应
6 0
|
22小时前
|
JSON 前端开发 Java
spring mvc Rest风格
spring mvc Rest风格
7 0