Spring学习笔记-第八天:SpringMVC的组件解析:MVC执行流程/组件解析/注解解析/配置解析;SpringMVC的数据响应:页面跳转/回写数据

三、SpringMVC的组件解析

1.SpringMVC的执行流程

  1. 浏览器发送请求到前端控制器:DispatcherSevlet
  2. 前端控制器发送 请求查询Handler 到处理器映射器:HandlerMapping,其负责把请求进行解析,知道找谁。
  3. 处理器映射器(通过xml配置、注解进行查找找到具体的处理器)可以返回一串资源的地址:有可能执行目标Servlet之前经过很多资源。因此返回给前端控制器-处理器执行链:HandlerExceptionChain
  4. 前端控制器发送 请求执行Handler 到 处理器适配器:HandleAdaptor,负责执行调度那些需要执行的资源
  5. 处理器适配器发送请求到处理器Handler,即钓鱼具体的处理器(Controller,也叫后端控制器)
  6. 处理器Handler(对应的Controller)处理后发送响应(modle&view)给处理器适配器(HandlerAdaptor)
  7. 处理器适配器(HandlerAdaptor)将模型和对象返回给前端控制器(DispatcherServlet)
  8. 前端控制器(DispatcherServlet)受到model&view后返回视图View对象给视图解析器(ViewResolver)
  9. 视图解析器(ViewResolver)返回视图View对象给前端控制器(DispatcherServlet)
  10. 前端控制器(DispatcherServlet)渲染视图到视图界面jsp
  11. 最后前端控制器(DispatcherServlet)响应给浏览器

2.SpringMVC的组件解析

  1. 前端控制器:DispatcherServlet
    用户请求到达前端控制器,它就相当于 MVC 模式中的 C,DispatcherServlet 是整个流程控制的中心,由
    它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。

  2. 处理器映射器:HandlerMapping
    HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的
    映射方式,例如:配置文件方式,实现接口方式,注解方式等。

  3. 处理器适配器:HandlerAdapter
    通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理
    器进行执行。

  4. 处理器:Handler
    它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由
    Handler 对具体的用户请求进行处理。

  5. 视图解析器:View Resolver
    View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。

  6. 视图:View
    SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面

3.SpringMVC注解解析

  • @RequestMapping 用于建立请求URL和处理请求方法之间的对应关系

    位置:

    • 类上:请求URL的第一级访问目录,会和方法上的拼接成方法的访问地址,可以由此区分模块
    
    @Controller
    @RequestMapping("/user")
    public class UserController {
        //请求地址: http://localhost:8080/user/quick
        @RequestMapping("/quick")//请求映射,当访问到quick时,返回success.jsp
        public String save(){
            System.out.println("Controller save running...");
            return "success.jsp";
        }
    }
    
    

    但注意此刻返回的success.jsp也会自动在路径前加入user,所以会出现访问失败的错误
    解决方法:return "/success.jsp"; 即在.jsp文件前加“/”,代表从web路径上查找

    • 方法上:请求URL的第二级访问目录,与类上的一级目录一起组成访问虚拟路径

    属性:

    • value:用于指定请求的URL,和path的作用是一样的
    • method:用于指定请求的方式,默认是get方式,若是post,则指当前访问quick,请求方式必须Post方式才能访问到
    • params:用于指定限制请求参数的条件。它支持简单的表达式,要求请求参数的key和value必须和配置的一样。
      params={"accountName"},表示请求参数中必须有accountName
      params={"money!100"},表示请求参数中money不能是100
    @RequestMapping(value = "/quick",method = RequestMethod.GET,params = {"username"})//请求映射,当访问到quick时,返回success.jsp
    

同时需要设置组件扫描等,见之前
组件扫描的另一种写法:

    <context:component-scan base-package="com.itheima">
<!--        只扫描com.itheima下的Controller注解-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

来设置只扫描某种注解或不扫描某种注解

4.SpringMVC的XML配置解析

当前配置了组件扫描,除此之外还能配置组件。

<!--    手动配置内部资源视图解析器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--        /jsp/success.jsp-->
        <property name="prefix" value="/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

5.知识要点:

SpringMVC的相关组件

  • 前端控制器:DispatcherServlet
  • 处理器映射器:HandlerMapping
  • 处理器适配器:HandlerAdapter
  • 处理器:Handler
  • 视图解析器:View Resolver
  • 视图:View

SpringMVC的注解和配置

  • 请求映射注解:@RequestMapping

  • 视图解析器配置:

    REDIRECT_URL_PREFIX = "redirect:"
    FORWARD_URL_PREFIX = "forward:"
    prefix = "";
    suffix = "";

四、SpringMVC的数据响应

1.SpringMVC的数据响应方式

  1. 页面跳转

    • 直接返回字符串
    • 通过Model&View对象返回
  2. 回写数据

    • 直接返回字符串
    • 返回对象或集合

2.页面跳转

  1. 返回字符串形式
    此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转,即前面快速入门时的配置
    注意:重定向(redirect)会直接访问.jsp,但WEB-INF文件夹中是受保护的,所以会有差异
  2. 返回ModelAndView对象
    返回值是ModelAndView,通过add函数和set函数设置模型和视图,并进行返回,前端通过EL表达式进行读取
    public ModelAndView save2(){
        System.out.println("Controller2 save running...");
        /*
        * Model:模型 作用封装数据
        * View:视图 作用展示数据
        * */
        ModelAndView modelAndView = new ModelAndView();
        //设置模型数据
        modelAndView.addObject("username","itcast");
        //设置视图名称
        modelAndView.setViewName("success");
        return modelAndView;
    }

同时,可以把M&V当做参数传输进去并设置内部参数,SpringMVC对相应方法的参数可以进行相关的注入

    @RequestMapping(value = "/quick3")//请求映射,当访问到quick时,返回success.jsp
    public ModelAndView save3(ModelAndView modelAndView){
        modelAndView.addObject("username","itheima");
        //设置视图名称
        modelAndView.setViewName("success");
        return modelAndView;
    }

内部的方法也可以把Model和View拆开,实现添加和修改的操作
注意对Model是setAttribute方法,M&V是add方法

    @RequestMapping(value = "/quick4")//请求映射,当访问到quick时,返回success.jsp
    public String save4(Model model){
        model.addAttribute("username","zhangsan");
        return "success";
    }

还可以用原始的方式向域中存储数据,通过request向前台提供数据

    @RequestMapping(value = "/quick5")
    public String save5(HttpServletRequest request){
        request.setAttribute("username","haixuan");
        return "success";
    }

3.回写数据

1. 回写字符串
  1. Web基础阶段,客户端访问服务器端,如果想直接回写字符串作为响应体返回的话,只需要使用response.getWriter().print("")即可。
    若想在Controller中直接回写字符串:
    通过SpringMVC框架注入的response对象,使用response.getWriter().print("")回写数据,此时不需要视图跳转,业务方法返回值为void

    
        @RequestMapping(value = "/quick6")
        public void save6(HttpServletResponse response)     throws IOException {
            response.getWriter().print("hello zhang");
        }
    
    
    
  2. 但要与web解耦,所以可以把回写的串直接让方法返回,但得声明它是页面跳转还是展示字符串
    此时需要通过@ResponseBody注解告诉SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回

    
        @RequestMapping(value = "/quick7")
        @ResponseBody
        public String save7() throws IOException {
            return "hello zhang";
        }
        
    

    @ResponseBody:告诉SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体中返回

实际开发场景:直接回写json格式字符串
在返回字符串时,往往不会直接返回普通字符串。
首先设定好domain对象,设定其参数
然后导入jackson坐标,


        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.0</version>
        </dependency>

然后调用json转换工具 writeValueAsString函数进行转换


    @RequestMapping(value = "/quick9")
    @ResponseBody
    public String save9() throws IOException {
        User user = new User();
        user.setUsername("lisi");
        user.setAge(30);
        //使用json的转换工具将对象转换成json格式的字符串再返回
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(user);
        return json;
    }

2. 返回对象和集合

同之前配置内部资源视图解析器类似,SpringMVC处理器映射器封装了 类转换为json的函数。首先在spring-mvc.xml中进行配置:

<!--    配置处理器映射器-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            </list>
        </property>
    </bean>

由于内部的setMessageConverters的输入是列表,因此内部用list方法注入,其中转换的实体类为MappingJackson2HttpMessageConverter

修改好配置之后,直接返回想要的类,SpringMVC会将这个类的内部参数直接转换为json字符串

    @RequestMapping(value = "/quick10")
    @ResponseBody
    //期望SpringMVC将User自动转换成json格式的字符串
    public User save10() throws IOException {
        User user = new User();
        user.setUsername("lisi");
        user.setAge(30);
        return user;

    }

注解方式进行优化
之前进行配置时,主要是配置处理器映射器比较繁琐,可以使用注解方式进行优化
在 SpringMVC 的各个组件中,处理器映射器处理器适配器视图解析器称为 SpringMVC 的三大组件。
使用mvc:annotation-driven自动加载 RequestMappingHandlerMapping(处理映射器)和
RequestMappingHandlerAdapter( 处 理 适 配 器 ),可用在Spring-xml.xml配置文件中使用
mvc:annotation-driven替代注解处理器和适配器的配置。
同时使用mvc:annotation-driven默认底层就会集成jackson进行对象或集合的json格式字符串的转换。

  1. 导入mvc的命名空间
  2. 设置自动配置

知识要点

SpringMVC的数据响应方式

  1. 页面跳转
    • 直接返回字符串
    • 通过ModelAndView对象返回
  2. 回写数据
    • 直接返回字符串
    • 返回对象或集合

原文地址:https://www.cnblogs.com/Zhang-DevelopingPlatform/p/14733363.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


