一、什么是 Spring MVC

Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面,是一个强大灵活的 Web 框架。Spring MVC 提供了一个 DispatcherServlet 作为前端控制器来分配请求。通过策略接口,Spring 框架是高度可配置的。Spring MVC 还包含多种视图技术,如 Java Server Pages(JSP)、Velocity、Tiles、iText 和 POI 等。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

Spring MVC 框架主要由 DispatcherServlet、处理器映射器、处理器适配器、处理器(控制器)、视图解析器、视图组成。

二、Spring MVC 执行流程

Spring MVC 高层次的请求处理工作流程如下(图来自 Spring 官网):

细分后,Spring MVC 执行流程如下,共包括八步:

Spring MVC 相关接口解释:

(1)DispatcherServlet

前端控制器,所有的请求都有经过它来统一分发,请求会被分发给对应的 Handler。

(2)HandlerMapping(处理器映射器)

解析请求链接,然后根据请求链接找到执行这个请求的类(HandlerMapping 所说的 handler)。

(3)HandlerAdapter(处理器适配器)

调用具体的方法对用户发来的请求来进行处理。

(4)Controller

Controller 将处理用户请求,Controller 处理完用户请求,则返回 ModelAndView 对象给 DispatcherServlet 前端控制器。

从宏观角度考虑,DispatcherServlet 是整个 Web 应用的控制器;从微观考虑,Controller 是单个 Http 请求处理过程中的控制器。

(5)ViewResolver(视图解析器)

解析 MdoelAndView,将 MdoelAndView 中的逻辑视图名变为一个真正的 View 对象,并将 MdoelAndView 中的 Model 取出。

前面简单的介绍了 Spring MVC ,下面以简单的用户注册为例,来了解 Spring MVC 的一些基本原理和运用。

三、项目文件结构

四、开发准备

Spring MVC 的相关文件放在实验楼的服务器中,请打开实验环境桌面上的 Xfce ,输入下面的代码获取:

wget http://labfile.oss.aliyuncs.com/courses/810/Spring-jars.zip

输入下面的命令解压 .zip 文件:

unzip Spring-jars.zip

五、实验步骤

1 新建项目工程

在 Eclipse 里新建一个 Web 工程(Dynamic Web Project),命名为 SpringMVCTest 。

注意勾选 “自动生成 web.xml” 这个选项。

将 /home/shiyanlou/Spring-jars/ 路径下的全部 jar 包拷贝到项目的 WebContent/WEB-INF/lib/ 目录下。

2 配置 web.xml 文件

修改 web.xml 文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>SpringMVCTest</display-name>
<span class="hljs-comment">&lt;!-- 配置 Spring MVC DispatchcerServlet 前端控制器 --&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">servlet&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">servlet-name&gt;springmvc<span class="hljs-tag">&lt;/<span class="hljs-name">servlet-name&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">servlet-class&gt;org.springframework.web.servlet.DispatcherServlet<span class="hljs-tag">&lt;/<span class="hljs-name">servlet-class&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">init-param&gt;
<span class="hljs-comment">&lt;!-- contextConfigLocation 是参数名称,该参数的值包含 Spring MVC 的配置文件路径 --&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">param-name&gt;contextConfigLocation<span class="hljs-tag">&lt;/<span class="hljs-name">param-name&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">param-value&gt;/WEB-INF/springmvc-config.xml<span class="hljs-tag">&lt;/<span class="hljs-name">param-value&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">init-param&gt;
<span class="hljs-comment">&lt;!-- 在 Web 应用启动时立即加载 Servlet --&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">load-on-startup&gt;1<span class="hljs-tag">&lt;/<span class="hljs-name">load-on-startup&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">servlet&gt;
<span class="hljs-comment">&lt;!-- Servlet 映射声明 --&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">servlet-mapping&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">servlet-name&gt;springmvc<span class="hljs-tag">&lt;/<span class="hljs-name">servlet-name&gt;
<span class="hljs-comment">&lt;!-- 监听当前域的所有请求 --&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">url-pattern&gt;/<span class="hljs-tag">&lt;/<span class="hljs-name">url-pattern&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">servlet-mapping&gt;
<span class="hljs-comment">&lt;!-- 添加 register.jsp 为首页 --&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">welcome-file-list&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">welcome-file&gt;register.jsp<span class="hljs-tag">&lt;/<span class="hljs-name">welcome-file&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">welcome-file-list&gt;

</web-app>

