概述
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。
SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。客户端发起请求,服务器端接收请求,执行逻辑并进行视图跳转。
执行流程
图示流程
详细流程
① 用户发送请求至前端控制器DispatcherServlet。
② DispatcherServlet收到请求调用HandlerMapping处理器映射器。
③ 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果
有则生成)一并返回给DispatcherServlet。
④ DispatcherServlet调用HandlerAdapter处理器适配器。
⑤ HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
⑥ Controller执行完成返回ModelAndView。
⑦ HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
⑧ DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
⑨ ViewReslover解析后返回具体View。
⑩ DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。DispatcherServlet响应用户。
相关组件
DispatcherServlet
前端控制器。用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet 是整个流程控制的中心,由
它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。
HandlerMapping
处理器映射器:HandlerMapping。HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
HandlerAdapter
处理器适配器:HandlerAdapter。通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
Handler
处理器:Handler。它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由
Handler 对具体的用户请求进行处理。
View Resolver
视图解析器:View Resolver。View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
View
视图:View。SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最
常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
基础知识
注解
@RequestMapping
作用 | 请求映射,将URL请求与JAVA方法绑定。 |
---|---|
位置 | 使用在类上,请求URL的第一级访问目录。若未定义,则默认访问web的根目录 |
使用在方法上,请求URI的第二级访问目录。与定义在类上的@ReqquestMapping标注的一级目录一起组成访问虚拟路径 |
参数 | 作用 |
---|---|
value | 指定请求参数名 |
method | 指定http请求方式 |
params | 用于指定限制请求参数的条件 |
代码示例
//请求URL:http://localhost:8080/request/test1?username=caofalin
@RequestMapping(value="/request",method = RequestMethod.GET)
public class requestController {
@RequestMapping(value="/test1")
@ResponseBody
public void test1(String username) throws IOException {
System.out.println(username);
}
}
@RequestParam
作用 | 参数绑定。当请求URL的参数名称与业务方法的形参名称不一致时,将请求URL中的参数名与业务方法的形参进行绑定 |
---|---|
位置 | 使用在方法的形参上 |
参数 | 作用 |
---|---|
value | 指定请求URL中的请求参数名 |
required | 此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错 |
defaultValue | 当没有指定请求参数时,则使用指定的默认值赋值 |
@PathVariable
作用 | RESTful风格请求参数绑定。将请求URL中的参数名与业务方法的形参进行绑定 |
---|---|
位置 | 使用在方法的形参上 |
参数 | 作用 |
---|---|
value | 指定请求URL中的请求参数名 |
required | 此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错 |
defaultValue | 当没有指定请求参数时,则使用指定的默认值赋值 |
代码示例
//请求URL:http://localhost:8080/request/test/caofalin
@RequestMapping("/request")
public class requestController {
@RequestMapping(value="/test/{name}")
@ResponseBody
public void test(@PathVariable(value="name",required=false,defaultValue="caofalin") String username) throws IOException {
System.out.println(username);
}
}
@RequestHeader
作用 | 获取HTTP请求数据包的HttpHeader信息 |
---|---|
位置 | 使用在方法的形参上 |
参数 | 作用 |
---|---|
value | 设置需要获取的http请求头信息的key值 |
required | 此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错 |
代码示例
//请求URL:http://localhost:8080/request/test
@RequestMapping("/request")
public class requestController {
@RequestMapping(value="/test")
@ResponseBody
public void test(@RequestHeader(value = "User-Agent",required = false) String user_agent) throws IOException {
System.out.println(user_agent);
}
}
@CookieValue
作用 | 获得指定Cookie的值 |
---|---|
位置 | 使用在方法的形参上 |
参数 | 作用 |
---|---|
value | 指定cookie的名称 |
required | 此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错 |
代码示例
//请求URL:http://localhost:8080/request/test
@RequestMapping("/request")
public class requestController {
@RequestMapping(value="/test")
@ResponseBody
public void test(@CookieValue(value = "JSESSIONID") String jsessionId) throws IOException {
System.out.println(jsessionId);
}
@ResponseBody
作用 | 指定数据响应的方式为非页面跳转,根据业务方法的返回值类型返回数据 |
---|---|
位置 | 使用在方法上 |
代码示例
//请求URL:http://localhost:8080/request/test
@RequestMapping(value="/request",method = RequestMethod.GET)
public class requestController {
@RequestMapping(value="/test")
@ResponseBody
public String test() {
return "return string";//直接返回字符串
}
}
数据响应
数据响应方式
1) 页面跳转
直接返回字符串
通过ModelAndView对象返回
2) 回写数据
直接返回字符串
返回对象或集合
响应数据的处理
字符串转json格式
数据请求
接收参数类型
基本类型参数
POJO类型参数
数组类型参数
集合类型参数
RESTful风格
中文数据乱码
当post请求时,数据会出现乱码,需要在web.xml中设置一个过滤器来进行编码的过滤
<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>
自定义数据类型转换
自定义类型转换器
SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
• 但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自
定义转换器。
自定义类型转换器的开发步骤:
① 定义转换器类实现Converter接口
② 在配置文件中声明转换器
③ 在
获得Servlet相关API
SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:
HttpServletRequest
HttpServletResponse
HttpSession
代码示例
//请求URL:http://localhost:8080/request/test
@RequestMapping("/request")
public class requestController {
@RequestMapping(value="/test")
@ResponseBody
public void test(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
System.out.println(request);
System.out.println(response);
System.out.println(session);
}
}
文件上传
- 文件上传客户端三要素
表单项type=“file”
表单的提交方式是post
表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data”
单文件上传步骤
① 导入fileupload和io坐标
② 配置文件上传解析器
③ 编写文件上传代码
基于配置文件开发
实现思路(待完善)
① 导入SpringMVC相关坐标
② 配置SpringMVC核心控制器DispathcerServlet
③ 创建Controller类和视图页面
④ 使用注解配置Controller类中业务方法的映射地址
⑤ 配置SpringMVC核心文件 spring-mvc.xml
⑥ 客户端发起请求测试
基于注解开发
实现思路(待完善)
拦截器
异常处理
简单异常处理器
SimpleMappingExceptionResolver
自定义异常处理器
标签:请求,SpringMVC,request,value,参数,视图,test From: https://www.cnblogs.com/pacemrc/p/17578188.html