快速了解SpringMVC的概念及如何使用
1. 什么是MVC模式
MVC :是一种用于设计创建web应用表现层的模式。使用它可以将业务逻辑,数据,页面显示代码分离出来。
Model(模式):数据模型,代表一个存取数据的对象
View(视图):用于展示数据(html,jsp)
Controller(控制器):用于程序业务逻辑处理
1、封装请求:model
2、调用service
3、响应跳转视图
2. MVC模式和三层架构的关系
MVC把三层架构中的表现层再度进行了分化,分成了控制器、视图、模型。
三层架构的目的是解耦,MVC的目的是实现web系统的职责划分。
3. 什么是SpringMVC
SpringMVC是一个实现了MVC设计模式的轻量级框架,把三层架构的web层再度进行了分化,分成了模型、视图、控制器,实现了web层的职责划分,它可以通过一套注解,让一个简单的Java类成为控制器,而无须实现任何接口。
SpringMVC的功能就是封装了原来Servlet中的共有功能,例如请求参数解析处理、请求结果封装返回等。
4. SpringMVC的使用步骤
(1)创建web工程并引入坐标
(2)web.xml中配置前端控制器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!--
配置前端控制器
DispatcherServlet
-->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--自动加载Springmvc的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<!--
处理所有请求
不处理.jsp为后缀的请求
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
(3)springmvc主配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--1、包扫描-->
<context:component-scan base-package="包名"></context:component-scan>
<!--2、配置SpringMVC的注解驱动
对三大组件中处理器映射器和处理器适配器进行功能加强-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--视图解析器-->
<!--
当我们需要返回一个视图的时候,只需写视图的名称。
视图解析器会自动在该名称上拼接前后缀。
比如:视图名为success 拼接后的为:/WEB-INF/pages/success.jsp
-->
<bean id="internalResourceViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
(4)请求页面发起请求
<a href="${pageContext.request.contextPath}/mvc/rm">入门--get请求方式</a>
(5)开发控制器接收请求
/**
* 控制器:需要交给容器管理
* 方法:接受请求,调用service,完成响应和页面跳转
*/
@Controller
@RequestMapping("/mvc")
public class MVCController {
/**
* 控制器方法:
* 接受请求,调用service,完成响应和页面跳转
* 1、返回值String (跳转的页面路径)
* 2、需要在方法上通过注解@RequestMapping配置进入此方法的url
*
*/
@RequestMapping("/rm")
public String rm(){
return "success"; // /WEB-INF/pages/ +控制器返回值+ .jsp
}
}
(6)提供success响应页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>success</title>
</head>
<body>
请求成功!
</body>
</html>
5. SpringMVC的四大组件
(1)前端控制器:DispatcherServlet
SpringMVC的核心组件(DispathcherServlet),协调所有组件的运行
(2)处理器映射器:HandlerMapping
根据URL请求去寻找对应的处理方法( Controller中的方法 )
(3)处理器适配器:HandlerAdapter
真正的去调用处理方法( 执行Controller中的方法 )
(4)视图解析器:ViewReslover
将逻辑视图翻译成物理视图
物理视图:jsp页面的完整路径
6. SpringMVC执行流程
-
用户通过浏览器发送请求至前端控制器(DispatcherServlet)
-
前端控制器(DispatcherServlet)收到请求调用处理器映射器(HandlerMapping)
-
处理器映射器(HandlerMapping)找到具体的处理器链返回给前端控制器(DispatcherServlet)
-
前端控制器(DispatcherServlet)会根据返回的处理器链调用处理器适配器(HandlerAdapter)
-
处理器适配器(HandlerAdapter)经过适配调用具体的控制器(Controller)
-
控制器(Controller)执行完成返回一个执行结果
-
处理器适配器(HandlerAdapter)将控制器(Controller)的结果ModelAndView对象返回给前端控制器(DispatcherServlet)
-
前端控制器(DispatcherServlet)将ModelAndView对象传给视图解析器(ViewReslover)
-
视图解析器(ViewReslover)解析后得到具体View,并返回给前端控制器(DispatcherServlet)
-
前端控制器(DispatcherServlet)根据View进行视图渲染(即将模型数据填充至视图中)
-
前端控制器(DispatcherServlet)会将渲染后的视图响应给浏览器
7. @RequestMapping注解的理解
@RequestMapping 注解用来进行URL和方法的绑定。常用的选项有
value或者path:用来指定URL,默认选项
method:用来限定请求的方式
params:用来限定请求参数
上面的选项可以单独使用,也可以组合使用,组合使用时,必须同时满足才行。
此注解可以标注在方法上,也可以标注在类上,标注在类上代表类中的所有方法都可以共用一段URL。
8. 如何接收请求参数
接收基本类型参数:只需要保证前端传递的参数名称跟方法的形参名称一致就好。
接收对象类型参数:只需要保证前端传递的参数名称跟pojo的属性名称一致就好。
接收数组类型参数:只需要保证前端传递的参数名称跟方法中的数组形参名称一致就好。
接收集合类型参数:将前端传入的数据自动的封装成集合,需要将集合包装到一个对象中才行。
获取集合参数时,要将集合参数包装到一个实体中才可以。
List集合页面input标签name属性:集合属性名[索引].属性
Map集合页面input标签name属性:集合属性名[‘key’].属性
接收日期类型参数:SpringMVC默认只能封装yyyy/MM/dd格式的日期类型,其余格式需要自定义日期转换器。
9. 如何接收日期类型参数(自定义类型转换器)
(1)自定义一个类型转换器,实现类型转换的方法
public class StringToDateConverter implements Converter<String, Date> {
/**
* 日期转化
* 参数:source请求参数
* yyyy-MM-dd
* 返回值:处理之后的日期
*/
public Date convert(String source) {
Date date = null;
try {
date = new SimpleDateFormat("yyyy-MM-dd").parse(source);
}catch (Exception e) {
e.printStackTrace();
}
return date;
}
}
(2) 将自定义的类型转换注册到SpringMVC的转换服务中,然后再将服务注册到SpringMVC的注解驱动
<!--将自定义的类型转化器加入Springmvc的转化器集合中-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.itcast.converter.StringToDateConverter"></bean>
</set>
</property>
</bean>
<!--
配置springmvc的注解驱动
内置了处理器映射器和处理器适配器
-->
<!--注册到springmvc驱动中-->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
10. SpringMVC如何解决中文乱码问题
SpringMVC提供了一个中文乱码过滤器,我们只需要在web.xml
配置SpringMVC中中文乱码过滤器即可。
<!--在web.xml中配置过滤器,设置编码即可 CharacterEncodingFilter-->
<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>
11. SpringMVC如何实现文件上传
(1)加入文件上传的依赖坐标
(2)请求页面
<%--
上传文件三要素:
当前form表单必须为post
当前form表单类型必须为multipart/form-data
必须提供一个文件上传项<input type="file" name="fileParam"><br/>
--%>
<form action="${pageContext.request.contextPath}/mvc/fileUpload"
method="post" enctype="multipart/form-data">
上传一个文件:<input type="file" name="fileParam"><br/>
再传一个文件:<input type="file" name="fileParam"><br/>
<input type="submit" value="上传文件">
</form>
(3)编写控制器
通过SpringMVC提供 MultipartFile对象,表示上传的文件
//注意处理器参数必须和页面input中name属性一致
@RequestMapping("/fileUpload")
public String fileUpload(MultipartFile[] fileParam) throws IOException {
//指定上传文件的路径
File targetFile = new File("D:\\file");
for (MultipartFile multipartFile : fileParam) {
//指定上传文件名
String filename = UUID.randomUUID()+multipartFile.getOriginalFilename(); //把fileParam文件上传到targetFile文件下名字叫filename
multipartFile.transferTo(new File(targetFile, filename));
}
return "success";
}
12. @RequestParam注解的理解
@RequestParam标注在方法参数之前,用于对传入的参数做一些限制, 支持三个属性:
value:默认属性,用于指定前端传入的参数名称
required:用于指定此参数是否必传
defaultValue:当参数为非必传参数且前端没有传入参数时,指定一个默认值
13. 如何接收请求头
/**
* 在控制器中获取,当前请求的请求头
* 1、@RequestHeader配置到方法参数上 : 前端控制器自动获取头信息
* @RequestHeader Map map : 获取所有的请求头
* @RequestHeader("cookie") String cookie : 根据key从所有头信息中获取指定头信息
* 2、@CookieValue("key"):
* 从cookie中根据key获取指定value数据
*
*/
@RequestMapping(value="/demo")
public String demo(@RequestHeader Map map,
@RequestHeader("cookie") String cookie,
@CookieValue("JSESSIONID") String sessionId) {
System.out.println(map);
System.out.println(cookie);
System.out.println(sessionId);
return "success";
}
14. 如何获取Servlet原生API
Servlet原生API对象:HttpServletRequest,HttpSevletResponse,HttpSession
语法规则:
1、将对象以方法参数的形式配置到Controller方法中
2、将需要的API对象通过@Autowired的方式注入进来
@Autowired方式底层使用了ThreadLocal来保证每次请求不同的控制器方法使用的都是不同的对象,避免了线程安全问题。
15. SpringMVC中的携带数据请求转发
请求页面
<a href="${pageContext.request.contextPath}/demo/forwardMvcView">请求转发经过视图解析器</a><br/>
<a href="${pageContext.request.contextPath}/demo/forwardMvc">请求转发不经过视图解析器</a><br/>
<a href="${pageContext.request.contextPath}/demo/forwardOld">请求转发传统的方式</a><br/>
控制器
//请求转发经过视图解析器
@RequestMapping("/forwardMvcView")
public String forwardMvcView(){
return "success";
}
//forward:关键字后面的路径表示不再经过视图解析器
@RequestMapping("/forwardMvc")
public String forwardMvc(){
return "forward:/WEB-INF/pages/success.jsp";
}
//请求转发传统的方式 @RequestMapping("/forwardOld")
public void forwardOld(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
}
请求转发时携带数据
* 方式一:绑定到request域
* 1、将数据绑定到request域
* 2、在页面上通过EL表达式获取
* 方式二:通过Model对象
* * Model对象:底层是springmvc封装的request
* * 将Model对象配置到方法参数上
* 方式三:通过ModelAndView的返回值
* * Model:数据对象(响应数据)
* * View:视图(逻辑视图和物理视图)
* ModelAndView : 模型视图对象,通过此对象可以指定返回的视图地址和数据绑定
* 语法规则
* * 方法的返回值:ModelAndView
* * 在方法中通过ModelAndView的setViewName指定跳转的页面
* * 在方法中通过ModelAndView的addObject指定需要存入request域中的数据
16. SpringMVC中的重定向
请求页面
<a href="${pageContext.request.contextPath}/demo/redirectMvc">mvc方式的重定向</a><br/>
<a href="${pageContext.request.contextPath}/demo/redirectOld">传统方式的重定向</a><br/>
编写控制器
//注意:WEB-INF下的所有页面都必须经过请求转发,而不能直接访问。
//1、通过redirect:/重定向地址
@RequestMapping("/redirectMvc")
public String redirectMvc(){
//return "redirect:forwardMvcView";
return "redirect:/demo/forwardMvcView";
}
//2、使用ServletAPI对象
@RequestMapping("/redirectOld")
public void redirectOld(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.sendRedirect(request.getContextPath()+"/demo/forwardMvcView");
}
17. 如何释放静态资源
当有静态资源需要加载时,比如jquery.js,通过谷歌开发者工具抓包发现,没有加载到jquery.js。
之所以发生这种情况,是因为: 现在SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是 /(缺省),代表除了jsp请求不拦截, 其他的所有请求都会拦截,包括一些静态文件(js html css jpg等等), 而拦截住之后, 它又找不到对应的处理器方法来处理, 因此报错。
我们可以通过配置释放静态资源:(不交给SpringMVC处理)
(1)在SpringMVC的配置文件中添加释放静态资源(配置繁琐不推荐)
<!--
释放静态资源的方式一
mapping : 请求路径的URL的映射规则
location: 静态资源的物理目录
当静态资源请求到SpringMVC的前端控制器时,根据释放资源的配置
1、不再查找具体的controller处理
2、从location路径中查找匹配的资源
-->
<mvc:resources mapping="/js/*" location="/js/"></mvc:resources>
<mvc:resources mapping="/image/*" location="/image/"></mvc:resources>
<mvc:resources mapping="/css/*" location="/css/"></mvc:resources>
(2)在SpringMVC的配置文件中添加释放静态资源(推荐)
<!--
统一释放所有的静态资源文件
当SpringMVC处理静态资源时,委托给默认的Servlet处理
默认Servlet:tomcat中的默认Servlet
-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
(3)修改web.xml
中前端控制器的URL映射规则,以特殊字符串结尾的请求会交给前端控制器处理。
<!--
需要进入SpringMVC的所有请求,都需要以.do结尾
控制器方法中@RequestMapping不需要做额外的配置,和之前一模一样
-->
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
18. 如何使用Ajax+json实现异步交互
在SpringMVC中进行ajax的数据交互,需要通过两个注解简化开发。
@RequestBody : 自动的将请求的json字符串,转化为指定java对象(处理请求)
@ResponseBody:自动的将java对象,转化为json字符串并响应(处理响应)
注意: Springmvc默认用MappingJackson2HttpMessageConverter对json数据进行转换,需要加入jackson的坐标依赖。
19. 自定义异常处理器的两种方式
方式一:自定义一个类实现HandlerExceptionResolver接口,将异常处理器交给spring容器管理即可。
方式二:以通过@ControllerAdvice 和 @ExceptionHandler注解定义全局异常处理。
使用方式:
@ControllerAdvice:配置到java类
定义一个异常处理方法:
返回值String (视图)
参数:Model
方法上通过@ExceptionHandler配置(处理的异常类型)
20. 什么是拦截器
拦截器是SpringMVC提供的一种技术, 它的功能似于过滤器Filter,它会在进入Controller之前,离开Controller之后以及页面渲染完毕之后进行拦截。
21. 如何自定义拦截器
方式一:自定义一个类实现HandlerInterceptor接口,实现其中三个方法
- preHandle() : 在目标方法之前执行,一般用于预处理
- postHandle():在目标方法执行之后执行,一般用于后处理
- aterCompletion():整个请求处理完毕,在视图渲染完毕时回调,一般用于资源的清理或性能的统计
在SpringMVC的配置文件中,添加拦截器配置(配置拦截器对应需要拦截的URL和方法规则)
<!--配置SpringMVC的拦截器-->
<mvc:interceptors>
<!--配置具体的拦截器和拦截器的拦截规则-->
<mvc:interceptor>
<!--
mapping : 配置拦截规则
/** 表示拦截所有
请求 /hello/demo1
-->
<mvc:mapping path="/**"/>
<!--
exclude-mapping: 配置不拦截的规则
-->
<mvc:exclude-mapping path="/hello/demo2"/>
<!--创建对象:在当前拦截器中有效-->
<bean class="cn.itcast.interceptors.MyInterceptor01"></bean>
</mvc:interceptor>
</mvc:interceptors>
22. 如何自定义拦截器链
开发中拦截器可以单独使用,也可以同时使用多个拦截器形成一条拦截器链。
开发步骤和单个拦截器是一样的,只不过注册的时候注册多个,注册的顺序就代表拦截器执行的顺序。
23. 拦截器和过滤器的区别
过滤器是Servlet 规范中的一部分,任何java web工程都可以使用。
拦截器是SpringMVC框架的,只有使用了SpringMVC框架的工程才能用。
过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。
拦截器只会拦截访问的控制器方法,如果访问的是jsp,js,html,css,image等,它是不拦截的。
本文地址:https://blog.csdn.net/ggh0314/article/details/109581744