视频学习地址: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里面