Spring全家桶--SpringMVC(一)

简介: Spring全家桶--SpringMVC(一)

一、SpringMVC简介



1、什么是MVC


MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分


M:Model,模型层,指工程中的JavaBean,作用是处理数据


JavaBean分为两类:


一类称为实体类Bean:专门存储业务数据的,如 Student、User 等


一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。


V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据


C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器


MVC的工作流程:


用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器


2、什么是SpringMVC


SpringMVC是Spring的一个后续产品,是Spring的一个子项目


SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案。在表述层框架历经 Strust、WebWork、Strust2 等诸多产品的历代更迭之后,目前业界普遍选择了 SpringMVC 作为 Java EE 项目表述层开发的首选方案。


注:三层架构分为表述层(或表示层)、业务逻辑层、数据访问层,表述层表示前台页面和后台servlet


让我们看图来理解理解


image.png


3、SpringMVC的特点


Spring 家族原生产品,与 IOC 容器等基础设施无缝对接

基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理

表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案

代码清新简洁,大幅度提升开发效率

内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可

性能卓著,尤其适合现代大型、超大型互联网项目要求


4、SpringMVC快速入门


image.png



逻辑上的流程图


image.png


1.导入springMVC相关坐标


<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>


2.配置SpringMVC核心控制器DispatchcerServlet


<!--    配置springMVC的前端控制器-->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--        第一次访问就创建对象-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>


3.创建Controller类和视图层


