SpringMVC
文章目录
前言
SpringMVC简介
SpringMVC概述
SpringMVC是Spring提供的一个轻量级Web框架,它实现了WebMVC设计模式。它是一个开源的Java平台,为开发强大的基于Java的Web应用程序提供全面的基础架构支持非常容易和非常快速。它在使用和性能等方面比另一个框架Struts2更加优异。
SpringMVC特点
- 是Spring框架的一部分,可以方便的利用Spring所提供的其他功能
 - 灵活性强,易于与其他框架集成
 - 提供了一个前端控制器 
DispatcherServlet, 使开发人员无须额外开发控制器对象。 - 可自动绑定用户输入,并能正确地转换数据类型。
 - 内置了常见的校验器,可以校验用户输入。如果校验不能通过,就会复位向到输入表单。
 - 持国际化,可以根据用户区域显示多国语言
 - 支持多种视图技术,如JSP、Velocity 和 FreeMarker 等视图技术。
 - 使用基于
XML的配置文件,在编辑后,不需要重新编译应用程序 
SpringMVC入门案例
了解了SpringMVC的概念和特点之后,接下来我们做一个简单的入门案例
 第一步:创建一个Maven项目
 
 注意: 这样使用骨架创建出来的项目结构是不完整的
 我们需要补全目录
 
 第二步:在pom.xml中添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.hzy</groupId>
  <artifactId>springMvc_quickstart</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
  </dependencies>
</project>
 
第三步:配置前端控制器
在web.xml中配置SpringMVC的前端控制器DispatcherServlet。
<!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>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--初始化时加载配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-config.xml</param-value>
    </init-param>
    <!--表示容器在加载时立刻加载Servlet-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>
 
web.xml中主要对<servlet>和<servlet- mapping>元素进行了配置。在<servlet>中配置了 Spring MVC 的前端控制器 DispatcherServlet,并通过其子元素<init-param>配置了 Spring MVC 配置文件的位置, <load-on-startup>元素中的'1'表示容器在启动时立即加载这个 Servlet:在 <servlet-mapping>中,通过<url-pattern>元素的/ 拦截所有 URL,并交由 DispatcherServlet 处理。
第四步:创建Controller类
在src下创建com.hzy.controller包,创建ControllerTest。
package com.hzy.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ControllerTest implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        
        //创建ModelAndView对象
        ModelAndView m = new ModelAndView();
        //向模型中添加一个名称为msg的字符串对象
        m.addObject("msg","这是第一个SpringMVC程序");
        //设置返回路径
        m.setViewName("/WEN-INF/welcome.jsp");
        return m;
    }
}
 
handleRequest()是 Controller 接口的实现方法,ControllerTest 类会调用该方法 处理请求,并返回一个包含视图名或包含视图名与模型的 ModelAndView 对象。本案例向模型对象 中添加了一个名称为 msg 的字符串对象,并设置返回的视图路径为 WEB-INF/welcome. jsp,这样 请求就会被转发到 welcome. jsp 页面。
第五步:创建springmvc-config.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--配置处理器Handle,映射“ControllerTest”请求-->
    <bean name="/controllerTest" class="com.hzy.controller.ControllerTest"/>
    <!--处理器映射,将处理器Handle的name作为url进行查找-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--处理器适配器,配置处理器中的handleRequest()方法调用-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
    
</beans>
 
首先定义了一个名称为 ControllerTest的 Bean,该 Bean 会将控制器类 ControllerTest 映射到 /controllerTest请求中:然后配置了处理器映射器 BeanNameUrIHandlerMapping 和处理器适配器 SimpleControllerHandlerAdapter, 其中处理器映射器用 于将处理器 Bean 中的的 name (即 url)进行处理器查找,而处理器适配器用于完成对 ControllerTest 处理器中 handleRequesto方法的调用;最后配置了视图解析器 InternalResourceViewResolver 来解析结果视图,并将结果呈现给用户。
第六步:创建视图(View)页面
 在WEB-INF目录下创建一个页面文件welcome.jsp,在该页面中使用EL表达式获取msg的信息
