Spring MVC的运行流程
Spring MVC的运行流程
摘要:本文档主要结合官方给出的Spring MVC流程图结合一个简单的Spring MVC实例,分析并介绍了Spring MVC的运行流程。
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>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载springmvc.xml配置文件的位置和名称,配置的是spring配置-->
<init-param>
<!-- contextConfigLocation:上下文配置路径,固定值-->
<param-name>contextConfigLocation</param-name>
<!-- classpath:类路径,指的是Java和resource文件夹-->
<!-- springmvc.xml:指的是配置文件的名称:需要配置springmvc.xml,在下面-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置启动加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
其中流程图中的dispatcherServlet
就是上述配置信息中的:
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载springmvc.xml配置文件的位置和名称,配置的是spring配置-->
<init-param>
<!-- contextConfigLocation:上下文配置路径,固定值-->
<param-name>contextConfigLocation</param-name>
<!-- classpath:类路径,指的是Java和resource文件夹-->
<!-- springmvc.xml:指的是配置文件的名称:需要配置springmvc.xml,在下面-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置启动加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
这个部分就是引入前端控制器的配置信息,我们可以将这个部分就理解为前端控制器,前端控制器的主要作用就是转发信息,其作用类似Servlet但是功能远胜于Servlet,其配置比Servlet更加方便,无须为每个模块进行配置,只需这一条配置信息就可保证所有信息的正确转发。现在我们来逐条分析这些代码:
用户的请求信息进入到系统中来后首先会被servlet-mapping
检测到,也就是被下面的代码检测到:
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
如果请求路径中带有.do
的后缀,那么这个请求就会被接收,然后会根据这个dispatcherServlet
名称进行映射,被映射到servlet
标签中去,这个标签中加载了一些其自身需要使用到的工具路径,以及我们书写的springmvc.xml
配置文件,这个标签就是根据我们的配置文件进行转发的寻址的,现在我们分析servlet
标签:
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载springmvc.xml配置文件的位置和名称,配置的是spring配置-->
<init-param>
<!-- contextConfigLocation:上下文配置路径,固定值-->
<param-name>contextConfigLocation</param-name>
<!-- classpath:类路径,指的是Java和resource文件夹-->
<!-- springmvc.xml:指的是配置文件的名称:需要配置springmvc.xml,在下面-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置启动加载-->
<load-on-startup>1</load-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分析
<?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"
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">
<!--配置spring创建容器时要扫描的包-->
<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>
<!-- templateEngine -->
<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>
<!--配置spring开启注解mvc的支持 默认就是开启的 ,要想让其他组件(不包含映射器、适配器、处理器)生效就必须需要配置了-->
<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>
<!-- templateEngine -->
<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" />
这里指定的就是返回视图的相关信息,首先<property name="prefix" value="/html/" />
指定的是视图的返回路径,这里我们在项目中配置的就是/html/
:
之后就是<property name="suffix" value=".html" />
配置的则是文件后缀,这里实际上是启用了一个字符串拼接,根据我们在控制器中返回的内容,进行一个字符串拼接,由我们处理器中的返回信息可以看见,返回的字符串是suc,这样一拼接就能拼接成suc.xml了,这样我们将处理器的信息返回到这个视图解析器中,视图解析器就能够将我们的返回信息解析成正确的目标位置了。
在此,视图解析器解析处正确路径之后,这些数据就会被发送到视图中去,进而解析出来,如图所示:
Spring MVC的运行流程的更多相关文章
- SpringMVC系列(十四)Spring MVC的运行流程
Spring MVC的运行流程图: 1.首先看能不能发送请求到Spring MVC的DispatcherServlet的url-pattern2.如果能发送请求,就看在Spring MVC中是否存在对 ...
- Spring MVC详细运行流程
- Spring MVC 的运行流程
1.用户发送请求到DispatcherServlet 2.DispatcherServlet调用处理器映射器(HanderMapping)找到处理器 3.处理器映射器(HanderMapping)返回 ...
- Spring Bean的生命周期、Spring MVC的工作流程、IOC,AOP
1.Spring Bean的生命周期? (1)构造方法实例化bean. (2)构造方法设置对象属性. (3)是否实现aware接口,三种接口(BeanNameAware,BeanFactoryAwar ...
- spring mvc 框架运行机制 + 数据绑定原理
spring mvc 运行主要的组件: 1 前端控制器 (dispatchservlet) 相当于一个重要处理器,它用来调用其他功能模块来分工的效应一次请求,主要起调度的作用. 2. handler ...
- spring mvc jsp运行不起来的问题
spring mvc已经处理成让jsp运行,即: <bean class="org.springframework.web.servlet.view.InternalResourceV ...
- spring mvc 详细执行流程
名词解释 DispatcherServlet:整个spring MVC的前端控制器,由它来接管来自客户端的请求. HandlerMapping:DispatcherServlet会通过它来处理客户端请 ...
- Spring MVC整体处理流程
一.spring整体结构 首先俯视一下spring mvc的整体结构 二.处理流程 1.请求处理的第一站就是DispatcherServlet.它是整个spring mvc的控制核心.与大多数的jav ...
- Spring MVC请求执行流程
学习Spring MVC时间有点长了,但是最近打算找工作,需要重新了解下,所以又去温故知新了.Spring MVC就是用来写web的框架,简化你写web的一些不必要的流程,让程序员能专注于业务逻辑也就 ...
- Spring MVC执行的流程
1.Spring MVC应用的开发步骤 a.在web.xml文件中定义前端控制器DispatcherServlet来拦截用户请求.由于Web应用是基于请求/响应架构的应用,所以 不管哪个MVC Web ...
随机推荐
- springboot项目中使用shiro实现用户登录以及权限的验证
欢迎大家加入我的社区:http://t.csdn.cn/Q52km 社区中不定时发红包 更加高级的验证用户权限:用户表.角色表.权限表.多表联合:https://blog.csdn.net/weixi ...
- 齐博x1标签实例:标签的嵌套用法,调用聚合数据
齐博标签非常强大,可以让不懂程序的你,轻松就能实现所见即所得. 下面跟大家讲解一下,最复杂的运用, 同时使用了union 动态变量参数 与 分页处理标签 比如下面这张图,不仅仅想调用圈子,还想同时调用 ...
- 齐博x1.3通用栏目名称及参数调用接口
对于全站的频道可以使用下面的方法取出相应的栏目名称及参数http://qb.net/index.php/cms/wxapp.sorts.html注意,只需要把qb.net换成你的域名,cms 换成其它 ...
- ES6 学习笔记(八)基本类型Symbol
1.前言 大家都知道,在ES5的时候JavaScript的基本类型有Number.String.Boolean.undefined.object.Null共6种,在es6中,新增了Symbol类型,用 ...
- 将Oracle数据库迁移到达梦数据库
公司某产品在项目现场上常用到的数据库有Oracle和达梦. 做性能测试需要根据项目现场预埋大量的基础数据和业务数据,耗费时间.精力.故完成Oracle数据库的性能测试之后,采用直接将Oracle数据库 ...
- Byte和byte的区别
Byte和byte的区别 背景 今天学习网络编程中,在建立Udp连接时,使用byte[]数组接收传输的数据,但是byte[]错写为Byte[],导致错误. //接收数据: Byt ...
- 如何重启kafka
修改配置文件 ps -ef |grep kafka kill (kafka进程号) 启动kafka [root@lecode-dev-001 bin]# ./kafka-server-start.sh ...
- cookies和session总结
1.作为基础知识,但是也是容易被我们忽略的知识. 2.从我的一次面试中,面试官问到,session是什么?和cookies有什么关系,当时我以为很简单,便顺口回答到,session是为了解决http无 ...
- Ansible执⾏速度优化
个人名片: 因为云计算成为了监控工程师 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 优化⼀: 开启SSH长连接 Ansible模式是使⽤SSH和远程主机进⾏通信, 所以Ansi ...
- bugku web2
打开全是滑稽.... 直接查看源码(用firefox的F12来查看,其他的会注释掉)可以得到flag(抓包不知道怎么回事抓不到,不然应该也可以看到注释的flag)