Spring MVC简介

Spring MVC是一款基于MVC架构模式的轻量级Web框架,目的是将Web开发模块化,对整体架构进行解耦。

Spring MVC有一下优点:

作为Spring框架的一部分,拥有Spring的优点(IOC,AOP等)

支持灵活的URL到页面控制器的映射

提供灵活的数据验证、格式化、数据绑定机制

支持RESTful风格

Spring MVC请求流程

Spring MVC框架的整体请求流程如下:

上图中涉及到Spring MVC的几个功能组件:

前端控制器(DispatcherServlet):接收用户请求并返回请求结果。它的作用相当于一个转发器或中央处理器,控制整个执行流程,对各组件进行调度降低组件之间的耦合。

处理器映射器(HandlerMapping):根据用户请求的URL,通过注解或者XML配置,查找相应的处理器Handler

处理器适配(HandlerAdapter):根据映射器查找出的Handler,完成调用处理器中的方法

处理器(Handler):请求处理的具体逻辑,返回数据和视图信息

视图解析器(View Resolver):解析具体视图,通过ModelAndView对象中的View信息,将逻辑视图名解析成真正的视图View

请求流程具体步骤详解:

1:用户发起请求,请求会被前端控制器(DispatcherServlet)拦截

2:前端控制器(DispatcherServlet)请求处理器映射器(HandlerMapping)查找Handler

3:处理器映射器(HandlerMapping)根据配置找到相应Handler(可以更具注解或者XML配置),可能包含多个Interceptor拦截器,返回给前端控制器

4:前端控制器(DispatcherServlet)请求处理器适配器(HandlerAdapter)去执行相应的Handler

5:适配器交由对应Handler处理器执行

6:  Handler处理器执行完成后返回ModelAndView对象给处理器适配器

7:处理器适配器接受Handler处理器的返回结果,并将该结果返回给前端控制器(DispatcherServlet)

8:前端控制器(DispatcherServlet)接收处理器适配器返回的数据和视图信息,请求视图解析器,解析对应的视图

9:视图解析器根据View信息匹配的相应的视图结果,反回给前端控制器

10:前端控制器接收具体视图,进行视图渲染,将Model数据填充到View视图中,生成最终视图

11:前端控制器向用户返回结果

从零开始搭建demo

创建工程:

Eclipse下新建一个动态Web项目

工程默认目录结构:

添加jar包依赖

WebContent > WEB-INF > lib 文件夹下导入相应的jar包,其中核心的jar包是spring-webmvc-5.0.0.RELEASE.jar,其他是几个主要是spring用于管理上下文和beande 包、jstl标签库和一个用于打印日志的log包:

在web.xml中配置前端控制器

前端控制器相当于Spring MVC的专有servlet,用于拦截所有符合条件的请求,交由框架做后续处理

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID"
version="3.1"> <!-- 配置前端控制器-DispatchServlet -->
<servlet>
<servlet-name>springMvcNext</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- contextConfigLocation不是必须的, 如果不配置contextConfigLocation, springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
</servlet> <servlet-mapping>
<servlet-name>springMvcNext</servlet-name>
<url-pattern>/</url-pattern> <!--根据url-pattern设定的规则拦截用户发来的请求 此处拦截所有请求,包括静态资源 ->
</servlet-mapping> </web-app>

其中<servlet-mapping>标签中定义url匹配规则为符合*.action的形式,对应的servlet名为springMvcNext,而<servlet>配置的控制器为org.springframework.web.servlet.DispatchServlet,该控制器为当前SpringMVC项目的前端控制器,<init-param>标签为当前控制器依赖的参数,两个参数分别代表上下文参数和参数加载路径。

关于classpath:代表web项目编译后编译后的输出路径

配置spring MVC配置

在java源代码更目录下添加applicationContext.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:p="http://www.springframework.org/schema/p"
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/security http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 包扫描器 标签将用于激活Spring MVC注释扫描功能,允许使用@Controller和@RequestMapping等注释。-->
<context:component-scan base-package="com.sl.controller" /> <!-- 注解驱动 -->
<mvc:annotation-driven /> <!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>

添加控制器Controller与视图View

Src目录下添加包com.sl.controller,添加控制器代码如下:

package com.sl.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; @Controller
public class HelloWorldController { @RequestMapping("/index") //处理URL路径中以/index开头的所有请求: 包括 /index/* 和 /index.html
public ModelAndView helloWorld() { String message = "Hello Spring MVC";
return new ModelAndView("index", "message", message);
}
}

在WEB-INF/view中添加视图文件index.jsp

<html>
<head>
<title>Spring MVC </title>
</head>
<body>
${message}
</body>
</html>

运行结果:

