SpringMVC(初识)执行流程和@RequestMapping(总体第一篇)

视频学习地址:https://www.bilibili.com/video/BV1Ry4y1574R?p=2&spm_id_from=pageDriver

一、SpringMVC概述

1、Spring了解

  • Spring为展示提供的基于MVC设计理念的优秀理念的优秀web框架,是目前最流行的MVC框架之一
  • Spring3.0 后超宇了Struts2,成为最常用MVC框架
  • SpringMVC通过一套MVC注解,让POJO成为处理请求的控制器,而无需实现任何接口
  • 支持REST风格的URL请求
  • 采用松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性

2、SpringMVC是什么

  • 什么是MVC
    在这里插入图片描述

  • 一种轻量级的,基于MVC的web层应用的框架的,偏前端而不是基于业务逻辑层,Spring框架的一个后端产品

  • Spring框架结构图
    在这里插入图片描述

3、SpringMVC能干什么

  • 来源于Spring框架,天生就很结合,什么IOC,AOP什么都可以使用
  • 支持RestFul
  • 进行更简洁的Web层开发
  • 支持灵活的URL到页面控制器的映射
  • 非常容易与其他视图技术集成,如Velocity,FreeMarker
  • 因为模型数据不存在特定的API里,而是放在一个Model(Map数据结构实现,因此很容易被其他框架使用)
  • 非常灵活的数据验证,格式化,数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API
  • 更加简单,强大的异常处理
  • 对静态资源的支持
  • 支持灵活的本地化,主题等解析

4、SpringMVC核心介绍

  • 将web层进行了职责解耦,基于请求-响应模型
  • 常用主要组件
    • DispatcherServlet:前端控制器
    • Controller:处理器/页面控制器,做的是MVC中的C的事情,但控制逻辑转移到前端控制器,用于对请求进行处理
    • HandlerMapping:请求映射到处理器,找谁来处理,如果映射成功就返回一个HandlerExecutionChain对象(包含Handler处理器(页面控制器)对象),多个HandlerInterceptor拦截对象
    • View Resolver:视图解析器,找谁来处理返回的页面,把逻辑视图解析为具体的View,进行这种测录模式,很容易更换其他视图技术(如InternalResourceViewResolver将逻辑视图名映射为JSP视图)
    • LocalR二so绿二:本地化,国际化
    • MultipartResolver:文件上传解析器
    • HandlerExceptionResolver:异常处理器

5、SpringMVC的helloworld

(1)创建项目和导入依赖

在这里插入图片描述

  • 导入依赖
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>5.3.17</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.3.17</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.17</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.3.17</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>5.3.17</version>
    </dependency>

    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.3.17</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.16</version>
    </dependency>
  • 这里补充一下依赖中的一些理解
    在这里插入图片描述
    如果提供了scope的话,那就是理解为已被提供的,怎么说呢?就是在服务器上已经提供了这个包了,在我们打包项目的时候,这个依赖就不会被打包了

  • 补全目录
    在这里插入图片描述

  • 设置web描述符【这里我们可以手动设置,可以自己去创建,但是我们选择webapps的形式,所以这里就不用配置了】
    在这里插入图片描述

(2)配置DispatcherServlet文件

web.xml里面配置过滤器,监听器,注册servlet,为什么在这里要配置呢?原因啊我们的SpringMVc是采用Servlet处理的,所以这里就要配置,给前端处理器进行处理。

  • 默认配置方式【配置前端控制器DispatcherServlet】
    在这里插入图片描述
    为什么不是斜杠*呢?原因就是我们不能匹配jsp文件,为什么不匹配jsp文件呢?因为我们jsp本身就是一种特殊的servlet,所以不可以为斜杆*

(3)配置位置和名称

在这里插入图片描述

(4)编写控制器类

在这里插入图片描述

(5)配置SpringMVC.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="cn.mldn.springmvc"></context:component-scan>

    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                        <!--视图前缀-->
                        <property name="prefix" value="/WEB-INF/templates"/>
                        <!--视图后缀-->
                        <property name="suffix" value=".html"/>
                        <property name="templateMode" value="HTML5"/>
                        <property name="characterEncoding" value="UTF-8"/>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
</beans>

在这里插入图片描述

(6)访问helloworld

在这里插入图片描述
这样之后,我们就可以访问index.html了,它会被我们刚在SpringMVC.xml文件里面配置的

(7)发布项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个是我们启动就会跳转的页面,我们去配置自己想要访问的页面

(8)再次编写

在这里插入图片描述
在这里插入图片描述

  • 刚刚没有仔细看,原理访问的是jsp首页,我这里配置错了
    在这里插入图片描述
    在这里插入图片描述

6、对helloworld程序进行总结

  • 首先整体流程是如下的
    在这里插入图片描述
  • 首先我们的helloworld会被配置的url-pattern检测是否符合,该请求会被前端控制器DispatcherServlet处理,前端控制器会读取SpringMVC的核心配置文件
    在这里插入图片描述
  • SpringMVC配置文件,通过扫描组件控制器,将请求地址和控制器中的@RequestMapping注解的value属性进行匹配
    在这里插入图片描述
  • 匹配成功的话,该控制器所标识的控制器方法几十处理器请求的方法,处理请求的方法需要返回一个字符串的视图名称
    在这里插入图片描述
  • 返回的字符串所标识的视图会被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf进行渲染,最终转发到视图所对应的页面。

