【SpringMVC】上篇,超详细的教程带你学会SpringMVC

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

✅作者简介热爱Java后端开发的一名学习者大家可以跟我一起讨论各种问题喔。
🍎个人主页Hhzzy99
🍊个人信条坚持就是胜利
💞当前专栏【Spring】
🥭本文内容SpringMVC上部分内容的学习助你逐步深入Spring全家桶之二——SpringMVC

SpringMVC


文章目录


前言

在前文中我们已经学习过Sping框架了IoC和DI还有AOP想了解的同学可以去我的专栏查看传送门🚩

SpringMVC是隶属于Spring框架的一部分主要是用来进行Web开发是对Servlet进行了封装。
SpringMVC是处于Web层的框架所以其主要的作用就是用来接收前端发过来的请求和数据然后经过处理并将处理的结果响应给前端所以如何处理请求和响应是SpringMVC中非常重要的一块内容。
这篇文章我将带领大家一起学习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程序的执行流程

  1. 用户通过浏览器向服务器发送请求请求会被 SpringMVC 的前端控制器 DispatcherServiet所拦截
  2. DispatcherServlet 拦截到请求后会调用 HandlerMapping处理器映射器。
  3. 处理器映射器根据请求 URL找到具体的处理器生成处理器对象及处理器拦截器如果有就生成一并返回给 DispatcherServlet
  4. DispatcherServlet会通过返回信息选择合适的 HandlerAdapter处理器适配器
  5. HandlerAdapter 会调用并执行 Handler(处理器,这里的处理器就是程序中编写的 Controller 类也被称为后端控制器。
  6. Controller 执行完成后会返回一个 ModelAndView 对象该对象中包含视图名或包含模 利与视图名。
  7. HandlerAdapterModelAndView 对象返回给 DispatcherServlet
  8. DispatcherServlet会根据 ModelAndView对象选择一个合适的 ViewResolver(视图解析器)。
  9. ViewResolver 解析后会向DispatcherServlet 中返回具体的 View视图。
    10.DispatcherServlet对 View 进行渲染即将模型数据填充至视图中)
  10. 视图渲染结果会返回给客户端浏览器显示。

在上述执行过程中DispatcherServletHandlerMappingHandlerAdapterViewResolver对象的工作是在框架内部执行的开发人员并不需要关心这些对象内部的实现过程只需要配置前端控制器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注解的属性

属性名类型描述
nameString可选属性用于为映射地址指定别名
valueString[]可选属性同时也是默认属性用于映射一个请求和一种方法可以标注在一个方法或一个类上。
methodRequestMethod[]可选属性用于指定该方法用于处理哪种类型的请求方式其请求方式包括 GET、POST、HEAD、OPTIONS、PUT、 PATCH、 DELETE 和和TRACE,例如method= RequestMethod.GET 表示只支持 GET 请求 如果需要支持多个请求方式就需要通过{} 写成数组的形式并且多个请求方式之间是有英文逗号分隔的
paramsString[]可选属性用于指定 Request 中必须包含某些参数的值才可以通过其标注的方法处理
headersString[]可选属性用于指定 Request 中必须包含某些指定的header 的值才可以通过其标注的方法处理
consumesString[]可选属性用于指定处理请求的提交内容类型 (Content-Type )比如 application/json, text/html 等
producesString[]可选属性用于指定返回的内容类型返回的内容类型必须是 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主要用于数据绑定

属性说明
valuename 属性的别名这里指参数的名字即入参的请求参数名字如 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支持以及拦截器的内容。

如果各位大哥大姐对我所写的内容觉得还行的话希望可以点个关注点个收藏您的支持就是我最大的动力非常感谢您的阅读(❁´◡`❁)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring