• SpringMVC请求、响应与异步请求



    上篇:SpringMVC的配置及概念

    SpringMVC核心架构的具体流程步骤

    • 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行 处理,作为统一访问点,进行全局的流程控制;
    • DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为 HandlerExecutionChain 对象(包含一 个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新 的映射策略;
    • DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器, 即适配器设计模式的应用,从而很容易支持很多类型的处理器;
    • HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处 理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
    • ModelAndView 的逻辑视图名——> ViewResolver,ViewResolver 将把逻辑视图名解析为具体的View,通过这种策 略模式,很容易更换其他视图技术;
    • View——>渲染,View 会根据传进来的Model 模型数据进行渲染,此处的Model 实际是一个Map 数据结构,因此 很容易支持其他视图技术;
    • 返回控制权给DispatcherServlet,由DispatcherServlet 返回响应给用户,到此一个流程结束。

    在这里插入图片描述

    一、SpringMVC请求与响应

    依赖

      <dependencies>
        <dependency>
          <groupId>javax.servletgroupId>
          <artifactId>javax.servlet-apiartifactId>
          <version>3.1.0version>
          <scope>providedscope>
        dependency>
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-webmvcartifactId>
          <version>5.2.10.RELEASEversion>
        dependency>
      dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    1、SpringMVC Handle原理与应用

    1.1 概念

    • Handler是一个Controller的对象和请求方式的组合的一个Object对象

    • HandleExcutionChains是HandleMapping返回的一个处理执行链,它是对Handle的二次封装,将拦截器关联到一起。然后,在DispatcherServlert中完成了拦截器链对handler的过滤。

    • DispatcherServlet要将一个请求交给哪个特定的Controller,它需要咨询一个Bean——这个Bean的名字为“HandlerMapping”。HandlerMapping是把一个URL指定到一个Controller上,(就像应用系统的web.xml文件使用将URL映射到servlet)。

    Handler 中文意思叫操作者,它的主要作用是用于处理映射。
    Controller 中文意思叫控制器,一般来说Controller就是一种Handler,但是并非所有Handler的都是Controller。通常我们Controller当中采用的映射处理策略是/或者是方法对应的HTTP客户端请求,这是基于请求的URL地址与HTTP方法来完成的,这种采用的就是我们上面概念提到的HandlerMapping的Bean来进行处理。

    1.2 Spring MVC Handler的三种写法

    • 1、Spring开发模式
      @RequestMapping("映射路径")
    
      public ModelAndView hello(){
    
        ModelAndView mv = new   ModelAndView();
    
        mv.addObject("msg","hello   world!");
    
        mv.setViewName("index.jsp");
    
        return mv;
    
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 2.原生Servlet开发方式
     @RequestMapping("映射路径")
    
      public void   xx(HttpServletRequest request,HttpServletResponse response) throws   ServletException, IOException{
    
        request.setAttribute("msg",   "操作成功");
    
        request.getRequestDispatcher("/index.jsp").forward(request,   response);
    
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 3.返回视图
     public String yy(Model model){
    
        model.addAttribute("msg",   "success");
    
        return   "forward:/index.jsp";//forward写不写都是转发,redirect代表重定向.
    
      }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    ① addObject(String attributeName, Object attributeValue)方法中的两个参数分别表示,第一个参数表示设置模型对象的名字,类似于我们声明变量的变量名一样,便于我们后期在页面获取模型对象,如果添加两次重名的模型对象,后者会覆盖前者的值。第二个参数表示具体模型对象的值,它可以是任何一种类型。
    ② addAll0bjects(Map modelMap)也是添加我们模型数据的方法,只不过它的参数是一个Map类型的集合
    ③ setView(String viewName)方法,参数填写一个视图的名称,如果我们没有配置视图解析器的话,默认是从WebApp/WebContent路径下面去寻找页面,如找不到页面则会出现404的错误。

    2、SpringMVC 视图解析器

    2.1 概念

    视图解析器的作用是将逻辑视图转为物理视图,所有的视图解析器都必须实现ViewResolver接口。

    SpringMVC为逻辑视图名的解析提供了不同的策略,可以在Spring WEB上下文中配置一种或多种解析策略,并指定他们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。程序员可以选择一种视图解析器或混用多种视图解析器。可以通过order属性指定解析器的优先顺序,order越小优先级越高,SpringMVC会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则抛出ServletException异常。

    2.2 配置视图解析器

    <bean    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property   name="prefix" value="/WEB-INF/jsp/">property>
            <property   name="suffix" value=".jsp">property>
     bean>
    
    • 1
    • 2
    • 3
    • 4
    • prefix:表示前缀,简而言之就是返回视图的时候,会在返回路径的前面加上前缀

    • suffix:表示后缀,与前缀同理,会在返回路径的后面加上后缀

    关于重定向,一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理,但如果返回的字符串中带forward:或redirect:前缀时,SpringMVC会对它们进行特殊处理:将forward: 和redirect: 当成指示符,其后的字符串作为URL 来处理。

    二、SpringMVC异步请求

    1、 Ajax基本配置

    Ajax本章节我们采用的JQuery给我们封装好的Ajax方法,所以第一步我们需要导入JQuery的库。在我们视图页面(JSP、HTML等)导入我们的JQuery的库。

    
    
    
    <script   src="jquery-1.10.2.min.js" >script>
    
    
    
    <script   src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2、 异步与同步

    • 同步:发送一个请求,等待返回,然后再发送下一个请求

    • 异步:发送一个请求,不等待返回,随时可以再发送下一个请求

    优缺点:

    • 同步:可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。

    • 异步:可以提高效率了,现在cpu都是双核,四核,异步处理的话可以同时做多项工作,当然必须保证是可以并发处理的。

    如何设置异步或者同步

    在我们JQuery的Ajax方法中,我们只需要设置一个属性就可以设置同步或者异步了。默认JQuery中Ajax是使用的是异步处理(即sync:true)。如需改成同步状态,需要在Ajax方法中放入sync:false。即可变成同步状态。

    3、局部刷新

    局部刷新是指无需重新加载整个网页的情况下,通过ajax的回调函数更新部分网页的技术。在JQuery中Ajax方法中可以在回调的success 或者error回调方法中对页面部分控件进行局部修改,达到局部刷新的目的。

  • 相关阅读:
    Ansible 指定受控端使用Python的版本
    【Java】基础简单好题好思路总结
    docker安装(持续更新中)
    SQL 杂谈 1
    【你问我答】Unity实现类似DNF地下城勇士的2D人物移动跳跃
    EMPU、EMCU与CPU的比较
    【方法】如何取消ZIP压缩包的密码?
    Cocos creator实现《滑雪趣挑战》滑雪小游戏资源及代码
    读《Linux内核设计与实现》我想到了这些书
    ComfyUI 完全入门:AI抠图/去除背景/更换图片背景/更换视频背景
  • 原文地址:https://blog.csdn.net/qq_54351538/article/details/127904168