目录

一、SpringMVC概述

1、简介

2、MVC模型

3、框架架构关系图

4、SpringMVC优势

二、SpringMVC入门案例

1、SpringMVC环境搭建

【1】创建maven工程

【2】导入 jar 包

【3】配置前端控制器

【4】创建SpringMVC配置文件

【5】创建控制器类

【6】创建跳转页面

【7】部署服务器并启动

2、SpringMVC 执行分析

【1】执行图解

【2】步骤分析

【3】SpringMVC组件

【4】RequestMapping注解

三、请求参数的绑定

1、基本数据类型和字符串类型

2、实体类绑定参数

3、集合绑定参数

4、解决中文乱码问题

四、SpringMVC中常用注解

1、@RequestParam 注解

2、@RequestBody 注解

3、@PathVaribale 注解

4、@RequestHeader 注解

 5、@CookieValue 注解

 6、@ModelAttribute 注解

7、@SessionAttribute 注解


一、SpringMVC概述

1、简介

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于 Spring  FrameWork 的后续产品,已经融合在 Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功 能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用 Spring 进行 WEB 开发时,可以选择使用 Spring 的 Spring MVC 框架或集成其他 MVC 开发框架,如 Struts1(现在一般不用),Struts2 等。

SpringMVC 已经成为目前最主流的 MVC 框架之一,并且随着 Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。 它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。 

2、MVC模型

MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 是一种用于设计创建 Web 应用程序表现层的模式。MVC 中每个部分各司其职: 


  • Model(模型):
  • 通常指的是我们的数据模型,一般情况下用于封装数据,也就是Javabean
  • View(视图):
  • 通常指 jsp 或者 html,一般用于展示数据,通常视图是依据模型数据创建的
  • Controller(控制器):
  • 应用程序中处理用户交互的部分,一般用于处理程序逻辑的

3、框架架构关系图

SpringMVC框架基本使用_SpringMVC框架

4、SpringMVC优势


  • 清晰的角色划分:  

  • 前端控制器(DispatcherServlet)  
  • 请求到处理器映射(HandlerMapping)
  • 处理器适配器(HandlerAdapter) 
  • 视图解析器(ViewResolver)  
  • 处理器或页面控制器(Controller)  
  • 验证器( Validator)  
  • 命令对象(Command  请求参数绑定到的对象就叫命令对象)  
  • 表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)

  • 分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要
  • 由于命令对象就是一个 POJO,无需继承框架特定 API,可以使用命令对象直接作为业务对象
  • 和 Spring 其他框架无缝集成,是其它 Web 框架所不具备的
  • 可适配,通过 HandlerAdapter 可以支持任意的类作为处理器
  • 可定制性,HandlerMapping、ViewResolver 等能够非常简单的定制
  • 功能强大的数据验证、格式化、绑定机制
  • 利用 Spring 提供的 Mock 对象能够非常简单的进行 Web 层单元测试
  • 本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换
  • 强大的 JSP 标签库,使 JSP 编写更容易

二、SpringMVC入门案例

以实现窗口跳转为例,使用SpringMVC框架实现窗口跳转案例

1、SpringMVC环境搭建

【1】创建maven工程

使用骨架进行创建,创建好后最终目录结构如下

SpringMVC框架基本使用_SpringMVC入门案例_02

创建好后点开index.jsp页面,可以看到文件里面没有设置编码的相关内容,因此我们可以将index.jsp文件删除,然后重新在webapp路径下新建一个index.jsp,编码相关内容就出来了,并编写初始页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>oneStar</title>
</head>
<body>
<h1>SpringMVC真牛逼!</h1>
<a href="hello">点击跳转</a>
</body>
</html>

【2】导入 jar 包

在 pom.xml 中以导入坐标的形式将 jar 包导入

<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>

【3】配置前端控制器

在 web.xml 中进行配置,主要的地方配置有:


  • 配置前端控制器
  • 配置Servlet
  • 配置拦截路径名称

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--前端控制器的配置-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVC.xml</param-value>
</init-param>
<!-- 配置servlet启动时加载对象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!--拦截名称-->
<servlet-name>dispatcherServlet</servlet-name>
<!--拦截路径-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

【4】创建SpringMVC配置文件

