一、什么是 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. Redis(三)源source编译

    背景: 自己电脑是win7 32bit的,而想要Redis4.0的版本,但是在网上没找到,所以自己干脆download源source,自己build,安装. 最后,目前达到的状态是,windows下s ...

  2. 【mysql】索引原理-MySQL索引原理以及查询优化

    转载:https://www.cnblogs.com/bypp/p/7755307.html 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性 ...

  3. day4 java消息中间件服务

    PS: 讲个故事,老王要给他的两个女儿讲故事,他要一个一个讲很费劲,后来他使用了微信公众号,让订阅微信公众号的人关注就减轻了负担. PS: 传统的如果一个用户进行登录,会调用分多的服务,如果没有消息中 ...

  4. Python——psutil的使用(获取系统性能信息)

    >>> import psutil #导入psutil >>> a=psutil.virtual_memory() >>> a.total #总虚 ...

  5. MySQL--Checkpoint基础

    ===================================================== Checkpint 分两种:Sharp Checkpoint : 在服务器正常关闭时,将所有 ...

  6. 数学的语言 化无形为可见 (Keith Devlin 著)

    第一章 数字为何靠的住 (已看) 第二章 心智的模式 (已看) 第三章 动静有数 (已看) 第四章 当数学成型 (已看) 第五章 数学揭开美之本质 (已看) 第六章 当数学到位 (已看) 第七章 数学 ...

  7. python3 TypeError: Unicode-objects must be encoded before hashing

    python3下,利用hash值对字符串进行md5加密时报错:TypeError: Unicode-objects must be encoded before hashing 原因是:python3 ...

  8. C#:decimal的去0显示

    public static string DecimalToString(decimal d) { return d.ToString("#0.######"); } 后面的0会给 ...

  9. CentOS6.4 添加php-fpm系统服务

    简介: php-fpm安装完成后默认不会注册为系统服务,所以需要手工添加系统服务脚本.在/etc/init.d目录下新建php-fpm文件,并更改权限其即可. 1.检测/usr/local/php/v ...

  10. PL/SQL Developer 使用小技巧

    1.PL/SQL Developer记住登陆密码 在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码: 设置方法:tools- ...