MVC 模式
MVC 是软件工程一种软件架构模式,分离业务逻辑与显示界面的开发思想 1. M(model) 处理业务逻辑,封装实体 2.V(view) 视图,展示内容 3.C(controller)控制器,负责调度分发(1.接受请求,2.调用模型,3,转发视图)
SpringMVC
是封装了原来Servlet 中的共有行为,例如:参数封装,视图转发等,一种实现MVC设计模式的轻量级Web框架,通过注解,让简单 的java类成为处理请求的控制器无需实现任何接口,支持restful 编程风格的请求
/和/*的区别
/ 只能获取到类似/login ,/* 带后缀的都能获取
spring mvc 执行流程
- 链接先发到 tomcat,tomcat 接受到请求后,链接请求解析资源地址 dispatcher
- 创建请求对象request
- 创建相应对象reponse
- 调用目标资源
用户发送请求至前端控制器 dispatcherServlet.
dispatcherServlet 收到请求调用HandlerMapping 处理器映射
处理器映射器找到具体的处理器(可以根据xml,注解进行查找)生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet.
DispatcherServlet 调用Handler Adapter 处理器适配器
HandlerAdapter 经过适配调用具体的处理器(Controller)
Controller 执行完成返回ModelAndView
HandlerAdapter 将controller 执行结果ModelAndView 返回给DispatcherServlet
DispatcherServlet 将ModelAndView 传给 viewReslover 视图解析器
ViewReslover 解析后返回具体View
DispatcherServlet 根据View进行渲染视图(将模型数据填充到视图中)
DispatcherServlet 将渲染后的视图响应响应用户
SpringMVC 组件解析
- 前端控制器:DispatcherServlet 用户请求到达前端控制器,相当于MVC 模式中C,DispatcherServlet 是整个流程控制的中心,由它调用其他组件处理用户的请求,pDisatcherServlet的存在降低了组件之间的耦合性。
- 处理器映射器: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,需要通过页面标签或页面模板技术,将模型数据通过页面展示给用户。
SpringMVC注解解析
@Controller
SpringMVC 基于Spring容器,所以在进行SpringMVC 操作时,需要将controller存储到 Spring容器,如果需要使用,需要在xml 配合 context:component-scan
@RequestMapping
作用:用于建立请求 URL和处理请求方法之间的对应关系
位置:
1. 类上,请求 URL的第一级访问目录,如果不写,相当于应用的根目录,写的话需要/开头
2. 方法上: 请求 URL的第二级访问目录,和一级目录组成一个完整的URL路径。
属性:
1. value 用于指定请求的URL 和path属性的作用一样
2. method 限定请求的方式
3.params,限定请求参数的条件
SpringMVC 请求
1.请求参数类型:基本类型,对象类型,数组类型,集合类型
获取基本类型参数
Controller 业务方法的参数名称要和请求参数的name一致,参数值会自动映射匹配,并且能自动做类型转化,
SpringMVC 响应
页面跳转
- 返回字符串逻辑视图
- void原始ServletAPI
- ModelAndView
返回数据
- 直接返回字符串数据
- 将对象或集合转为json 返回
void 原始ServletAPI
我们可以通过 request , response对象实现相应
@RequestMapping("/returnVoid")
public void returnVoid(HttpServletRequest request,HttpServletResponse response) throws Exception {
//通过response 直接响应
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("hrqing");
request.setAttribute("username","hrqing");
//通过request实现转发
request.getRequestDispatcher("url").forward(request,response);
//通过response 实现重定向
response.sendRedirect(request.getContextPath()+"/index.jsp");
//通过forward 关键字转发
return "forward:/url";
//通过forward 关键字转发,本质底层使用的还是request.setAttribute("username","sss");域范围:一次请求
return "redirect:/index.jsp";
}
当写了redirect 或者 forward 关键字,是不会再走视图解析器
@SessionAttributes
如果在多个请求之前共用数据,可以在控制器类上标注一个@SessionAttributes配置需要再session中存放的数据范围,SpringMVC 将存在model中对应的数据暂存在HttpSession中 @SessionAttributes 只能定义在类上
静态资源访问的开启
springmvc 前端控制器dispatcherServlet 的url-pattern 配置的是/ 代表对所有静态资源都进行处理操作,这样就不会执行tomcat内置defaultServlet处理,两种方式放行
方式一 springmvc 配置文件
<mvc:resources mapping="/js/**" location="/js/"/>
方式二
<mvc:default-servlet-handler/>
@RequestBody
该注解用于controller 方法的形参声明,当使用ajax 提交并指定contentType 为 json形式时,通过HttpMessageConverter 接口转换为对应的POJO 对象。
@ResponseBody
该注解用于controller方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如: json ,xml 通过response响应给客户端。
RESTFUL
什么restful
Restful是一种软件架构风格,设计风格,不是标准,只是提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件,基于这种风格设计的软件可以更简洁,更有层次,更易于实现缓存机制。
Restful 请求是url+请求方式,表示一次请求目的,http 协议里面4个标识操作方法
1. GET 2.POST 3. PUT 4.delete
@PathVariable
用来接收restful风格请求地址中占位符的值
@RestController
restful 风格多用于前后端分离项目开发,前端通过ajax 与服务器进行异步交互,通常返回的json数据所以用@RestController 来代替@Controller 和@ResponseBody
文件上传
文件上传三要素
- 表单项 type="file"
- 表单提交方式 method="post"
- 表单enctype 属性是多部分表单形式enctype="multipart/form-data"
文件上传原理
- form 表单改为多部分表单时,request.getParameter()将失效。
- form 的enctype 取值为application/x-www-form-urlencoded 时,form 表单的正文内容格式是name=value&name=value
- form 的enctype 取值为mutilpart/form-data时,请求正文内容变成多部分形式。
单文件上传
配置文件上传解析器 XML 配置
异常处理
异常处理的思路
在java 中,对于异常的处理有两种方式 1. 在当前方法中捕获处理(try-catch) 这种处理方式会造成业务代码和异常代码的耦合 2. 自己不处理,抛给调用者处理,调用者再抛给他的调用者处理
拦截器
拦截器的作用:类似与servlet 开发中的过滤器filter,用于对处理器进行预处理和后处理,将拦截器按一定的顺序链接成一条链,成为拦截器链 在访问拦截的方法或者字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用,拦截器也是AOP思想的具体实现
拦截器和过滤器的区别
适用范围: 过滤器是servlet 规范中的额一部分,拦截器是springmvc 框架自己的,只有使用了springmvc 才能使用 拦截范围: url-pattern 中配置了/* 后,过滤器可以对所有要访问的资源拦截,拦截器只会拦截访问的控制器方法,