基于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响应用户。



相关文章
|
5月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
161 0
|
2月前
|
存储 人工智能 自然语言处理
用Spring AI搭建本地RAG系统:让AI成为你的私人文档助手
想让AI帮你读懂PDF文档吗?本文教你用Spring AI和Ollama搭建一个本地RAG系统,让AI成为你的私人文档助手。无需GPU,无需云端API,只需几行代码,你的文档就能开口说话了!
|
消息中间件 存储 Java
📨 Spring Boot 3 整合 MQ 构建聊天消息存储系统
本文详细介绍了如何使用Spring Boot 3结合RabbitMQ构建高效可靠的聊天消息存储系统。通过引入消息队列,实现了聊天功能与消息存储的解耦,解决了高并发场景下直接写入数据库带来的性能瓶颈问题。文章首先分析了不同MQ产品的特点及适用场景,最终选择RabbitMQ作为解决方案,因其成熟稳定、灵活路由和易于集成等优势。接着,通过Docker快速部署RabbitMQ,并完成Spring Boot项目的配置与代码实现,包括生产者发送消息、消费者接收并处理消息等功能。最后,通过异步存储机制,既保证了消息的即时性,又实现了可靠持久化。
356 0
📨 Spring Boot 3 整合 MQ 构建聊天消息存储系统
|
5月前
|
存储 人工智能 Java
Spring AI与DeepSeek实战四:系统API调用
在AI应用开发中,工具调用是增强大模型能力的核心技术,通过让模型与外部API或工具交互,可实现实时信息检索(如天气查询、新闻获取)、系统操作(如创建任务、发送邮件)等功能;本文结合Spring AI与大模型,演示如何通过Tool Calling实现系统API调用,同时处理多轮对话中的会话记忆。
996 57
|
3月前
|
Java 调度 流计算
基于Java 17 + Spring Boot 3.2 + Flink 1.18的智慧实验室管理系统核心代码
这是一套基于Java 17、Spring Boot 3.2和Flink 1.18开发的智慧实验室管理系统核心代码。系统涵盖多协议设备接入(支持OPC UA、MQTT等12种工业协议)、实时异常检测(Flink流处理引擎实现设备状态监控)、强化学习调度(Q-Learning算法优化资源分配)、三维可视化(JavaFX与WebGL渲染实验室空间)、微服务架构(Spring Cloud构建分布式体系)及数据湖建设(Spark构建实验室数据仓库)。实际应用中,该系统显著提升了设备调度效率(响应时间从46分钟降至9秒)、设备利用率(从41%提升至89%),并大幅减少实验准备时间和维护成本。
240 0
|
3月前
|
负载均衡 Java API
基于 Spring Cloud 的微服务架构分析
Spring Cloud 是一个基于 Spring Boot 的微服务框架,提供全套分布式系统解决方案。它整合了 Netflix、Zookeeper 等成熟技术,通过简化配置和开发流程,支持服务发现(Eureka)、负载均衡(Ribbon)、断路器(Hystrix)、API网关(Zuul)、配置管理(Config)等功能。此外,Spring Cloud 还兼容 Nacos、Consul、Etcd 等注册中心,满足不同场景需求。其核心组件如 Feign 和 Stream,进一步增强了服务调用与消息处理能力,为开发者提供了一站式微服务开发工具包。
469 0
|
6月前
|
人工智能 自然语言处理 Java
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
5012 7
|
6月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——处理系统异常
本文介绍了在Spring Boot项目中如何通过创建`GlobalExceptionHandler`类来全局处理系统异常。通过使用`@ControllerAdvice`注解,可以拦截项目中的各种异常,并结合`@ExceptionHandler`注解针对特定异常(如参数缺失、空指针等)进行定制化处理。文中详细展示了处理参数缺失异常和空指针异常的示例代码,并说明了通过拦截`Exception`父类实现统一异常处理的方法。虽然拦截`Exception`可一劳永逸,但为便于问题排查,建议优先处理常见异常,最后再兜底处理未知异常,确保返回给调用方的信息友好且明确。
744 0
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——处理系统异常
|
5月前
|
SQL 前端开发 Java
深入分析 Spring Boot 项目开发中的常见问题与解决方案
本文深入分析了Spring Boot项目开发中的常见问题与解决方案,涵盖视图路径冲突(Circular View Path)、ECharts图表数据异常及SQL唯一约束冲突等典型场景。通过实际案例剖析问题成因,并提供具体解决方法,如优化视图解析器配置、改进数据查询逻辑以及合理使用外键约束。同时复习了Spring MVC视图解析原理与数据库完整性知识,强调细节处理和数据验证的重要性,为开发者提供实用参考。
239 0
|
8月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
535 8