package com.caq.controller;
import org.springframework.stereotype.Controller;
public class UserController {
    public String save(){
        System.out.println("Controller save runnning......");
        return "success.jsp";
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>Success!</h1>
</body>
</html>


4.使用注解配置Controller类中业务方法的映射地址


package com.caq.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserController {
    @RequestMapping("/quick")
    public String save(){
        System.out.println("Controller save runnning......");
        return "success.jsp";
    }
}


二、HelloWorld



1、开发环境


IDE:idea 2019.3


构建工具:maven3.8.3


服务器:tomcat7


Spring版本:5.0.5.RELEASE


然后这个环境要调一下,增加访问速度


image.png


2、创建maven工程


a>添加web模块

b>打包方式:war

c>引入依赖


<dependencies>
    <!-- SpringMVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.1</version>
    </dependency>
    <!-- 日志 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
    <!-- ServletAPI -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <!-- Spring5和Thymeleaf整合包 -->
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring5</artifactId>
        <version>3.0.12.RELEASE</version>
    </dependency>
</dependencies>


3、配置web.xml


Servlet要想处理请求,那么他就要在web.xml里进行注册


为什么要注册???


因为浏览器不能直接访问一个类,所以我们要设置一个匹配路径。每当我们访问的路径和匹配路径一致时,这个时候请求就会被Servlet处理


我们的SpringMVC里的DispatcherServlet它也是Servlet,所以在Web.xml里进行注册


注册SpringMVC的前端控制器DispatcherServlet


以下是两种注册方式:我们常用b方式


a>默认配置方式

此配置作用下,SpringMVC的配置文件默认位于WEB-INF下,默认名称为<servlet-name>-servlet.xml,例如,以下配置所对应SpringMVC的配置文件位于WEB-INF下,文件名为springMVC-servlet.xml


<!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 -->
<servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <!--
        设置springMVC的核心控制器所能处理的请求的请求路径
        /所匹配的请求可以是/login或.html或.js或.css方式的请求路径
        但是/不能匹配.jsp请求路径的请求
    -->
    <url-pattern>/</url-pattern>
</servlet-mapping>


b>扩展配置方式

可通过init-param标签设置SpringMVC配置文件的位置和名称,通过load-on-startup标签设置SpringMVC前端控制器DispatcherServlet的初始化时间


<!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 -->
<servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 通过初始化参数指定SpringMVC配置文件的位置和名称 -->
    <init-param>
        <!-- contextConfigLocation为固定值 -->
        <param-name>contextConfigLocation</param-name>
        <!-- 使用classpath:表示从类路径查找配置文件,例如maven工程中的src/main/resources -->
        <param-value>classpath:springMVC.xml</param-value>
    </init-param>
    <!-- 
    作为框架的核心组件,在启动过程中有大量的初始化操作要做
  而这些操作放在第一次请求时才执行会严重影响访问速度
  因此需要通过此标签将启动控制DispatcherServlet的初始化时间提前到服务器启动时
  -->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <!--
        设置springMVC的核心控制器所能处理的请求的请求路径
        /所匹配的请求可以是/login或.html或.js或.css方式的请求路径
        但是/不能匹配.jsp请求路径的请求
    -->
    <url-pattern>/</url-pattern>
</servlet-mapping>


注:


<url-pattern>标签中使用/和/*的区别:


/所匹配的请求可以是/login或.html或.js或.css方式的请求路径,但是/不能匹配.jsp请求路径的请求


因此就可以避免在访问jsp页面时,该请求被DispatcherServlet处理,从而找不到相应的页面


/*则能够匹配所有请求,例如在使用过滤器时,若需要对所有请求进行过滤,就需要使用/*的写法


4、创建请求控制器


由于前端控制器对浏览器发送的请求进行了统一的处理,但是具体的请求有不同的处理过程,因此需要创建处理具体请求的类,即请求控制器


请求控制器中每一个处理请求的方法成为控制器方法


因为SpringMVC的控制器由一个POJO(普通的Java类)担任,因此需要通过@Controller注解将其标识为一个控制层组件,交给Spring的IoC容器管理,此时SpringMVC才能够识别控制器的存在


@Controller
public class UserController {
}


够人性化!

image.png


5、创建springMVC的配置文件


<!-- 自动扫描包 -->
<context:component-scan base-package="com.caq.mvc.controller"/>
<!-- 配置InternalResourceViewResolver视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
<!-- 
   处理静态资源,例如html、js、css、jpg
  若只设置该标签,则只能访问静态资源,其他请求则无法访问
  此时必须设置<mvc:annotation-driven/>解决问题
 -->
<mvc:default-servlet-handler/>
<!-- 开启mvc注解驱动 -->
<mvc:annotation-driven>
    <mvc:message-converters>
        <!-- 处理响应中文内容乱码 -->
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="defaultCharset" value="UTF-8" />
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html</value>
                    <value>application/json</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>


6、测试HelloWorld


在请求控制器中创建处理请求的方法


@RequestMapping("/quick")
    public String save() {
        System.out.println("aController save runnning......");
        return "success";
    }


image.png


7、总结


浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被前端控制器DispatcherServlet处理。前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视图所对应页面


三、@RequestMapping注解



1、@RequestMapping注解的功能


从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。


SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。


2、@RequestMapping注解的位置


@RequestMapping标识一个类:设置映射请求的请求路径的初始信息
@RequestMapping标识一个方法:设置映射请求请求路径的具体信息
@Controller
@RequestMapping("/test")
public class RequestMappingController {
  //此时请求映射所映射的请求的请求路径为:/test/testRequestMapping
    @RequestMapping("/testRequestMapping")
    public String testRequestMapping(){
        return "success";
    }
}


3、@RequestMapping注解的value属性


@RequestMapping注解的value属性通过请求的请求地址匹配请求映射


@RequestMapping注解的value属性是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址所对应的请求


@RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射


4、@RequestMapping注解的method属性


@RequestMapping注解的method属性通过请求的请求方式(get或post)匹配请求映射


@RequestMapping注解的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式的请求


注:


1、对于处理指定请求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解


处理get请求的映射–>@GetMapping


处理post请求的映射–>@PostMapping


处理put请求的映射–>@PutMapping


处理delete请求的映射–>@DeleteMapping


2、常用的请求方式有get,post,put,delete


5、SpringMVC支持ant风格的路径

?:表示任意的单个字符


*:表示任意的0个或多个字符


**:表示任意的一层或多层目录


注意:在使用**时,只能使用/**/xxx的方式


四、SpringMVC获取请求参数



1、通过ServletAPI获取


将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象


@RequestMapping("/testParam")
public String testParam(HttpServletRequest request){
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    System.out.println("username:"+username+",password:"+password);
    return "success";
}


元生的Servlet方式获取,不常用,我们有好的SpringMVC框架。


2、通过控制器方法的形参获取请求参数


在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中就会将请求参数赋值给相应的形参


@RequestMapping("/quick12")@ResponseBody //告知springMvc框架不进行页面跳转,而是直接进行数据响应public void save12(String username,int age) throws IOException {    System.out.println(username);    System.out.println(age);}


解释在代码中写的还挺好的


这部分可以看黑马程序员的实例,比较好理解~


注:


若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串数组或者字符串类型的形参接收此请求参数


若使用字符串数组类型的形参,此参数的数组中包含了每一个数据


若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果


3、@RequestParam


@RequestParam是将请求参数和控制器方法的形参创建映射关系


@RequestParam注解一共有三个属性:


value:请求参数名称


required:设置是否必须传输此请求参数,默认值为true,提交时如果没有此参数则报错


defaultValue:当没有指定请求参数时,则使用指定的默认值赋值


@RequestMapping("/quick15")
@ResponseBody //告知springMvc架不进行页面跳转,而是直接进行数据响应
public void save15(@RequestParam(value = "name",required = false,defaultValue = "test15") String username) throws IOException {
    System.out.println(username);
}



我们来一个没有参数的请求,看看他Servlet获取的是不是test15


http://localhost/quick15?


image.png


4、@RequestHeader


@RequestHeader是将请求头信息和控制器方法的形参创建映射关系


@RequestHeader注解一共有三个属性:value、required、defaultValue,用法同@RequestParam


5、@CookieValue


@CookieValue是将cookie数据和控制器方法的形参创建映射关系


@CookieValue注解一共有三个属性:value、required、defaultValue,用法同@RequestParam


6、通过POJO获取请求参数


可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值


user对象我就不放了,就正常的javabean


@RequestMapping("/quick13")
    @ResponseBody //告知springMvc框架不进行页面跳转,而是直接进行数据响应
    public void save13(User user) throws IOException {
        System.out.println(user);
    }

 

地址栏中的请求地址


[localhost/quick13?username=zs&age=13]
(http://localhost/quick13?username=zs&age=13)最终结果User{username='zs', age=13}


7、获得数组类型的参数


http://localhost/quick14?strs=222&strs=333


@RequestMapping("/quick14")@ResponseBody //告知springMvc架不进行页面跳转,而是直接进行数据响应public void save13(String[] strs) throws IOException {    System.out.println(Arrays.asList(strs));}


返回一个集合


[222, 333]


8、解决获取请求参数的乱码问题


解决获取请求参数的乱码问题,可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter,但是必须在web.xml中进行注册


<!--配置springMVC的编码过滤器-->


<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>
    <init-param>
        <param-name>forceResponseEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

注:


SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前,否则无效


五、域对象共享数据



1、使用ServletAPI向request域对象共享数据


@RequestMapping("/testServletAPI")
public String testServletAPI(HttpServletRequest request){
    request.setAttribute("testScope", "hello,servletAPI");
    return "success";
}


2、使用ModelAndView向request域对象共享数据

 

@RequestMapping("/quick2")
    public ModelAndView save2() {
        /**
         * 当控制器处理完请求时,
         * 通常会将包含视图名称或视图对象以及一些模型属性的ModelAndView对象
         * 返回到DispatcherServlet。
         * model模型:封装数据
         * view模型:展示数据
         */
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("username", "pyy");
//        设置视图名称
        modelAndView.setViewName("success");
        return modelAndView;
    }


3、使用Model向request域对象共享数据


@RequestMapping("/quick4")
    public String save4(Model model) {
        model.addAttribute("username", "张三");
        return "success";
    }


相关文章
|
设计模式 前端开发 Java
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究SpringMVC的核心原理和运作机制(总体框架原理篇)
【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究SpringMVC的核心原理和运作机制(总体框架原理篇)
145 0
|
15天前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
4月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
133 0
|
10月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
452 29
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
150 2
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
2875 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
384 1
|
前端开发 Dubbo Java
spring面试题_spring mvc面试题_springboot面试题库
spring面试题_spring mvc面试题_springboot面试题库

热门文章

最新文章

下一篇
开通oss服务