SpringMVC


MVC 模式

MVC 是软件工程一种软件架构模式,分离业务逻辑与显示界面的开发思想 1. M(model) 处理业务逻辑,封装实体 2.V(view) 视图,展示内容 3.C(controller)控制器,负责调度分发(1.接受请求,2.调用模型,3,转发视图)

SpringMVC

是封装了原来Servlet 中的共有行为,例如:参数封装,视图转发等,一种实现MVC设计模式的轻量级Web框架,通过注解,让简单 的java类成为处理请求的控制器无需实现任何接口,支持restful 编程风格的请求

/和/*的区别

/ 只能获取到类似/login ,/* 带后缀的都能获取

spring mvc 执行流程

  1. 链接先发到 tomcat,tomcat 接受到请求后,链接请求解析资源地址 dispatcher
  2. 创建请求对象request
  3. 创建相应对象reponse
  4. 调用目标资源

用户发送请求至前端控制器 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 组件解析

  1. 前端控制器:DispatcherServlet 用户请求到达前端控制器,相当于MVC 模式中C,DispatcherServlet 是整个流程控制的中心,由它调用其他组件处理用户的请求,pDisatcherServlet的存在降低了组件之间的耦合性。
  2. 处理器映射器:HandlerMapping HandlerMapping 负责根据用户请求找到Handler 处理器,SpringMVC提供了不同的映射器实现不同的映射方式如:配置文件方式,实现接口方式,注解方式
  3. 处理器适配器:HandlerAdapter 通过HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多的类型处理器进行执行。
  4. 处理器 Handler 具体的业务控制器开发,由DispatcherServlet把用户请求转发到Handler 由Handler对具体用户请求进行处理。
  5. 视图解析器 ViewResolver View Resolver 负责将处理结果生成View 视图,View Resolver 首先根据逻辑视图解析成物理视图名,获取具体的页面地址,再生成view视图对象,最后对view进行渲染将处理结果通过页面展示给用户。
  6. 视图 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 响应

页面跳转

  1. 返回字符串逻辑视图
  2. void原始ServletAPI
  3. ModelAndView

返回数据

  1. 直接返回字符串数据
  2. 将对象或集合转为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

文件上传

文件上传三要素

  1. 表单项 type="file"
  2. 表单提交方式 method="post"
  3. 表单enctype 属性是多部分表单形式enctype="multipart/form-data"

文件上传原理

  1. form 表单改为多部分表单时,request.getParameter()将失效。
  2. form 的enctype 取值为application/x-www-form-urlencoded 时,form 表单的正文内容格式是name=value&name=value
  3. form 的enctype 取值为mutilpart/form-data时,请求正文内容变成多部分形式。

单文件上传

配置文件上传解析器 XML 配置

异常处理

异常处理的思路

在java 中,对于异常的处理有两种方式 1. 在当前方法中捕获处理(try-catch) 这种处理方式会造成业务代码和异常代码的耦合 2. 自己不处理,抛给调用者处理,调用者再抛给他的调用者处理

拦截器

拦截器的作用:类似与servlet 开发中的过滤器filter,用于对处理器进行预处理和后处理,将拦截器按一定的顺序链接成一条链,成为拦截器链 在访问拦截的方法或者字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用,拦截器也是AOP思想的具体实现

拦截器和过滤器的区别

适用范围: 过滤器是servlet 规范中的额一部分,拦截器是springmvc 框架自己的,只有使用了springmvc 才能使用 拦截范围: url-pattern 中配置了/* 后,过滤器可以对所有要访问的资源拦截,拦截器只会拦截访问的控制器方法,