Spring MVC的运行流程

Spring MVC的运行流程,第1张

文章目录
  • 1.Spring MVC官方流程图
  • 2.Spring MVC流程分析
    • 2.1.用户向DispatcherServlet发送请求并转发至正确的处理器
    • 2.2.处理器中的行为
    • springmvc.xml分析

1.Spring MVC官方流程图

2.Spring MVC流程分析 2.1.用户向DispatcherServlet发送请求并转发至正确的处理器

用户发送的请求会被xml文件中的配置生成的进程检测到,因此xml文件中的配置信息能够反映出用户发送请求的处理情况,xml文件如下所示:

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">



  <servlet>
    <servlet-name>dispatcherServletservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>

    <init-param>

      <param-name>contextConfigLocationparam-name>


      <param-value>classpath:springmvc.xmlparam-value>
    init-param>

    <load-on-startup>1load-on-startup>
  servlet>
  
  <servlet-mapping>
    <servlet-name>dispatcherServletservlet-name>
    <url-pattern>*.dourl-pattern>
  servlet-mapping>

web-app>

其中流程图中的dispatcherServlet就是上述配置信息中的:

<servlet>
    <servlet-name>dispatcherServletservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>

    <init-param>

      <param-name>contextConfigLocationparam-name>


      <param-value>classpath:springmvc.xmlparam-value>
    init-param>

    <load-on-startup>1load-on-startup>
  servlet>
  
  <servlet-mapping>
    <servlet-name>dispatcherServletservlet-name>
    <url-pattern>*.dourl-pattern>
  servlet-mapping>

这个部分就是引入前端控制器的配置信息,我们可以将这个部分就理解为前端控制器,前端控制器的主要作用就是转发信息,其作用类似Servlet但是功能远胜于Servlet,其配置比Servlet更加方便,无须为每个模块进行配置,只需这一条配置信息就可保证所有信息的正确转发。现在我们来逐条分析这些代码:

用户的请求信息进入到系统中来后首先会被servlet-mapping检测到,也就是被下面的代码检测到:

<servlet-mapping>
    <servlet-name>dispatcherServletservlet-name>
    <url-pattern>*.dourl-pattern>
servlet-mapping>

如果请求路径中带有.do的后缀,那么这个请求就会被接收,然后会根据这个dispatcherServlet名称进行映射,被映射到servlet标签中去,这个标签中加载了一些其自身需要使用到的工具路径,以及我们书写的springmvc.xml配置文件,这个标签就是根据我们的配置文件进行转发的寻址的,现在我们分析servlet标签:

<servlet>
    <servlet-name>dispatcherServletservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>

    <init-param>

      <param-name>contextConfigLocationparam-name>


      <param-value>classpath:springmvc.xmlparam-value>
    init-param>

    <load-on-startup>1load-on-startup>
servlet>

首先在servlet-name中配置了其名称,这里是映射用的,servlet-mapping中的信息传递就是通过这个名称映射过来的,之后servlet-class中是它的实体路径名,使用前端控制器肯定是需要使用到它的实体代码的,而下面的init-param标签则是上下文配置路径,其中param-name也是做映射用的,是一个固定值,而param-value中则是存放的我们的spring配置信息,我们的类扫描路径指定,处理器映射器引用等信息全在这里面,要是想让项目正确运行那肯定是要设置它的。

在这里,用户的请求的地址就会被Spring MVC明晰,这些信息会被发送给处理器映射器处理,处理器映射器是在springmvc.xml中配置的,下面会着重介绍,然后处理器映射器会返回一个处理器执行链信息,并将这个执行链信息返回给前端控制器,前端控制器会将这个信息发送给处理器适配器,而处理器适配器则会拿着这个信息去匹配相应的处理器,处理器就是我们书写的java代码了,在这里处理器适配器也是在springmvc.xml中配置的,前端控制器使用这个配置文件的加载,实现了这里的两个信息交互,我们先来看一下局部的代码,关于springmvc.xml的全部信息我们在下面研究。

 
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

