spring webmvc启动流程:serlvet注册、IoC容器创建、bean初始化、MVC的流程

本文深入剖析SpringMVC框架的工作原理,涵盖servlet注册、IoC容器创建、Bean初始化及MVC流程,同时提供了实战代码示例。


本作业管理系统改进后的的源码地址
https://github.com/zhangzhangzhang0/javaee01/blob/master/j1/src/main/java/org/example/spring/mvc/jdbc/HomeworkJdbc.java

Spring MVC

  • 视图(View):代表用户交互界面,对于Web应用来说,可以是HTML,也可能是jsp、XML和Applet等。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。
  • 模型(Model):是业务的处理以及业务规则的制定。模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计是MVC最主要的核心。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只是组织管理这些模型,以便于模型的重构和提高重用性。
  • 控制(Controller):可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么

(1)servlet注册

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架.springMVC是spring的一个后续产品,其实就是spring在原有基础上,又提供了web应用的MVC模块,可以简单的把springMVC理解为是spring的一个模块

以下是本项目web.xml中的配置

  • web.xml中需要注册DispatcherServlet,DispatcherServlet是springMVC中唯一的一个Servlet.
  • 在web.xml中通过contextConfigLocation配置spring,contextConfigLocation参数定义了要装入的 Spring 配置文件。
  • “init-param”与“context-param”
    init-param:由于init-param是配置在servlet中,属于某一下servlet
    context-param:由于context-param是配置在web下面,属于上下文参数,在整个环境中都可使用
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <!-- 全局 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/app-context.xml</param-value>
  </context-param>

  <!-- 自定义编码拦截器 也是spring为我们写好的 -->
  <filter>
    <filter-name>setcharacter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>

    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>setcharacter</filter-name>
    <url-pattern>/</url-pattern>
  </filter-mapping>
  <!-- 有关于Spring MVC的配置 -->
  <!-- 入口(与servlet相关的容器) -->
  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/app-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/app/</url-pattern>
  </servlet-mapping>
</web-app>

(2)Ioc容器创建

  • IoC是spring的核心。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。

Spring的IoC容器在实现控制反转和依赖注入的过程中,可以划分为两个阶段:

  1. 容器启动阶段
  2. Bean实例化阶段

Spring中提供了两种IoC容器:

  • BeanFactory
  • ApplicationContext

在本项目中,通过以下方式创建IoC容器

ApplicationContext applicationContext1 = new AnnotationConfigApplicationContext(HomeworkJdbc.class);
    HomeworkJdbc homeworkJdbc = (HomeworkJdbc) applicationContext1.getBean("getHomeworkJdbc");

    ApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(StudentHomeworkJdbc.class);
    StudentHomeworkJdbc studentHomeworkJdbc = (StudentHomeworkJdbc) applicationContext2.getBean("getStudentHomeworkJdbc");

    ApplicationContext applicationContext3 = new AnnotationConfigApplicationContext(StudentJdbc.class);
    StudentJdbc studentJdbc = (StudentJdbc) applicationContext3.getBean("getStudentJdbc");

(3)Bean初始化

  • 在Spring中,通常是通过配置文档的方式定义Bean

Bean的作用域

  • Singleton:单例模式。在整个SpringIoC容器中,使用singleton定义的Bean将只有一个实例,这是默认的配置。
  • Prototype:原型模式。每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。
  • request:对于每次HTTP请求,使用request定义的Bean都将产生一个新的实例,即每次HTTP请求都会产生不同的Bean实例。当然只有在WEB应用中使用Spring时,该作用域才真正有效。
  • session:对于每次HTTPSession,使用session定义的Bean都将产生一个新的实例时,即每次HTTP Session都将产生不同的Bean实例。同HTTP一样,只有在WEB应用才会有效。
  • global session:每个全局的HTTPSession对应一个Bean实例。仅在portlet Context的时候才有效。

bean的配置

  • xml配置
    通过注解进行配置
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.2.xsd">

<context:component-scan base-package="org.example.spring.mvc.controller">

</context:component-scan>


</beans>

  • 使用时注解声明
@Controller
//@RequestMapping("/teacher/")
public class TController extends HttpServlet {

}
  • @Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
@Configuration
public class HomeworkJdbc extends base {

    @Bean
    public HomeworkJdbc getHomeworkJdbc(){
        return new HomeworkJdbc();
    }
    //...
}

(4)mvc流程

Spring MVC流程

  • 发起请求到前端控制器(DispatcherServlet)
  • 前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)
  • 处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略
  • 前端控制器调用处理器适配器去执行Handler
  • 处理器适配器HandlerAdapter将会根据适配的结果去执行Handler
  • Handler执行完成给适配器返回ModelAndView
  • 处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)
  • 前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可
  • 视图解析器向前端控制器返回View
  • 前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)
  • 前端控制器向用户响应结果

组件

  • 前端控制器DispatcherServle(不需要程序员开发):作用接收请求,响应结果,相当于转发器,中央处理器。有了DispatcherServlet减少了其它组件之间的耦合度。
  • 处理器映射器HandlerMapping(不需要程序员开发):根据请求的url查找Handler
  • 处理器适配器HandlerAdapter:按照特定规则(HandlerAdapter要求的规则)去执行Handler
  • 处理器Handler(需要程序员开发):编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
  • 视图解析器View resolver(不需要程序员开发):进行视图解析,根据逻辑视图名解析成真正的视图(view)
  • 视图View(需要程序员开发jsp):View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)

SpringMVC常用注解及其作用

@Controller:标识这个类是一个控制器
@RequestMapping:给控制器方法绑定一个uri
@ResponseBody:将java对象转成json,并且发送给客户端
@RequestBody:将客户端请求过来的json转成java对象
@RequestParam:当表单参数和方法形参名字不一致时,做一个名字映射
@PathVarible:用于获取uri中的参数,比如user/1中1的值
@SessionAttribute:声明将什么模型数据存入session
@CookieValue:获取cookie值
@ModelAttribute:将方法返回值存入model中
@HeaderValue:获取请求头中的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值