在 web.xml 中配置了 DispatchcerServlet,DispatchcerServlet 加载时需要一个 Spring MVC 的配置文件,默认会去 WEB-INF 下查找对应的 [servlet-name]-servlet.xml 文件,如本例中默认查找的是 springmvc-servlet.xml

Spring MVC 的配置文件可以放在任何地方,用 servlet 的子元素 init-param 描述即可,见上述示例代码,这时 DispatchcerServlet 就会去查找 /WEB-INF/springmvc-config.xml

3 springmvc-config.xml 文件

在 WebContent/WEB-INF/ 目录下新建 Spring MVC 配置文件 springmvc-config.xml,配置 Spring MVC 的 Controller,添加如下代码:

<?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-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
<span class="hljs-tag">&lt;<span class="hljs-name">context:annotation-config /&gt;
<span class="hljs-comment">&lt;!-- 配置自动扫描的包,完成 Bean 的创建和自动依赖注入的功能 --&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">context:component-scan <span class="hljs-attr">base-package=<span class="hljs-string">"com.shiyanlou.springmvc.controller" /&gt;
<span class="hljs-comment">&lt;!-- 这两个类用来配置 annotation 类型的处理器映射器和处理器适配器 --&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">bean <span class="hljs-attr">class=<span class="hljs-string">"org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">bean <span class="hljs-attr">class=<span class="hljs-string">"org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /&gt; <span class="hljs-comment">&lt;!-- 配置视图解析器 --&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">bean <span class="hljs-attr">class=<span class="hljs-string">"org.springframework.web.servlet.view.InternalResourceViewResolver"&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">property <span class="hljs-attr">name=<span class="hljs-string">"prefix" <span class="hljs-attr">value=<span class="hljs-string">"/WEB-INF/views/"&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">property&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">property <span class="hljs-attr">name=<span class="hljs-string">"suffix" <span class="hljs-attr">value=<span class="hljs-string">".jsp"&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">property&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">bean&gt;

</beans>

上述配置文件中, Spring 使用了扫描机制查找应用程序所有基于注解的控制器类,在本例中,扫描的是 com.shiyanlou.springmvc.controller 包及其子包下的所有 Java 文件。

同时配置了 annatation 类型的处理器映射器 DefaultAnnotationHandlerMapping 和处理器适配器 AnnotationMethodHandlerAdapter,DefaultAnnotationHandlerMapping 根据请求查找映射,AnnotationMethodHandlerAdapter 完成对控制器类的 @RequestMapping 标注方法(下面会介绍)的调用。

最后配置的视图解析器 InternalResourceViewResolver 用来解析视图,将 View 呈现给用户。视图解析器中配置的 prefix表示视图的前缀, suffix表示视图的后缀。

注:在 Spring4.0 之后,如果不配置处理映射器、处理器适配器和视图解析器,会使用默认的。

4 实体类 User

在项目目录 /Java Resources/src 的包 com.shiyanlou.springmvc.entity 下新建类 User.java,包含 id、username、password 和 age 属性,代码如下:

package com.shiyanlou.springmvc.entity;

import java.io.Serializable;

public class User implements Serializable {
<span class="hljs-keyword">private <span class="hljs-keyword">static <span class="hljs-keyword">final <span class="hljs-keyword">long serialVersionUID = <span class="hljs-number">1L;
<span class="hljs-keyword">private Integer id;
<span class="hljs-keyword">private String username;
<span class="hljs-keyword">private String password;
<span class="hljs-keyword">private Integer age; <span class="hljs-function"><span class="hljs-keyword">public Integer <span class="hljs-title">getId<span class="hljs-params">() {
<span class="hljs-keyword">return id;
} <span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-keyword">void <span class="hljs-title">setId<span class="hljs-params">(Integer id) {
<span class="hljs-keyword">this.id = id;
} <span class="hljs-function"><span class="hljs-keyword">public String <span class="hljs-title">getUsername<span class="hljs-params">() {
<span class="hljs-keyword">return username;
} <span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-keyword">void <span class="hljs-title">setUsername<span class="hljs-params">(String username) {
<span class="hljs-keyword">this.username = username;
} <span class="hljs-function"><span class="hljs-keyword">public String <span class="hljs-title">getPassword<span class="hljs-params">() {
<span class="hljs-keyword">return password;
} <span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-keyword">void <span class="hljs-title">setPassword<span class="hljs-params">(String password) {
<span class="hljs-keyword">this.password = password;
} <span class="hljs-function"><span class="hljs-keyword">public Integer <span class="hljs-title">getAge<span class="hljs-params">() {
<span class="hljs-keyword">return age;
} <span class="hljs-function"><span class="hljs-keyword">public <span class="hljs-keyword">void <span class="hljs-title">setAge<span class="hljs-params">(Integer age) {
<span class="hljs-keyword">this.age = age;
}

}