可见二者的配置信息,前端控制器就是通过这两条配置信息实现交互的。

2.2.处理器中的行为

我们先看看处理器是什么样子的:

package com.qcby;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

//把当前类交给IOC容器进行管理
@Controller
public class HelloController {
    /**
     * 处理超链接发送出来的请求
     * @param model
     * @return
     */
    @RequestMapping(path = "/hello.do")
    public String sayHello(Model model){

        System.out.println("入门方法执行了2...");
        // 向模型中添加属性msg与值,可以在html页面中取出并渲染
        model.addAttribute("msg","hello,SpringMVC");
        // 配置了视图解析器后,写法
        return "suc";

    }
}

在处理器中首先做了一个注解@Controller,它的意思是生成控制层对象,在这里我们必须使用这个注解,因为此时此刻它所在的位置就是控制层。之后是一个映射注解,标明它的路径,控制器适配器就是通过这个信息进行匹配寻找的,之后就是我们的处理行为,这里想怎么写都行,在处理行为完毕之后,我们肯定获得了满满的数据信息(虽然这里并没有,但还是想象一下吧),我们就该往前台返回这些数据了,在这里我们需要设定两种返回的信息,其一是我们处理得到的数据,而是我们想要返回的目标视图信息,其中,model.addAttribute("msg","hello,SpringMVC");是我们返回的数据,其可以被html中的某些 *** 作取出并进行渲染,而return "suc";则是我们返回的目标视图,这里我们返回的只是一个字符串,我们为什么能这么写呢?这是和我们的springmvc.xml有关系,现在我们分析springmvc.xml:

springmvc.xml分析

<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"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    
    <context:component-scan base-package="com.qcby">context:component-scan>

    
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    
    <bean id="viewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine" ref="templateEngine"/>
    bean>
    
    <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
        <property name="templateResolver" ref="templateResolver"/>
    bean>
    <bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
        <property name="prefix" value="/html/" />
        <property name="suffix" value=".html" />
        <property name="templateMode" value="HTML5"/>
    bean>
    
    <mvc:annotation-driven>mvc:annotation-driven>
beans>

首先里边配置了要被扫描的包,这个信息是之前在生成控制器执行链的时候用到的,这里不做研究。之后是我们的处理器映射器配置信息,在上面的前端控制器向处理器映射器发送请求的步骤中,就是通过这里的引用信息,寻找到处理器映射器并进行数据交互的。然后是处理器适配器的配置,上面的前端控制器和处理器适配器的交互就是通过这里实现的。之后就是视图解析器的配置了,我们着重分析这个代码:

<bean id="viewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine" ref="templateEngine"/>
    bean>
    
    <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
        <property name="templateResolver" ref="templateResolver"/>
    bean>
    <bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
        <property name="prefix" value="/html/" />
        <property name="suffix" value=".html" />
        <property name="templateMode" value="HTML5"/>
    bean>

首先里边配置了一些显示常用的信息,如编码,解析引擎等信息,这些信息的调用都是用过映射实现的,关键的是这两句:

<property name="prefix" value="/html/" />
<property name="suffix" value=".html" />

这里指定的就是返回视图的相关信息,首先指定的是视图的返回路径,这里我们在项目中配置的就是/html/:

之后就是配置的则是文件后缀,这里实际上是启用了一个字符串拼接,根据我们在控制器中返回的内容,进行一个字符串拼接,由我们处理器中的返回信息可以看见,返回的字符串是suc,这样一拼接就能拼接成suc.html了,这样我们将处理器的信息返回到这个视图解析器中,视图解析器就能够将我们的返回信息解析成正确的目标位置了。

在此,视图解析器解析处正确路径之后,这些数据就会被发送到视图中去,进而解析出来,如图所示:
  

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/728004.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存