Spring MVC温故而知新-从零开始的更多相关文章

  1. Spring MVC温故而知新 – 参数绑定、转发与重定向、异常处理、拦截器

    请求参数绑定 当用户发送请求时,根据Spring MVC的请求处理流程,前端控制器会请求处理器映射器返回一个处理器,然后请求处理器适配器之心相应的处理器,此时处理器映射器会调用Spring Mvc 提 ...

  2. Spring MVC温故而知新 – 请求映射RequestMapping

    RequestMapping注解说明 @RequestMapping注解的作用将Web请求映射到特定处理程序类和/或处理程序方法,这个注解可以用于类或者方法上,并通过属性value指定请求路径.用在C ...

  3. Spring MVC (二)注解式开发使用详解

    MVC注解式开发即处理器基于注解的类开发, 对于每一个定义的处理器, 无需在xml中注册. 只需在代码中通过对类与方法的注解, 即可完成注册. 定义处理器 @Controller: 当前类为处理器 @ ...

  4. 从零开始学 Java - Spring MVC 实现跨域资源 CORS 请求

    论职业的重要性 问:为什么所有家长都希望自己的孩子成为公务员? 答:体面.有权.有钱又悠闲. 问:为什么所有家长都希望自己的孩子成为律师或医生? 答:体面.有钱.有技能. 问:为什么所有家长都不怎么知 ...

  5. 从零开始学 Java - 搭建 Spring MVC 框架

    没有什么比一个时代的没落更令人伤感的了 整个社会和人都在追求创新.进步.成长,没有人愿意停步不前,一个个老事物慢慢从我们生活中消失掉真的令人那么伤感么?或者说被取代?我想有些是的,但有些东西其实并不是 ...

  6. 0.从零开始搭建spring mvc + mybatis + memcached+ dubbo\zookper的maven项目

    1.首先创建maven 项目,配置相关pom信息 2.配置spring mvc 4, 测试,提交代码 3.引入配置mybatis3,测试,提交代码 4.配置事务,测试,提交代码 5.配置memcach ...

  7. 从零开始学 Java - 搭建 Spring MVC 记录云创的日子 第一章

    2017年11月29日 来到新项目,需要用到Spring MVC ,那么我就开始记录我这次的学习. Spring MVC 框架是围绕一个 DispatcherServlet 来设计的,这个 Servl ...

  8. spring mvc 快速入门

    ---------- 转自尚学堂 高淇 --------- Spring  MVC 背景介绍 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC ...

  9. Swagger+Spring mvc生成Restful接口文档

    简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集 ...

随机推荐

  1. Android进阶(二十一)创建Android虚拟机

    创建Android虚拟机

  2. C++中的虚函数表是什么时期建立的?

    虚函数表是在什么时期建立的? 最近参加阿里巴巴公司的内推,面试官问了“虚函数表是在什么时期建立的?”.因为以前对虚函数表的理解不够多,所以就根据程序构建(Build)的四个过程(预编译.编译.汇编和链 ...

  3. Erlang 编写 Kafka 客户端之最简单入门

    Erlang 编写 Kafka 客户端之最简单入门 费劲周折,终于测通了 erlang 向kafka 发送消息,使用了ekaf 库,参考: An advanced but simple to use, ...

  4. FFMPEG类库打开流媒体的方法(需要传参数的时候)

    使用ffmpeg类库进行开发的时候,打开流媒体(或本地文件)的函数是avformat_open_input(). 其中打开网络流的话,前面要加上函数avformat_network_init(). 一 ...

  5. 【Android 应用开发】Android 开发错误集锦

    1. eclipse的Device中不显示手机 在eclipse中连接不上手机,出现adb server didn't ACK  fail to start daemon 错误. 出现这种原因是因为a ...

  6. ruby技巧001:求md5散列

    ruby核心库中未包含md5之类的功能,不过在其标准库digest中可以方便的使用该功能: = Digest (from ruby core) ---------------------------- ...

  7. Virtualbox开机启动,service命令管理

    #!/bin/bash#chkconfig:235 80 20#description:start or stop vbox#Author:Qty~20180502#OS:RedHatEnterpri ...

  8. PyCharm命令行输入

    PyCharm命令行输入 写作原因 网上资料比较杂,版本较老,与现在的版本有区别,所以根据网上资料和自己亲手实验撰写此文. 设置方法 在菜单中按此路径设置: Run->Edit Configur ...

  9. 洛谷P1919 【模板】A*B Problem升级版 题解(FFT的第一次实战)

    洛谷P1919 [模板]A*B Problem升级版(FFT快速傅里叶) 刚学了FFT,我们来刷一道模板题. 题目描述 给定两个长度为 n 的两个十进制数,求它们的乘积. n<=100000 如 ...

  10. DDD实战进阶第一波(九):开发一般业务的大健康行业直销系统(实现经销商上下文仓储与领域逻辑)

    上篇文章主要讲述了经销商上下文的需求与POCO对象,这篇文章主要讲述该界限上下文的仓储与领域逻辑的实现. 关于界限上下文与EF Core数据访问上下文参考产品上下文相应的实现,这里不再累述. 因为在经 ...