<%@ page contentType="text/html;charset=UTF-8" language="java"  pageEncoding="UTF-8" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Title</title>
</head>
<body>
    ${msg}
</body>
</html>
 
最后:配置Tomcat,启动项目

 运行结果:

 通过入门案例的学习,我们总结一下SpringMVC程序的执行流程:
- 用户通过浏览器向服务器发送请求,请求会被 SpringMVC 的前端控制器 
DispatcherServiet所拦截 DispatcherServlet拦截到请求后,会调用HandlerMapping处理器映射器。- 处理器映射器根据请求 URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有就生成)一并返回给 
DispatcherServlet。 DispatcherServlet会通过返回信息选择合适的HandlerAdapter(处理器适配器)HandlerAdapter会调用并执行 Handler(处理器),这里的处理器就是程序中编写的 Controller 类,也被称为后端控制器。- Controller 执行完成后,会返回一个 
ModelAndView对象,该对象中包含视图名或包含模 利与视图名。 HandlerAdapter将ModelAndView对象返回给DispatcherServletDispatcherServlet会根据ModelAndView对象选择一个合适的ViewResolver(视图解析器)。ViewResolver解析后,会向DispatcherServlet中返回具体的 View(视图)。
10.DispatcherServlet对 View 进行渲染(即将模型数据填充至视图中)- 视图渲染结果会返回给客户端浏览器显示。
 
在上述执行过程中,DispatcherServlet、HandlerMapping、HandlerAdapter 和 ViewResolver 对象的工作是在框架内部执行的,开发人员并不需要关心这些对象内部的实现过程,只需要配置前端控制器(DispatcherServlet),完成Controller中的业务处理,并在视图(View)中展示相应信息即可。
 注:
 大家都发现了,这种方式实现整个程序还是比较麻烦的。
SpringMVC注解
在 Spring 2.5 之前,只能使用实现 Controller 接口的方式来开发一个控制器,我们的入门案例就是使用的这种方式。在 Spring 2.5 之后,新增加了基于注解的控制器以及其他一些常用注解,这些注解的使用极大地减少了程序员的开发工作。接下来我将详细的讲解 SpringMVC 中的常用核心类及其常用注解。
@Controller
| 名称 | @Controller | 
|---|---|
| 类型 | 类注解 | 
| 位置 | SpringMVC控制器类定义上方 | 
| 作用 | 设定SpringMVC的核心控制器bean | 
org.springframework.stereotype.Controller 注解类型用于指示 Spring类的实例是一个控制器,其注解形式为@Controller。该注解在使用时不需要再实现 Controller 接口,只需要将@Controller 注解加入控制器类上,然后通过 Spring的扫描机制找到标注了该注解的控制器即可。
 示例:
package com.hzy.controller;
import org.springframework.stereotype.Controller;
......
//Controller注解
@Controller
public class ControllerTest{
...
}
 
为了保证 Spring 能够多找到控制器类,还需要在Spring MVC的配置文件中添加相应的扫描配置信息,具体如下。
 (1)在配置文件的声明中引入 spring-context 
 (2)使用<context: component-scan>元素指定需要扫描的类包。
 示例:
<?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"
       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
        ">
<!--指定要扫描的包-->
    <context:component-scan base-package="com.hzy.controller"/>
</beans>
 
<context: component-scan>元素的属性base-package指定了需要扫描的包为:com.hzy.controller。在运行时改包及子包下的所有标注了注解的类都会被Spring处理。
@RequestMapping
| 名称 | @RequestMapping | 
|---|---|
| 类型 | 类注解或方法注解 | 
| 位置 | SpringMVC控制器类或方法定义上方 | 
| 作用 | 设置当前控制器方法请求访问路径 | 
| 相关属性 | value(默认),请求访问路径 | 
示例:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller//注解
@RequestMapping("/book")//标注在类上
public class BookController {
    @RequestMapping("/save")//标注在方法上
	public String save(){
			...
	}
}
 