在resources目录下创建 SpringMVC配置文件,需要的配置有:


  • 开启注解扫描
  • 配置视图解析器
  • 开启SpringMVC注解支持

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<!--开启注解扫描-->
<context:component-scan base-package="com.LSTAR"/>
<!--视图解析器对象-->
<bean id="internalResourceView" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--开启SpringMVC注解支持-->
<mvc:annotation-driven/>
</beans>

【5】创建控制器类

在Java目录下创建 com.LSTAR.controller.HelloController 类,编写控制器代码,代码如下:

@Controller     //将类交给IOC容器
public class HelloController {
@RequestMapping(path="/hello") //请求映射
public String sayHello(){
System.out.println("Hello SpringMVC!");
return "success";
}
}

【6】创建跳转页面

在 WEB-INF 目录下创建 pages 文件夹,web 页面就可以放在 pages 文件夹下面,在 pages 目录下创建 success.jsp 跳转成功显示界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>oneStar</title>
</head>
<body>
<h3>跳转成功!</h3>
</body>
</html>

【7】部署服务器并启动

将项目部署到 Tomcat 服务器

SpringMVC框架基本使用_SpringMVC入门案例_03

启动后点击“点击跳转”,成功跳转到“跳转成功”页面

SpringMVC框架基本使用_SpringMVC请求参数绑定_04SpringMVC框架基本使用_SpringMVC常用注解_05

2、SpringMVC 执行分析

【1】执行图解

SpringMVC框架基本使用_SpringMVC入门案例_06

【2】步骤分析


  1. 浏览器客户端携带请求路径,本案例中是“/hello”,通过 web.xml 中的前端控制器配置,发送请求到前端控制器(DispatcherServlet),并加载 SpringMVC.xml 配置文件,将 HelloController 加载进IOC容器当中,创建 HelloController 对象
  2. 前端控制器(DispatcherServlet)接收到请求后根据请求消息交给处理器映射器(HandlerMapping),让 Controller 类中的方法去执行 "/hello",也就是请求映射,执行"sayHello()"方法,这里是  @RequestMapping(path="/hello")  注解起作用
  3. 处理器映射器(HandlerMapping)找到具体的处理器(可查找xml配置或注解配置),生成处理器对象及处理器拦截器(如果有),再一起返回给前端控制器(DispatcherServlet),本案例返回的是 HelloController 类中的 sayHello()
  4. 前端控制器调用处理器适配器(HandlerAdapter)去执行返回的 Handler,也就是让处理器适配器执行sayHello() 方法,通过请求适配器执行
  5. 处理器适配器(HandlerAdapter)将会根据适配的结果去执行Handler,也就是sayHelllo()方法
  6. Handler执行完成给适配器返回ModelAndView,将sayHello()执行的结果返回,本案例返回的是 success.jsp 页面
  7. 处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)
  8. 前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可
  9. 视图解析器向前端控制器返回View
  10. 前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)
  11. 前端控制器向用户响应结果

【3】SpringMVC组件


  • 前端控制器(DispatcherServlet):
  • 相当于 MVC 模式中的 C,本案例中即 controller 类,是整个流程控制的中心,由他调用其他组件处理用户请求,降低了组件之间的耦合性
  • 处理器映射器(HandlerMapping):
  • 负责根据用户请求找到 Handler 处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等
  • 处理器(Handler):
  • 即是我们开发中要编写的具体业务控制器,由 DispatcherServlet 把用户请求转发到 Handler,由 Handler 对具体的用户请求进行处理
  • 处理器适配器(HandlAdapter):
  • 通过 HandlAdapter 对处理器进行执行,这是适配器模式的应用,通过拓展适配器可以对更多类型的处理器进行执行
  • 视图解析器(View Resolver):
  • 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户
  • 视图(View):
  • SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView 等,用的最多的视图就是 jsp

【4】RequestMapping注解

来看看源码:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";

@AliasFor("path")
String[] value() default {};

@AliasFor("value")
String[] path() default {};

RequestMethod[] method() default {};

String[] params() default {};

String[] headers() default {};

String[] consumes() default {};

String[] produces() default {};
}

  • 作用:
  • 建立请求URL和处理方法之间的对应关系
  • 出现位置:方法和类上

  • 作用在类上:第一季访问目录
  • 作用在方法上:第二级访问目录
  • 注意:路径可以不写 / 表示应用的根目录开始

  • 属性:

  • path:指定请求的url
  • value:value属性和path属性一样
  • mthod:指定该方法的请求方式
  • params:指定限制请求参数条件
  • headers:发送请求中必须包含的请求头


