springmvc使用概览

springmvc简介

1 体系架构

  1. 表现层
    表现层即web 层,包括展示层和控制层:控制层负责接收请求,展示层负责结果的展示。依赖业务层
  2. 业务层
    service层,负责业务逻辑处理,依赖持久层
  3. 持久层
    dao层,负责数据持久化

2 设计思想

  1. Model 模型
    模型包含业务模型和数据模型,数据模型用于封装数据,业务模型用于处理业务。
  2. View 视图
    通常指的就是我们的 jsp 或者 html。作用一般就是展示数据的。通常视图是依据 模型数据创建的。
  3. Controller 控制器
    是应用程序中处理用户交互的部分。作用一般就是处理程序逻辑的

3 开发流程

  1. 配置DispatcherServlet前端控制器
  2. 开发处理具体业务逻辑的Handler(@Controller、@RequestMapping)
  3. xml配置文件配置controller扫描,配置springmvc三大件
  4. 将xml文件路径告诉springmvc(DispatcherServlet)

4 请求处理流程

在这里插入图片描述

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器
  3. 处理器映射器根据请求Url找到具体的Handler(后端控制器),生成处理器对象及处理器拦截 器(如果 有则生成)一并返回
  4. DispatcherServlet调用HandlerAdapter处理器适配器去调用Handler
  5. 处理器适配器执行Handler
  6. Handler执行完成给处理器适配器返回ModelAndView
  7. 处理器适配器向前端控制器返回 ModelAndView,ModelAndView 是SpringMVC 框架的一个 底层对 象,包括 Model 和 View
  8. 前端控制器请求视图解析器去进行视图解析,根据逻辑视图名来解析真正的视图
  9. 视图解析器向前端控制器返回View
  10. 前端控制器进行视图渲染,就是将模型数据(在 ModelAndView 对象中)填充到 request 域
  11. 前端控制器向用户响应结果

5 九大组件

  1. HandlerMapping(处理器映射器)
    HandlerMapping 是用来查找 Handler 的,也就是处理器,具体的表现形式可以是类,也可以是 方法。比如,标注了@RequestMapping的每个方法都可以看成是一个Handler。Handler负责具 体实际的请求处理,在请求到达后,HandlerMapping 的作用便是找到请求相应的处理器 Handler 和 Interceptor.
  1. HandlerAdapter(处理器适配器)
    HandlerAdapter 是一个适配器。因为 Spring MVC 中 Handler 可以是任意形式的,只要能处理请 求即可。但是把请求交给 Servlet 的时候,由于 Servlet 的方法结构都是 doService(HttpServletRequest req,HttpServletResponse resp)形式的,要让固定的 Servlet 处理 方法调用 Handler 来进行处理,便是 HandlerAdapter 的职责。
  2. HandlerExceptionResolver(异常解析器)
    HandlerExceptionResolver 用于处理 Handler 产生的异常情况。它的作用是根据异常设置
    ModelAndView,之后交给渲染方法进行渲染,渲染方法会将 ModelAndView 渲染成⻚面。
  3. ViewResolver(视图解析器)
    ViewResolver即视图解析器,用于将String类型的视图名和Locale解析为View类型的视图,只有一 个resolveViewName()方法。从方法的定义可以看出,Controller层返回的String类型视图名 viewName 最终会在这里被解析成为View。View是用来渲染⻚面的,也就是说,它会将程序返回 的参数和数据填入模板中,生成html文件。ViewResolver 在这个过程主要完成两件事情: ViewResolver 找到渲染所用的模板(第一件大事)和所用的技术(第二件大事,其实也就是找到 视图的类型,如JSP)并填入参数。默认情况下,Spring MVC会自动为我们配置一个 InternalResourceViewResolver,是针对 JSP 类型视图的。
  4. RequestToViewNameTranslator(视图名称转换器)
    RequestToViewNameTranslator 组件的作用是从请求中获取 ViewName.因为 ViewResolver 根据 ViewName 查找 View,但有的 Handler 处理完成之后,没有设置 View,也没有设置 ViewName, 便要通过这个组件从请求中查找 ViewName。
  5. LocaleResolver(国际化处理器)
    ViewResolver 组件的 resolveViewName 方法需要两个参数,一个是视图名,一个是 Locale。 LocaleResolver 用于从请求中解析出 Locale,比如中国 Locale 是 zh-CN,用来表示一个区域。这 个组件也是 i18n 的基础。
  6. ThemeResolver(主题处理器)
    ThemeResolver 组件是用来解析主题的。主题是样式、图片及它们所形成的显示效果的集合。 Spring MVC 中一套主题对应一个 properties文件,里面存放着与当前主题相关的所有资源,如图 片、CSS样式等。创建主题非常简单,只需准备好资源,然后新建一个“主题名.properties”并将资 源设置进去,放在classpath下,之后便可以在⻚面中使用了。SpringMVC中与主题相关的类有 ThemeResolver、ThemeSource和Theme。ThemeResolver负责从请求中解析出主题名, ThemeSource根据主题名找到具体的主题,其抽象也就是Theme,可以通过Theme来获取主题和 具体的资源。
  7. MultipartResolver(上传文件)
    MultipartResolver 用于上传请求,通过将普通的请求包装成 MultipartHttpServletRequest 来实 现。MultipartHttpServletRequest 可以通过 getFile() 方法 直接获得文件。如果上传多个文件,还 可以调用 getFileMap()方法得到Map<FileName,File>这样的结构,MultipartResolver 的作用就 是封装普通的请求,使其拥有文件上传的功能。
  8. FlashMapManager(重定向)
    FlashMap 用于重定向时的参数传递,比如在处理用户订单时候,为了避免重复提交,可以处理完 post请求之后重定向到一个get请求,这个get请求可以用来显示订单详情之类的信息。这样做虽然 可以规避用户重新提交订单的问题,但是在这个⻚面上要显示订单的信息,这些数据从哪里来获得 呢?因为重定向时么有传递参数这一功能的,如果不想把参数写进URL(不推荐),那么就可以通 过FlashMap来传递。只需要在重定向之前将要传递的数据写入请求(可以通过ServletRequestAttributes.getRequest()方法获得)的属性OUTPUT_FLASH_MAP_ATTRIBUTE 中,这样在重定向之后的Handler中Spring就会自动将其设置到Model中,在显示订单信息的⻚面 上就可以直接从Model中获取数据。FlashMapManager 就是用来管理 FalshMap 的。