5 Controller 类的实现

在包 com.shiyanlou.springmvc.controller 下新建 Controller 类 UserController.java,具体解释注释已经给出,代码如下:

package com.shiyanlou.springmvc.controller;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.ModelAttribute;

import org.springframework.web.bind.annotation.RequestMapping; import com.shiyanlou.springmvc.entity.User; /**
  • UserController 是一个基于注解的控制器
  • 可以同时处理多个请求动作

    */

    @Controller

    public class UserController { /**
    • RequestMapping 用来映射一个请求和请求的方法
    • value="/register" 表示请求由 register 方法进行处理

      */

      @RequestMapping(value="/register")

      public String Register(@ModelAttribute("form") User user, Model model) { // user:视图层传给控制层的表单对象;model:控制层返回给视图层的对象

      // 在 model 中添加一个名为 "user" 的 user 对象

      model.addAttribute("user", user);

      // 返回一个字符串 " success" 作为视图名称

      return "success";

      }

      }

6 JSP 页面

(1)register.jsp

在 WebContent 目录下新建一个 JSP 页面命名为 register.jsp,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>register page</title>
</head>
<body>
<form action="register" method="post">
<h5>User registration</h5>
<p>
<label>name </label> <input type="text" id="username" name="username"
tabindex="1">
</p>
    <span class="hljs-tag">&lt;<span class="hljs-name">p&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">label&gt;password <span class="hljs-tag">&lt;/<span class="hljs-name">label&gt; <span class="hljs-tag">&lt;<span class="hljs-name">input <span class="hljs-attr">type=<span class="hljs-string">"text" <span class="hljs-attr">id=<span class="hljs-string">"password" <span class="hljs-attr">name=<span class="hljs-string">"password"
<span class="hljs-attr">tabindex=<span class="hljs-string">"2"&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">p&gt; <span class="hljs-tag">&lt;<span class="hljs-name">p&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">label&gt;age <span class="hljs-tag">&lt;/<span class="hljs-name">label&gt; <span class="hljs-tag">&lt;<span class="hljs-name">input <span class="hljs-attr">type=<span class="hljs-string">"text" <span class="hljs-attr">id=<span class="hljs-string">"age" <span class="hljs-attr">name=<span class="hljs-string">"age"
<span class="hljs-attr">tabindex=<span class="hljs-string">"3"&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">p&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">p <span class="hljs-attr">id=<span class="hljs-string">"buttons"&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">input <span class="hljs-attr">id=<span class="hljs-string">"submit" <span class="hljs-attr">type=<span class="hljs-string">"submit" <span class="hljs-attr">tabindex=<span class="hljs-string">"4" <span class="hljs-attr">value=<span class="hljs-string">"register"&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">input <span class="hljs-attr">id=<span class="hljs-string">"reset" <span class="hljs-attr">type=<span class="hljs-string">"reset" <span class="hljs-attr">tabindex=<span class="hljs-string">"5" <span class="hljs-attr">value=<span class="hljs-string">"reset"&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">p&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">form&gt;

</body>

</html>

(2)success.jsp

在 WebContent/WEB-INF 目录下新建文件夹 views,并在该路径下新建一个 JSP 页面命名为 success.jsp,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>success page</title>
</head>
<body>
<h5>login was successful</h5>
<p>
name:${requestScope.user.username}<br /> password:${requestScope.user.password}<br /> age:${requestScope.user.age}<br />
</p>
</body>
</html>

7 运行测试

注:由于在线环境的资源问题,这里启动 tomcat 比较慢,需要大家耐心等待几分钟。如果遇到 Tomcat 启动超时的问题,请按照下图的方法延长 Tomcat 的启动时间。

右击 SpringMVCTest 工程,Run As->Run on Server,保持默认选项不变,点击 Finish,一会儿即可看到结果:

输入注册信息,点击注册按钮,结果如下:

来自:https://www.cnblogs.com/wylblogs/p/spring.html

