spring_MVC框架
- 一、spring_MVC框架是个啥
- 二、spring_MVC的快速入门
- 三、spring_MVC的各个组成部分解析
- 3.1 SpringMVC的执行流程
- 3.2 SpringMVC组件解析
- 3.3 SpringMVC注解解析
- 3.4 SpringMVC的XML配置解析(spring-mvc.xml的配置)
- 3.5springMVC的请求与响应
- 3.6 spring-mvc拦截器
- 3.7 spring-mvc异常处理机制
一、spring_MVC框架是个啥
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFra meWork 的后续产品,已经融合在 Spring Web Flow 中。SpringMVC 已经成为目前最主流的MVC框架之一,它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。
二、spring_MVC的快速入门
2.1 使用前需要导那些jar包
1、Spring集成web的坐标
org.springframework
spring-web
5.0.5.RELEASE
2.2开发步骤![入门步骤](https://img-blog.csdnimg.cn/74c2fc06e0d745938834865592ffc7bd.png)
①导入SpringMVC相关坐标
②配置SpringMVC核心控制器DispathcerServlet
在web项目中的web-inf目录下的web.xml中分别配置由springMVC提供的
核心控制器(DispatcherServlet)、
具体配置:
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring_mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
监听器(ContextLoaderListener)、
具体配置:
<!--配置监听-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
过滤器(CharacterEncodingFilter);
具体配置:
<!--配置全局过滤的filter-->
<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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
③创建Controller类和视图页面(在springmvc中将pojo叫做contriller )
④使用注解配置(到ioc中)Controller类中业务方法的映射地址
⑤配置SpringMVC核心文件 spring-mvc.xml
主要配置:
<context:component-scan base-package=“使用注解的包或上级包的全包名”/>
⑥客户端发起请求测试
三、spring_MVC的各个组成部分解析
3.1 SpringMVC的执行流程
3.2 SpringMVC组件解析
- 前端控制器:DispatcherServlet
用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。 - 处理器映射器:HandlerMapping
HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。 - 处理器适配器:HandlerAdapter
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。 - 处理器:Handler
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行 处理。 - 视图解析器:ViewResolver
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。 - 视图:View
SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面
3.3 SpringMVC注解解析
@Controller :将该类交给springioc容器管理
@RequestMapping
作用:用于建立请求 URL 和处理请求方法之间的对应关系
位置:
类上,请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录
方法上,请求 URL 的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径
属性:
value:用于指定请求的URL。它和path属性的作用是一样的
method:用于指定请求的方式
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样
3.4 SpringMVC的XML配置解析(spring-mvc.xml的配置)
3.4.1 视图解析器配置:
3.4.1.1 视图解析器配置一
REDIRECT_URL_PREFIX = “redirect:” --重定向前缀
FORWARD_URL_PREFIX = “forward:” --转发前缀(默认值)
prefix = “”; --视图名称前缀
suffix = “”; --视图名称后缀
以上可以在spring-mvc.xml文件中进行属性注入 ;配置的bean的class属性为InternalResourceViewResolver
3.4.1.2 视图解析器配置二
涉及配置的bean的class属性为CommonsMultipartResolver
<!--配置文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--默认编码格式-->
<property name="defaultEncoding" value="UTF-8"/>
<!--最大上传大小-->
<property name="maxUploadSize" value="500000"/>
</bean>
3.4.2处理器适配器配置为spring帮助我们将对象或集合庄伟json格式
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>
以上可以用一下代替:
mvc:annotation-driven/
对以上可以替代的解释:
使用<mvc:annotation-driven />
自动加载 RequestMappingHandlerMapping(处理映射器)和
RequestMappingHandlerAdapter( 处 理 适 配 器 ),可用在Spring-xml.xml配置文件中使用
<mvc:annotation-driven />
替代注解处理器和适配器的配置。同时使用<mvc:annotation-driven />
默认底层就会集成jackson进行对象或集合的json格式字符串的转换
3.4.3 配置拦截器:
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--对哪些资源执行拦截操作-->
<mvc:mapping path="/**"/>
<!--对那个路径不进行拦截操作-->
<mvc:exclude-mapping path="/user/login"/>
<bean class="定义的拦截器的全包名"/>
</mvc:interceptor>
</mvc:interceptors>
3.4.4 配置简单映射异常处理器:
<!--配置简单映射异常处理器-->
<bean class=“org.springframework.web.servlet.handler.SimpleMappingExceptionResolver”> <property name=“defaultErrorView” value=“error”/> 默认错误视图
<property name=“exceptionMappings”>
<map> 异常类型 错误视图
<entry key="com.itheima.exception.MyException" value="error"/>
<entry key="java.lang.ClassCastException" value="error"/>
</map>
</property>
</bean>
3.4.5 配置自定义异常处理器
3.5springMVC的请求与响应
3.5.1 SpringMVC的数据响应
3.5.1.1 数据响应方式
3.5.1.1.1分类
3.5.1.1.1.1 页面跳转
1.1直接返回字符串
1.1.1原理图
对原理图带有前缀解释:
重定向是两次请求 也就是说重定向的目录需要被外界访问 ,而web_inf显然不被允许被外界访问 所有重定向不加起前面那一坨
1.2通过ModelAndView对象返回
Model:模型 作用封装数据:方法:addObject
View:视图 作用展示数据:方法:setViewName
3.5.1.1.1.2 回写数据
2.1直接返回字符串(Model对象带回数据或者@ResponseBody将字符串数据写回)
@ResponseBody注解告知SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回:通过这个注解告知SpringMVC框架 不进行视图跳转 直接进行数据响应
2.1.1直接回写json格式字符串
和直接返回字符串一样 ,不要加@ResponseBody注解,但不需要导包
2.2返回对象或集合(都是先将两者通过jackson转换工具转为json字符串后进行回写数据)(@ResponseBody+`mvc:annotation-driven/需要引入mvc命名空间)
使用步骤
1、使用前需要先进行导入jackson的jar的坐标或包:core,databind,annotations
2、在spring-mvc.xml中配置,告知spring-mvc要帮助我们对对象或集合进行json字符串的转换并回写,具体配置见3.4.2
2.2.1返回对象
通过以上设置就会spring-mvc就会将我们返回的对象转为json格式的字符串,响应给前台,此时也要加@ResponseBody,因为返回的始终还是个字符串,需要告知spring-mvc,不进行视图跳转 直接进行数据响应
2.2.2返回集合
3.5.2 SpringMVC的数据请求(spring MVC能够接受那些数据类型)
数据的请求,也要先告知SpringMVC,通过( @ResponseBody),不进行视图跳转 ,接着在方法上将返回值设置为void,这就告诉springmvc不,进行数据响应
3.5.2.1 SpringMVC可以接收如下类型的参数
3.5.2.1.1、基本类型参数
Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。并且能自动做类型转换;如果当业务方法的参数名称要与请求参数的name不一致时,可以使用@RequestParam进行参数绑定,该注解的三个属性(value:前台传过来参数名,,required :是否必须要 (true/false),defaultValue:默认值)
3.5.2.1.2、POJO类型参数:简单的javabean
Controller中的业务方法的POJO参数的属性名与请求参数的参数名一致,参数值会自动映射匹配。
3.5.2.1.3、数组类型参数
Controller中的业务方法参数为一个数组且数组名称与请求参数的参数名一致,参数值会自动映射匹配。
3.5.2.1.4、集合类型参数
3.5.2.1.4.1 获取集合参数类型的方式一
获得集合参数时,要将集合参数包装(value object vo对象)到一个POJO中才可以,关于这个VO对象,在这个VO对象中包含一个LIst<集合中的数据类型> List 属性 ,包含该属性的getter/setter方法,重写tostring方法,在前台的主要通过《input》标签中name值来进行区分那个时集合中第一个,哪个是第二个等等
具体实例:
<form action="${pageContext.request.contextPath}/user/quick14" method="post">
<%--表明是第一个User对象的username age--%>
<input type="text" name="userList[0].username"><br/>
<input type="text" name="userList[0].age"><br/>
<input type="text" name="userList[1].username"><br/>
<input type="text" name="userList[1].age"><br/>
<input type="submit" value="提交">
</form>
3.5.2.1.4.2 获取集合参数类型的方式二
当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装
demo:
<script src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script>
<script>
var userList = new Array();
userList.push({username:"zhangsan",age:18});
userList.push({username:"lisi",age:28});
$.ajax({
type:"POST",
url:"${pageContext.request.contextPath}/user/quick15",
data:JSON.stringify(userList),
contentType:"application/json;charset=utf-8"
});
</script>
3.5.2.2 SpringMVC可以接收参数是注意问题
3.5.2.2.1 静态资源访问的开启
在web.xml中核心控制器的url配置为/:缺省:意味着,客户端发的请求 服务端找servlet 内部没有其他的servlet 找不到(就都归缺省进行处理 ) 去找mvc配置的servlet ,当有静态资源需要加载时,比如jquery文件,通过谷歌开发者工具抓包发现,没有加载到jquery文件,原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作,我们可以通过以下两种方式指定放行静态资源:
1、•在spring-mvc.xml配置文件中指定放行的资源
<mvc:resources mapping="/js/**"location="/js/"/>:需要引入mvc命名空间
属性解释:
mapping:是在服务端找资源的地址
location:具体资源在的路径
2、•使用`<mvc:default-servlet-handler/>`标签
3.5.2.2.2 配置全局乱码过滤器
目的:当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤。
这是在web.xml中配置过滤器,详情见快速入门中web.xml配置部分
3.5.2.2.3 参数绑定注解
目的:当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
3.5.2.2.4 Restful风格的参数的获取
3.5.2.2.4.1 Restful风格是什么?
Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
GET:用于获取资源 在restful风格中代表查
POST:用于新建资源 在restful风格中代表增
PUT:用于更新资源 在restful风格中代表修
DELETE:用于删除资源 在restful风格中代表删
3.5.2.2.4.2 如何使用
使用案例:
/user/1 GET : 得到 id = 1 的 user
/user/1 DELETE: 删除 id = 1 的 user
/user/1 PUT: 更新 id = 1 的 user
/user POST: 新增 user
上述url地址/user/1中的1就是要获得的请求参数,在SpringMVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/{id},占位符{id}对应的就是1的值。在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。
使用案例中涉及的一个注解:在业务方法中我们可以使用@PathVariable注解进行占位符的匹配获取工作。
3.5.2.2.5 自定义类型转换器
3.5.2.2.5.1 为啥要有自定义类型转换器?
SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。
3.5.2.2.5.2 自定义类型转换器实现步骤
1、定义的Converter类 去实现springMVC提供Converter<String, Date> 接口 ,然后实现具体方法
demo:
public class DateConverter implements Converter<String, Date> {
前一个原始 后一个转成谁
public Date convert(String dateStr) {
//将日期字符串转换成日期对象 返回
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
2、在spring-mvc中配置转换器,并将这个转换起,在注解驱动中进行属性的配置
2.1 配置声明转换器
<!--声明转换器-->
<bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.zkwf.Converter.DateConverter"></bean>
</list>
</property>
</bean>
2.2 注解驱动中进行属性的配置
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
3、测试
3.5.2.2.6 获得Servlet相关API
SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:HttpServletRequest
HttpServletResponse
HttpSession
当方法中出来这些对象时,spring-mvc会自动注入(像是由tomcat提供给spring-mvc,然后spring-mvc在注入)
3.5.2.2.7 获得请求头信息
@RequestHeader可以获得请求头信息,相当于web阶段学习的request.getHeader(name)
@RequestHeader注解的属性如下:
value:请求头的名称
required:是否必须携带此请求头
使用@CookieValue可以获得指定Cookie的值
@CookieValue注解的属性如下:
value:指定cookie的名称
required:是否必须携带此cookie
3.5.2.2.8 文件上传
首先必须知道wen文件上传客户端表单需要满足三要素:
1、表单项type=“file”
2、表单的提交方式是post
3、表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data”
文件传原理图:
文件上传前需要导入的依赖包或maven坐标
commons-fileupload
commons-fileupload
1.3.1
commons-io
commons-io
2.3
开发步骤
1、添加依赖
2、配置多媒体解析器;详情见3.4.1.2 视图解析器配置二
3、 测试
3.5.2.2.8.1 单文件上传
注意要点:
表单中type类型为file 其name值应该和后台代码提供的路径对应的方法中mutilpartfile对象名一致
3.5.2.2.8.2 多文件上传
注意要点
表单中多个type类型为file 其name值相同
后台代码中的multlpart类型应该为数据 且数组名与前台name值相同
3.5.2.2.8.3 文件上传常见异常
异常
上传文件大小超过多媒体解析器 配置的最大大小 解决方法 修改上传的最大大小就可以
3.6 spring-mvc拦截器
3.6.1 是个啥?来干啥的?
Spring MVC 的**拦截器**类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行**预处理**和**后处理**。访问目标方法时做干预 。
3.6.1 关于拦截器链(InterceptorChain)
将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(InterceptorChain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序(在spring-mvc中的配置顺序 谁写上面,谁写下面)被调用。拦截器也是AOP思想的具体实现。
3.6.2关于SpringMVC拦截器-interceptor和filter区别
特点以及与web项目中过滤器的区别
3.6.3 快速入门 步骤
①创建拦截器类实现HandlerInterceptor接口
重写其中的三个方法
//在目标方法执行之前 执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
返回true:放行;返回false:不放行
//在目标方法执行之后 视图对象返回之前执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
//在流程都执行完毕后 执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
②配置拦截器,(详情见 3.4.3 配置拦截器:)
多个拦截器情况下,配置在前的先执行,配置在后的后执行
③测试拦截器的拦截效果
当拦截器的preHandle方法返回true则会执行目标资源,如果返回false则不执行目标资源拦截器中的方法执行顺序是:preHandler-------目标资源----postHandle---- afterCompletion
3.7 spring-mvc异常处理机制
3.7.1异常分类
1、了解异常:
运行时异常 RuntimeException,能否被捕捉?能
错误Error,能否被捕捉?能
运行时异常与非运行时异常的区别?
运行时异常是不可查异常,不需要进行显式的捕捉
非运行时异常是可查异常,必须进行显式的捕捉,或者抛出
2、
预期异常
RuntimeException
后者主要通过规范代码开发、测试等手段减少运行时异常的发生。
3.7.2 springmvc处理异常原则
系统的Dao、Service、Controller出现都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理,
原则图:
![请添加图片描述](https://img-blog.csdnimg.cn/afb5e9e7f117488e9d8f2fa4d325f39e.jpeg)
3.7.3 springMVC处理异常的两种方式
3.7.3 springMVC处理异常的方式一
3.7.3.1 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver
直接在spring-mvc中配置《bean class为此处理器》对象然后配置其属性 当属性name为exceptionMappings时,该属性下还得配子标签《map》 然后在配置map中的每一项《entry》 每一项中属性key代表是啥异常 value表示条状页面名称
具体实例见 3.4.4 配置简单映射异常处理器:
3.7.3 springMVC处理异常的方式二
3.7.3.2 实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器
步骤
①创建异常处理器类实现HandlerExceptionResolver
package com.zkwf.ExceptionResolver;
import com.zkwf.exception.MyException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileNotFoundException;
/**
* @description:
* @author: Sw_Ljb
* @PACKAGE_NAME:com.zkwf.ExceptionResolver
* @time: 2022/6/16 下午6:48
* @version: 1.0
*/
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
if (e instanceof MyException){
modelAndView.addObject("Expetion","自定义异常");
}else if (e instanceof FileNotFoundException){
modelAndView.addObject("Expetion","文件找不到");
}else if (e instanceof ClassCastException){
modelAndView.addObject("Expetion","类型转换异常");
}else if (e instanceof NullPointerException){
modelAndView.addObject("Expetion","空指针异常");
}else if(e instanceof ArithmeticException){
modelAndView.addObject("Expetion","0异常");
}
modelAndView.setViewName("defaulterror");
return modelAndView;
}
}
②配置异常处理器
<bean id="自定义异常处理器的id" class="自定义异常处理器的全包名"/>
③编写异常页面
④测试异常跳转