6 参数绑定

  1. 默认支持 Servlet API 作为方法参数
    当需要使用HttpServletRequest、HttpServletResponse、HttpSession等原生servlet对象时,直 接在handler方法中形参声明使用即可。
public ModelAndView handle02(HttpServletRequest request, HttpServletResponse response,HttpSession session) {
        String id = request.getParameter("id");
        Date date = new Date();
        ModelAndView modelAndView = new ModelAndView(); 
        modelAndView.addObject("date",date); 
        modelAndView.setViewName("success");
        return modelAndView;
    }
  1. 绑定简单类型参数
    简单数据类型:八种基本数据类型及其包装类型 参数类型推荐使用包装数据类型,因为基础数据类型不可以为null 整型:Integer、int
    字符串:String
    单精度:Float、float
    双精度:Double、double
    布尔型:Boolean、boolean 说明:对于布尔类型的参数,请求的参数值为true或false。或者1或0
    注意:绑定简单数据类型参数,只需要直接声明形参即可(形参参数名和传递的参数名要保持一 致,建议 使用包装类型,当形参参数名和传递参数名不一致时可以使用@RequestParam注解进行 手动映射)
@RequestMapping("/handle03")
    public ModelAndView handle03(@RequestParam("ids") Integer id,Boolean flag) {
        Date date = new Date();
        ModelAndView modelAndView = new ModelAndView(); 
        modelAndView.addObject("date",date); 
        modelAndView.setViewName("success");
        return modelAndView;
    }
  1. 绑定Pojo类型参数
    接收pojo类型参数,直接形参声明即可,类型就是Pojo的类型,形参名无所谓,但是要求传递的参数名必须和Pojo的属性名保持一致
@RequestMapping("/handle04")
    public ModelAndView handle04(User user) {
        Date date = new Date();ModelAndView modelAndView = new ModelAndView(); 
        modelAndView.addObject("date",date); 
        modelAndView.setViewName("success");
        return modelAndView;
    }
  1. 绑定Pojo包装对象参数
    url:/demo/handle05?user.id=1&user.username=zhangsan
    不管包装Pojo与否,它首先是一个pojo,那么就可以按照上述pojo的要求来,绑定时候直接形参声明即可
    传参参数名和pojo属性保持一致,如果不能够定位数据项,那么通过属性名 + “.” 的方式进一步锁定数据
public class QueryVo {
        private String mail;
        private String phone; // 嵌套了另外的Pojo对象
        private User user;
    }
    
@RequestMapping("/handle05")
    public ModelAndView handle05(QueryVo queryVo) {
        Date date = new Date();
        ModelAndView modelAndView = new ModelAndView(); 
        modelAndView.addObject("date",date); 
        modelAndView.setViewName("success");
        return modelAndView;
    }
  1. 绑定日期类型参数
    定义一个SpringMVC的类型转换器接口,扩展实现接口接口,注册你的实现
@RequestMapping("/handle06")
    public ModelAndView handle06(Date birthday) {
        Date date = new Date();
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("date",date);
        modelAndView.setViewName("success");
        return modelAndView;
    }
    //自定义类型转换器
   public class DateConverter implements Converter<String, Date> {
       @Override
       public Date convert(String source) {
           // 完成字符串向日期的转换
           SimpleDateFormat simpleDateFormat = new
                   SimpleDateFormat("yyyy-MM-dd");
           try {
               Date parse = simpleDateFormat.parse(source); return parse;
           } catch (ParseException e) { e.printStackTrace();
           }
           return null;
       }
   }

在这里插入图片描述