springMVC的执行流程和完整代码的更多相关文章

  1. 通过自己实现接口来加深理解SpringMVC的执行流程

    功能介绍 上篇文章[从源码角度了解SpringMVC的执行流程]通过接口源码向大家介绍了SpringMVC的执行流程,主要偏重于源码.这篇文件我们来自己实现那几个关键接口,来真实体验下SpringMV ...

  2. 从源码角度了解SpringMVC的执行流程

    目录 从源码角度了解SpringMVC的执行流程 SpringMVC介绍 源码分析思路 源码解读 几个关键接口和类 前端控制器 DispatcherServlet 结语 从源码角度了解SpringMV ...

  3. 《SpringMVC从入门到放肆》二、SpringMVC的执行流程及默认配置

    上一篇博文我们做了一个hello world的程序,并且已经成功的跑起来了.这一篇我们来深入的了解一下SpringMVC的执行流程以及一些其它的配置. 一.执行流程 来解释一下上图中的各个名词1.Di ...

  4. SpringMvc执行流程及底层代码流程

    SpringMVC执行流程   01.客户端发送请求被我们在web.xml中配置DispatcherServlet(核心控制器)拦截: 默认执行DispatcherServlet中的 protecte ...

  5. SpringMVC的执行流程

    解析SpringMVC执行流程 SpringMVC的执行图大概如下所示 1.首先它是由客户端发起请求,到DispatcherServlet,被拦截后到HandlerMapping这里充当一个路由器,通 ...

  6. springMvc的执行流程(源码分析)

    1.在springMvc中负责处理请求的类为DispatcherServlet,这个类与我们传统的Servlet是一样的.我们来看看它的继承图 2. 我们发现DispatcherServlet也继承了 ...

  7. Spring MVC入门(一)—— SpringMVC的执行流程与常用注解

    一.什么是SpringMVC SpringMVC就是类似于Struts2的mvc框架,属于SpringFrameWork的后续产品.在模型层中与视图层的交互部分. springMVC执行流程: 二.常 ...

  8. springmvc的执行流程详解

    1.什么是MVC MVC是Model View Controller的缩写,它是一个设计模式 2.springmvc执行流程详细介绍 第一步:发起请求到前端控制器(DispatcherServlet) ...

  9. 简单讲一下 SpringMVC的执行流程?

    执行流程: 1. 用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet 捕获(捕获) . DispatcherServlet对请求  URL进行解析 ...

随机推荐

  1. LeetCode - Daily Temperatures

    Given a list of daily temperatures, produce a list that, for each day in the input, tells you how ma ...

  2. Tomcat环境变量配置命令行报错:The JRE_HOME environment variable is not defined correctl This environment variable is needed to run this program

    1. tomcat——>bin——>setclasspath.bat,使用记事本打开. 2. 添加如下代码即可: 为自己实际的环境变量配置为准!!! set JAVA_HOME=D:\ID ...

  3. Nio使用Selector客户端与服务器的通信

    使用NIO的一个最大优势就是客户端于服务器自己的不再是阻塞式的,也就意味着服务器无需通过为每个客户端的链接而开启一个线程.而是通过一个叫Selector的轮循器来不断的检测那个Channel有消息处理 ...

  4. Using gcc stack debug skill

    The stack error is hard to debug, but we can debug it assisted by the tool provided by GCC. As we kn ...

  5. x的奇幻之旅 (史蒂夫·斯托加茨 著)

    第1部分 数字 第1章 数学:从企鹅的"鱼"订单到无穷大 (已看) 第2章 一组组石头与加减乘除运算 (已看) 第3章 "敌人的敌人就是朋友“与"负负得正&qu ...

  6. 记录:.user.ini 使用

    记录:.user.ini 使用 可以用于防跨站配置. .user.ini 注意安全问题 动态加载,默认 5 分钟自动刷新. php 5.3 以后的版本支持. 修改完成后再将文件锁定. 相关链接: 神秘 ...

  7. create-react-app 搭建的项目中,让 antd 通过侧边栏导航 Menu 的 Menu.Item 控制 Content 部分的变化

    第一种:BrowserRouter把Menu和Route组给一起包起来 <Router></Router> 标签要把Menu和Route组给一起包起来 修改src/index. ...

  8. hdfs1.0和2.0复习

    1.Namenode元数据两种映射:(1)文件名 -> block数据块的映射(2)block数据块 -> datanode节点地址的映射细节:(1)是持久化到NN的磁盘的(fsimage ...

  9. py-day2-2 python 元祖

    #元祖 tuple v = 'abddbwdhi' b = tuple(v) print(b) ('a', 'b', 'd', 'd', 'b', 'w', 'd', 'h', 'i') # 元素不可 ...

  10. .NET设计模式 第二部分 创建型模式(2)—抽象工厂模式(Abstract Factory)

    抽象工厂模式(Abstract Factory) ——探索设计模式系列之三 Terrylee,2005年12月12日 概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变 ...