在这里插入图片描述
在这里插入图片描述

二、@RequestMapping注解

(一)介绍和使用

1、@RequestMapping概念

  • springmvc使用@RequestMaping注解为控制器指定可以处理哪些URL请求
  • 在控制器的类定义及方法处都可标记为@RequestMapping
    • 标在类上,提供初步的请求映射信息,相当于WEB应用的根目录
    • 标记在方法上:”提供上一步的戏份映射信息,相对于标记在雷伤的URL
  • 若类上未标记@RequestMapping,则方法处标记的url相当于web应用的根目录
  • 作用:DispatcherServlet截获请求后,就通过控制器上@RequestMapping提供的映射信息确定请求所对应的处理方法
    在这里插入图片描述
    在这里插入图片描述

2、RequestMapping映射请求方式

(1)标准的HTTP请求报文

在这里插入图片描述

(2)映射请求参数、请求方法和请求头

  • @RequestMapping除了可以使用URL映射请求外,还可以使用请求方法,请求参数及请求映射请求

  • @RequestMapping的value,method,params,和heads分别请求url,请求方法,请求参数,及请求头的映射文件,他们之间是与的关系,联合使用多个条件可让请求映射更加精准化。

  • params和headers支持简单的表达式
    在这里插入图片描述

  • 验证
    在这里插入图片描述
    如果以get方式访问就会报错。

  • @RequestMapping映射请求参数和请求头

在这里插入图片描述
在这里插入图片描述

3、@RequestMapping派生注解

在这里插入图片描述
这样就可以不用设置methods方法属性了

4、@RequestMapping支持Ant路径风格

(1)Ant风格资源地址支持三种匹配符

  • ?:匹配文件名中的一个字符
  • *:匹配文件中的任意字符
  • **:**匹配多层路径

(2)@RequestMapping就可以如下支持

在这里插入图片描述
在这里插入图片描述

5、@RequestMapping映射请求占位符PathVariable

(1)@PathVariable

  • 带有占位符的URL是Spring3.0中新增的功能,该功能在于SpringMVC想REST目前挺近发展过程具有里程碑的意义
  • 通过@PathVariable可以将URL中占位符参数绑定到控制器处理方法的入参中

(2)案例演示

在这里插入图片描述

(二)SpringMVC获取参数的方式

1、直接调用HTTPServletRequest或者HTTPServletResponse

在这里插入图片描述

2、通过Param获取参数

直接通过名字
在这里插入图片描述

  • 若请求参数中只有不同的参数,那就可以用对应的类型,比如有一个String username,Integer 类型的age
  • 若请求参数中有多个同名的参数,那就可以用String类来当字符串处理或者用String的数组处理,比如你的爱好,是多个,那就可以会有通过String来实现

3、@RequestParam注解请求和控制器方法的形参映射关系

(1)注解使用

比如我们方法写的形参参数如下
在这里插入图片描述
而我们的请求时/param?user_name=aaa&password=123,此时后端是无法获取username的参数值的
在这里插入图片描述
此时我们就发送这个请求也没事了user_name=aaa&password=123。

(2)属性required

  • 如果等于true,你就必须得传这个参数,此时你不传就会报错
  • 如果为false,你可以不传,可以传,此时你不传也不会报错。
    在这里插入图片描述

(3)属性defaultValue

  • 设置这个参数的默认值,你传就用你的,不传就是这个默认值。
    在这里插入图片描述

4、@RequestHeaders

  • 获取请求头信息比如,获取请求信息
    在这里插入图片描述
  • 同样的它也有value,required,defaultValue

5、@CookieValue

  • 将cookie和控制器关联映射关系,同样的也有几个属性。
    在这里插入图片描述

6、通过实体类的形参获取

在这里插入图片描述
比如我们数据库有这样的对应的属性的类,我们每次提交的时候,那就好了,请求的时候,我们SpringMVC直接这样给你对应起来实现一一对应,只要在请求中写好形参即可。
在这里插入图片描述

  • 另外提醒一点,跟这个类一样,也一样去写好无参构造方法,和有参构造方法,不管你多类,都写上去。因为我们Spring框架什么的,都基本采用的反射,所以反射就要调用无参构造方法。
    在这里插入图片描述
    在这里插入图片描述

7、解决乱码问题

  • 我们前端提交的表单是会有中文报错,那是因为我们前后端采用的不同的编码格式

(1)分析get乱码

  • 乱码也分get和post乱码的,我们使用get提交是不会产生乱码的,原因就是我们的Tomcat里面的config里面存在一个server.xml配置的原因
    在这里插入图片描述
    这个配置的是get乱码的,只要使用这个Tomcat,就不会报错

(2)那怎么解决Post编码呢?

  • 首先想想一下,我们的设置编码肯定是在我们的后端获取参数之前,所以肯定是才服务器加载的时候就获取参数。那我们处理能在servlet,过滤器,监听器里面配置,到底在哪个里面配置呢?首先执行顺序应该是监听器,过滤器,最后servlet执行,能写的就这个过滤器里面吧,所以配置监听器就OK了
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 在web.xml里面
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值