7 Restful风格请求支持

Restful 是一种 web 软件架构⻛格,它不是标准也不是协议,它倡导的是一个资源定位及资源操作的⻛格。

什么是 REST

REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统, 比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之 一。在目前主流的三种 Web 服务交互方案中,REST 相比于 SOAP(Simple Object Access protocol, 简单对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像 是一种设计的⻛格。
它本身并没有什么实用性,其核心价值在于如何设计出符合 REST ⻛格的网络接口。

Restful 的优点

它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

Restful 的特性

资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。
它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个 URI(统 一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。
表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。比 如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进 制格式。
状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。
HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务 器, 必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层 之上的,所以就是 “ 表现层状态转化” 。具体说, 就是 HTTP 协议里面,四个表示操作方式的动词: GET 、POST 、PUT 、DELETE 。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资 源,PUT 用来更新资源,DELETE 用来删除资源。

RESTful 的示例:
  1. 非rest风格: http://localhost:8080/user/queryUserById.action?id=3
  2. rest⻛格: http://localhost:8080/user/3
  1. rest中,认为互联网中的所有东⻄都是资源,既然是资源就会有一个唯一的uri标识它,代表它
  2. url中定义了动作(操作),参数具体锁定到操作的是谁
  3. 常规操作就是增删改查, 根据请求方式不同,代表要做不同的操作
    get 查询,获取资源
    post 增加,新建资源
    put 更新
    delete 删除资源
    rest⻛格带来的直观体现:就是传递参数方式的变化,参数可以在uri中了
    /account/1 HTTP GET :得到 id = 1 的 account
    /account/1 HTTP DELETE:删除 id = 1 的 account
    /account/1 HTTP PUT:更新 id = 1 的 account
    URL:资源定位符,通过URL地址去定位互联网中的资源(抽象的概念,比如图片、视频、app服务 等)。
mvc如何支持Resultful
  1. Spring MVC 支持 RESTful ⻛格请求,具体讲的就是使用 @PathVariable 注解获取 RESTful ⻛格的请求URL中的路径变量。
  2. web.xml中配置请求方式过滤器(将特定的post请求转换为put和delete请求)
    在这里插入图片描述

8 Ajax Json交互

  1. 前端到后台:前端ajax发送json格式字符串,后台直接接收为pojo参数,使用注解@RequstBody
  2. 后台到前端:后台直接返回pojo对象,前端直接接收为json对象或者字符串,使用注解 @ResponseBody
什么是 Json

Json是一种与语言无关的数据交互格式,就是一种字符串,只是用特殊符号{}内表示对象、[]内表示数组、""内是属性或值、:表示后者是前者的值
{“name”: “Michael”}可以理解为是一个包含name为Michael的对象 [{“name”: “Michael”},{“name”: “Jerry”}]就表示包含两个对象的数组

@ResponseBody注解

@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之 后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。 注意:在使用此注解之 后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定 格式的数据。

    @RequestMapping("/handle07")
    @ResponseBody
    public  User handle07(@RequestBody User user) {
        // 业务逻辑处理
        return user;
    }

9 高级技术

Servlet

处理Request请求和Response响应

监听器

实现了javax.servlet.ServletContextListener 接口的服务器端组件,它随 Web应用的启动而启动,只初始化一次,然后会一直运行监视,随Web应用的停止而销毁,主要有以下作用

  1. 做一些初始化工作,web应用中spring容器启动ContextLoaderListener
  2. 监听web中的特定事件,比如HttpSession,ServletRequest的创建和销毁;变量的创建、 销毁和修改等。可以在某些动作前后增加处理,实现监控,比如统计在线人数,利用
过滤器

对Request请求起到过滤的作用,作用在Servlet之前,如果配置为/*可以对所 有的资源访问(servlet、js/css静态资源等)进行过滤处理

拦截器

是SpringMVC、Struts等表现层框架自己的,不会拦截 jsp/html/css/image的访问等,只会拦截访问的控制器方法(Handler)。
从配置的⻆度看:serlvet、filter、listener是配置在web.xml中的,而interceptor是 配置在表现层框架自己的配置文件中的
拦截器执行流程

  1. 在Handler业务逻辑执行之前拦截一次
  2. 在Handler逻辑执行完毕但未跳转⻚面之前拦截一次
  3. 在跳转⻚面之后拦截一次

在这里插入图片描述

单个拦截器的执行流程
  1. 程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方 法,否则将不再向下执行。
  2. 在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过 DispatcherServlet向客户端返回响应。
  3. 在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。
多个拦截器的执行流程

当有多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置 顺序执行,而它们的postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行
在这里插入图片描述

拦截器配置

在这里插入图片描述

文件上传

  1. 依赖jar包
    在这里插入图片描述
  2. 配置文件上传解析器
    在这里插入图片描述
  3. 前端格式
    在这里插入图片描述
  4. 后端接收
    在这里插入图片描述

全局异常处理

在这里插入图片描述

基于Flash属性的跨重定向请求数据传递

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值