三、请求参数的绑定

在实际开发中,除了页面的跳转,更多的是数据的传递,比如登录注册,需要将前端页面的账号和密码传递给服务器,服务器再做相应的处理,这里就要用到请求参数的绑定,SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的,提交表单的name和参数的名称是相同的,支持的数据类型有三种:


  • 基本数据类型和字符串类型
  • 实体类(javabean)
  • 集合数据类型(list、map集合等)

1、基本数据类型和字符串类型

【1】以传递用户名和密码为例,修改index.jsp页面,添加绑定参数

<h1>请求参数绑定</h1>
<a href="/param?username=oneStar&password=123">传递参数</a>

【2】在控制层添加请求映射,以参数的形式进行传递

@RequestMapping(path="/param")     //请求映射
public String Param(String username,String password){
System.out.println(username);
System.out.println(password);
return "success";
}

运行后在页面上点击传递参数,就能将用户名和密码传递给服务器后端,在控制台上打印出相应信息

2、实体类绑定参数

【1】创建实体类

在java目录下创建domain包,com.STAR.domain,在domain包里面创建User实体类,并添加get、set等方法

public class User {
private String username;
private String password;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}

【2】使用form表单进行提交

修改index.jsp

<h1>实体类绑定参数</h1>
<form action="/saveUser" method="post">
用户:<input type="text" name="username"/><br>
密码:<input type="text" name="password"/><br>
<input type="button" value="提交"/><br>
</form>

【3】在控制层添加请求映射

@RequestMapping(path="/saveUser")     //请求映射
public String saveUser(User user){
System.out.println(user);
return "success";
}

运行后在页面上输入用户名和密码点击提交即可将数据传递给服务器

3、集合绑定参数

为了方便将数据绑定到List集合和Map集合,这里设置两个用户名和密码,一个用List集合绑定,一个用Map集合绑定

【1】创建实体类,并创建集合

public class mapUser {
private String username;
private String password;

List<mapUser> list;
Map<String,mapUser> map;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public List<mapUser> getList() {
return list;
}

public void setList(List<mapUser> list) {
this.list = list;
}

public Map<String, mapUser> getMap() {
return map;
}

public void setMap(Map<String, mapUser> map) {
this.map = map;
}

@Override
public String toString() {
return "mapUser{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", list=" + list +
", map=" + map +
'}';
}
}

 【2】index.jsp中进行绑定集合

<h1>集合绑定参数</h1>
<form action="/mapUser" method="post">
用户:<input type="text" name="list[0].username"/><br>
密码:<input type="text" name="list[0].password"/><br>
用户:<input type="text" name="map['one'].username"/><br>
密码:<input type="text" name="map['one'].password"/><br>
<input type="submit" value="提交"/><br>
</form>

 【3】在控制层添加请求映射

@RequestMapping(path="/mapUser")     //请求映射
public String mapUser(mapUser mapuser){
System.out.println(mapuser);
return "success";
}

运行后在页面上输入用户名和密码点击提交即可将数据以集合形式传递给服务器

4、解决中文乱码问题

在绑定参数的时候,当有中文时会出现乱码,而SpringMVC提供了解决方法,在web.xml添加过滤器进行配置即可

<!--配置解决中文乱码的过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

四、SpringMVC中常用注解

1、@RequestParam 注解


  • 作用:

    • 把请求中指定名称的参数给控制器中的形参赋值

  • 属性:


    • value:请求参数中的名称
    • required:请求参数中是否必须提供此参数,默认值:true。表示必须提供,如果不提供将报错


  • eg:

    • jsp页面代码:<a href="/param?name=oneStar&password=123">传递参数</a>
      控制层代码:public String Param(@RequestParam(name="name") String username, String password){}
      使用@RequestParam注解将name传递给username