在类上标注了@RequestMapping("/book"),则我们可以通过http://localhost:8080/book进行访问,在方法上标注@RequestMapping("/save"),我们可以用http://localhost:8080/book/save访问。
 @RequestMapping注解的属性
| 属性名 | 类型 | 描述 | 
|---|---|---|
| name | String | 可选属性,用于为映射地址指定别名 | 
| value | String[] | 可选属性,同时也是默认属性,用于映射一个请求和一种方法,可以标注在一个方法或一个类上。 | 
| method | RequestMethod[] | 可选属性,用于指定该方法用于处理哪种类型的请求方式,其请求方式包括 GET、POST、HEAD、OPTIONS、PUT、 PATCH、 DELETE 和和TRACE,例如method= RequestMethod.GET 表示只支持 GET 请求, 如果需要支持多个请求方式,就需要通过{} 写成数组的形式,并且多个请求方式之间是有英文逗号分隔的 | 
| params | String[] | 可选属性,用于指定 Request 中必须包含某些参数的值,才可以通过其标注的方法处理 | 
| headers | String[] | 可选属性,用于指定 Request 中必须包含某些指定的header 的值,才可以通过其标注的方法处理 | 
| consumes | String[] | 可选属性,用于指定处理请求的提交内容类型 (Content-Type ),比如 application/json, text/html 等 | 
| produces | String[] | 可选属性,用于指定返回的内容类型,返回的内容类型必须是 request请求头(Accept)中所包含的类型 | 
组合注解:
| 请求 | 组合注解 | 共享注解 | 
|---|---|---|
| GET | @GetMapping | @RequestMapping(method = RequestMethod.GET) | 
| POST | @PostMapping | @RequestMapping(method = RequestMethod.POST) | 
| PUT | @PutMapping | @RequestMapping(method = RequestMethod.PUT) | 
| DELETE | @DeleteMapping | @RequestMapping(method = RequestMethod.DELETE) | 
| PATCH | @PatchMapping | @RequestMapping(method = RequestMethod.PATCH) | 
@ResponseBody
| 名称 | @ResponseBody | 
|---|---|
| 类型 | 类注解或方法注解 | 
| 位置 | SpringMVC控制器类或方法定义上方 | 
| 作用 | 设置当前控制器方法响应内容为当前返回值,无需解析 | 
示例:
@Controller
@RequestMapping("/book")
public class BookController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
	//System.out.println("book save ...");
    return "{'module':'book save'}";
	}
 

@RequestParam
@RequestParam主要用于数据绑定
| 属性 | 说明 | 
|---|---|
| value | name 属性的别名,这里指参数的名字,即入参的请求参数名字,如 value=" user_id" 表示请求的参数中名字为 user_id 的参数的值将传入。如果只使用 vaule 属性,就可以 省略value 属性名 | 
| name | 指定请求头绑定的名称 | 
| require | 用于指定参数是否必需,默认是tre,表示请求中一定要有相应的参数 | 
| defaultValue | 默认值,表示如果请求中没有同名参数的默认值 | 
应用实例
springmvc-config.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"
       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
        ">
<!--指定要扫描的包-->
    <context:component-scan base-package="com.hzy.controller"/>
</beans>
 
web.xml
<!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>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--初始化时加载配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-config.xml</param-value>
    </init-param>
    <!--表示容器在加载时立刻加载Servlet-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>
 
BookController:
@Controller
@RequestMapping("/book")
public class BookController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(@RequestParam("name") String userName, int age){
        System.out.println("普通参数传递name="+userName);
        System.out.println("普通参数传递age="+age);
        System.out.println("book save ...");
        return "{'module':'book save'}";
    }
}
 
启动程序:
 
 
结语
以上就是今天要讲的内容,涉及了SpringMVC的介绍、应用、数据绑定的内容,下篇中我会给大家讲到JSON数据交互和RESTFUL支持,以及拦截器的内容。