开发过程中是不可避免地会出现各种异常情况的,例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题,甚至直接导致程序崩溃。因此,在开发过程中,合理处理异常、避免异常产生、以及对异常进行有效的调试是非常重要的。 对于异常的处理,一般分为两种方式: 编程式异常处理:是指在代
说明:使用注解方式实现AOP切面。 什么是AOP? 面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。 AOP底层使用动态代理。 AOP术语 连接点
Spring MVC中的拦截器是一种可以在请求处理过程中对请求进行拦截和处理的机制。 拦截器可以用于执行一些公共的操作,例如日志记录、权限验证、数据转换等。在Spring MVC中,可以通过实现HandlerInterceptor接口来创建自定义的拦截器,并通过配置来指定拦截器的应用范围和顺序。 S
在 JavaWeb 中,共享域指的是在 Servlet 中存储数据,以便在同一 Web 应用程序的多个组件中进行共享和访问。常见的共享域有四种:ServletContext、HttpSession、HttpServletRequest、PageContext。 ServletContext 共享域:
文件上传 说明: 使用maven构建web工程。 使用Thymeleaf技术进行服务器页面渲染。 使用ResponseEntity实现下载文件的功能。 @Controller public class FileDownloadAndUpload { @GetMapping(&quot;/file/d
创建初始化类,替换web.xml 在Servlet3.0环境中,Web容器(Tomcat)会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。 Spring提供了这个接口的实现,名为SpringS
在 Web 应用的三层架构中,确保在表述层(Presentation Layer)对数据进行检查和校验是非常重要的。正确的数据校验可以确保业务逻辑层(Business Logic Layer)基于有效和合法的数据进行处理,同时将错误的数据隔离在业务逻辑层之外。这有助于提高系统的健壮性、安全性和可维护
什么是事务? 事务(Transaction)是数据库操作最基本单元,逻辑上一组操作,要么都成功,要么都失败,如果操作之间有一个失败所有操作都失败 。 事务四个特性(ACID) 原子性 一组操作要么都成功,要么都失败。 一致性 一组数据从事务1合法状态转为事务2的另一种合法状态,就是一致。 隔离性 事
什么是JdbcTemplate? Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作。 准备工作 引入jdbcTemplate的相关依赖: 案例实操 创建jdbc.properties文件,配置数据库信息 jdbc.driver=com.mysql.cj.
SpringMVC1.MVC架构MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范是将业务逻辑、数据、显示分离的方法来写代码MVC主要作用是:降低了视图和业务逻辑之间的双向耦合MVC是一个架构模型,不是一种设计模式。1.model(模型)数据模型,提供要展示的数据,因此包
SpringMVC学习笔记1.SpringMVC应用1.1SpringMVC简介​SpringMVC全名叫SpringWebMVC,是⼀种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品。​MVC全名是ModelViewController,是模型(model)-视图(view)-控制器(co
11.1数据回显基本用法数据回显就是当用户数据提交失败时,自动填充好已经输入的数据。一般来说,如果使用Ajax来做数据提交,基本上是没有数据回显这个需求的,但是如果是通过表单做数据提交,那么数据回显就非常有必要了。11.1.1简单数据类型简单数据类型,实际上框架在这里没有
一、SpringMVC简介1、SpringMVC中重要组件DispatcherServlet:前端控制器,接收所有请求(如果配置/不包含jsp)HandlerMapping:解析请求格式的.判断希望要执行哪个具体的方法.HandlerAdapter:负责调用具体的方法.ViewResovler:视图解析器.解析结果,准备跳转到具体的物
1.它们主要负责的模块Spring主要应用于业务逻辑层。SpringMVC主要应用于表现层。MyBatis主要应用于持久层。2.它们的核心Spring有三大核心,分别是IOC(控制反转),DI(依赖注入)和AOP(面向切面编程)。SpringMVC的核心是DispatcherServlet(前端控制器)。MyBatis的核心是ORM(对
3.注解开发Springmvc1.使用注解开发要注意开启注解支持,2.注解简化了,处理映射器和处理适配器,只用去管视图解析器即可案例代码:1.web.xml,基本不变可以直接拿去用<!--调用DispatcherServlet--><servlet><servlet-name>springmvc</servlet-name>
拦截器概述SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。**过滤器与拦截器的区别:**拦截器是AOP思想的具体应用。过滤器servlet规范中的一部分,任何javaweb工程都可以使用
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="
学习内容:1、SSH&SSM2、Spring3、Struts2&SpringMVC4、Hibernate&MyBatis学习产出:1.SSH和SSM都是有Spring框架的,他们两个差不多。2.Spring分为四个模块,持久层,表示层,检测层,还有核心层,核心层分为2个关键核心功能。分别为,控制反转(IOC),依赖注入(DI),和面向切面编程
一、SpringMVC项目无法引入js,css的问题具体原因是css和js等被SpringMVC拦截了:解决方案:在spring-mvc.xml中配置<mvc:default-servlet-handler/><?xmlversion="1.0"encoding="UTF-8"?><beansxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
开发环境:Eclipse/MyEclipse、Tomcat8、Jdk1.8数据库:MySQL前端:JavaScript、jQuery、bootstrap4、particles.js后端:maven、SpringMVC、MyBatis、ajax、mysql读写分离、mybatis分页适用于:课程设计,毕业设计,学习等等系统介绍