2、@RequestBody 注解


  • 作用:
  • 用于获取请求体内容,直接使用得到的是 key=value 结构的数据,get 请求方式不适用(get没有请求体)
  • 属性:
  • required:是否必须有请求体,默认为:true。当取值为 true 时,get 请求方式会报错,如果请求值为false,get请求得到的是null
  • eg:

  • ​<h1>RequestBody注解</h1> <form action="/testRequestBody" method="post"> 用户:<input type="text" name="username"/><br> 密码:<input type="text" name="password"/><br> <input type="submit" value="提交"/><br> </form>​​ 使用提交表单的方式
  • ​@RequestMapping(path="/testRequestBody") //请求映射 public String testRequestBody(@RequestBody String body){ System.out.println(body); return "success"; }​​使用@RequestBody注解传递请求体


3、@PathVaribale 注解


  •  作用:
  • 拥有绑定URL中的占位符
  • 属性:
  • value:指定URL中的占位符名称
  • restful 风格URL

  • 请求路径一样,可以根据不同的请求方式去执行后台的不同方法
  • 特点:

  • 结构清晰
  • 符合标准
  • 易于理解
  • 拓展方便


  • eg:
  • ​<h1>PathVariable注解</h1> <a href="/testPathVariable/01">PathVariable注解</a> @RequestMapping(path="/testPathVariable/{sid}") //请求映射 public String testPathVariable(@PathVariable(name="sid") String id){ System.out.println(id); return "success"; }​​使用PathVaribale注解绑定URL中的占位符

4、@RequestHeader 注解


  • 作用:
  • 用于获取请求消息头
  • 属性:

  • value:提供消息头名称
  • request:是否必须有此消息头

  • eg:
  • ​<h1>RequestHeader注解</h1> <a href="/testRequestHeader">RequestHeader注解</a> @RequestMapping(path="/testRequestHeader") //请求映射 public String testRequestHeader(@RequestHeader(value="Accept") String header){ System.out.println(header); return "success"; }​​使用 RequestHeader注解获取请求头信息

 5、@CookieValue 注解


  • 作用:
  • 用于把指定 cookie 名称的值传入控制器方法参数
  • 属性:

  • value:指定 cookie 的名称
  • required:是否必须有此 cookie

  • eg:
  • ​<h1>CookieValue注解</h1> <a href="/testCookieValue">CookieValue注解</a> @RequestMapping(path="/testCookieValue") //请求映射 public String testCookieValue(@CookieValue(value="JSESSIONID") String cookid){ System.out.println(cookid); return "success"; }​​使用CookieValue注解传入指定cookie值

 6、@ModelAttribute 注解


  • 作用:可以修饰方法和参数

  • 修饰方法:表示当前方法会在控制器的方法执行之前先执行
  • 修饰参数:获取指定的数据参数赋值

  • 属性:
  • value:用于获取数据的key,key可以是POJO的属性名称,也可以是map结构的key
  • eg:
  • ​<h1>ModelAttribute注解</h1> <form action="/saveUser" method="post"> 用户:<input type="text" name="username"/><br> 密码:<input type="text" name="password"/><br> <input type="submit" value="提交"/><br> </form> @ModelAttribute public void fun(){ System.out.println("fun函数执行"); } @RequestMapping(path="/testModelAttribute") //请求映射 public String testModelAttribute(User user){ System.out.println("测试类执行"); System.out.println(user); return "success"; }​​提交后先执行了fun函数,再执行测试函数

7、@SessionAttribute 注解


  • 作用:
  • 用于多次执行控制器方法间的参数共享,该注解只能作用在类上
  • 属性:

  • value:用于指定存入的属性名称
  • type:用于指定存入的数据类型


eg:实现参数共享,首先将参数存储到session域中,并在success.jsp页面中显示出来,然后通过方法去获取session域中的参数

//jap页面
<h1>SessionAttribute </h1>
<%--将参数存储进session域--%>
<a href="/testSessionAttribute">SessionAttribute注解</a>
<%--从session域中取值--%>
<a href="/getSessionAttribute">SessionAttribute注解</a>

//success.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>oneStar</title>
</head>
<body>
<h3>跳转成功!</h3>
${msg}
${sessionScope}
</body>
</html>

//控制器请求映射
@RequestMapping(path="/testSessionAttribute") //请求映射
public String testSessionAttribute(Model model){
model.addAttribute("msg","oneStar");
return "success";
}

//获取session域中存储的参数
@RequestMapping(path="/getSessionAttribute") //请求映射
public String getSessionAttribute(ModelMap modelmap){
String msg = (String) modelmap.get("msg");
System.out.println(msg);
return "success";
}



SpringMVC框架基本使用_SpringMVC常用注解_07