1 Star 0 Fork 0

cgrs572/SpringMvcDemo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

SpringMVC数据响应测试用例

  • SpringMVC的数据响应方式
    • 方式一:页面跳转
      • 直接返回字符串
      • 通过ModelAndView对象返回
    • 方式二:回写数据
      • 直接返回字符串
      • 返回对象或集合

SpringMVC页面跳转

SpringMVC页面跳转——直接返回字符串

  • 在我们之前的示例中均是直接返回字符串的形式,比如
    • return "success.jsp"
    • return "/success.jsp"
    • return "/jsp/success.jsp"
    • 此处不在对直接返回字符出串的形式做详细解释
  • 注意:若我们配置了内部资源视图解析器,此时我们直接返回的字符串会与视图解析器的前后缀拼接到一起后跳转(可详见SpringMVC的核心配置文件解析)

SpringMVC页面跳转——通过ModelAndView对象返回

  • 通过ModelAndView对象返回有四种方式,代码示例如下

    • 环境准备工作均省略,可详见快速入门

    • controller包下的UserController类代码如下

      package at.guigu.controller;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.servlet.ModelAndView;
      
      import javax.servlet.http.HttpServletRequest;
      
      //将Usercontroller放到Spring容器中
      @Controller
      @RequestMapping("/user")
      public class Usercontroller {
      
          /**
           * SpringMVC页面跳转——直接返回字符串
           * @return
           */
          @RequestMapping(value = "/quick1")
          public String save1() {
              System.out.println("Usercontroller save...");
              return "success";
              // 等同于return "/user/success.jsp";
          }
      
          /**
           * SpringMVC页面跳转——返回ModelAndView对象  方式一
           * @return
           */
          @RequestMapping("/quick2")
          public ModelAndView save2() {
              /*
                  Model:模型  用来封装数据
                  View:视图   用来展示数据
               */
              ModelAndView mv = new ModelAndView();
              // 设置模型数据
              mv.addObject("username", "zhangsan");
              // 设置视图名称
              mv.setViewName("success");
              return mv;
          }
          
          /**
           * SpringMVC页面跳转——返回ModelAndView对象  方式二
           * @return
           */
          @RequestMapping("/quick3")
          public ModelAndView save3(ModelAndView mv) {
              /*
                  Model:模型  用来封装数据
                  View:视图   用来展示数据
               */
              // 设置模型数据
              mv.addObject("username", "zhangsan");
              // 设置视图名称
              mv.setViewName("success");
              return mv;
          }
          
          /**
           * SpringMVC页面跳转——返回ModelAndView对象  方式三
           * @return
           */
          @RequestMapping("/quick4")
          public String save4(Model model) {
              /*
                  Model:模型  用来封装数据
                  View:视图   用来展示数据
               */
              // 设置模型数据
              model.addAttribute("username", "zhangsan");
              // 返回jsp视图文件
              return "success";
          }
          
          /**
           * SpringMVC页面跳转——返回ModelAndView对象  方式四
           * 方式四不常用,了解知道即可
           * @return
           */
          @RequestMapping("/quick5")
          public String save5(HttpServletRequest request) {
              /*
                  Model:模型  用来封装数据
                  View:视图   用来展示数据
               */
      
              // request代替model来设置模型数据
              request.setAttribute("username", "zhangsan");
              // 返回jsp视图文件
              return "success";
          }
      }
      
    • success.jsp代码如下

      • 注意:jsp文件中使用EL表达式时要在JSP页面顶部<%@...%>标签体内加上isELIgnored="false",作用:防止Tomcat配置禁用EL表达式
      <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
      <html>
          <head>
              <title>Title</title>
          </head>
          <body>
              <h1>...Success Running...</h1>
              <h2>${username}</h2>
          </body>
      </html>
      

      Tomcat运行该Web项目后截图如下所示

      <img alt="image-20240719195230082">

  • 注意

    • public ModelAndView save3(ModelAndView mv)是通过参数传入ModelAndView对象以供使用,==原理是:== SpringMVC会自动根据方法的参数进行相应的注入,以该save3为例,当SpringMVC检测到其参数为ModelAndView,而这个类是SpringMVC所有的,此时SpringMVC框架就会自动为其提供一个ModelAndView对象以供该方法使用
    • public String save5(HttpServletRequest request)的原理也是Spring会根据方法的参数进行相应的注入

SpringMVC回写数据

SpringMVC回写数据——直接返回字符串

  • 在Web基础阶段,客户端访问服务器端,若想直接回写字符串作为响应体返回的话,只需要使用response.getWriter("Hello World")方法即可,而在Controller中若想直接返回字符串的方式如下:

    • 方式一: 通过SpringMVC框架注入response对象(即参数为response对象),然后使用response对象的getWriter().print("Hello World")方法回写数据即可
      • 注意:此时不需要视图跳转,且业务方法返回值为void
    • 方式二: 将需要回写的字符串直接返回,但此时需要使用@ResponseBody注解告知SpringMVC框架,该方法返回的是字符串不是页面跳转(即它是直接在http响应体中返回的字符串)
      • @ResponseBody注解作用:标注该注解的方法的返回值会直接写入 HTTP 响应体中。该注解通常用于 RESTful Web 服务或 AJAX 请求处理,以便返回 JSON、XML 或其他格式的数据。
  • 方式一的代码示例如下

    • 在controller包下重现创建一个示例类UserControllerTwo,代码如下

      package at.guigu.controller;
      
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      /**
       * SpringMVC回写数据
       */
      //将Usercontroller放到Spring容器中
      @Controller
      @RequestMapping("/userTwo")
      public class UserControllerTwo {
      
          /**
           * SpringMVC回写数据——直接返回字符串方式一
           * @param response
           * @throws IOException
           */
          @RequestMapping(value = "/quick1")
          public void save(HttpServletResponse response) throws IOException {
              response.getWriter().print("Hello World!");
          }
      }
      

      <img alt="image-20240722151738481">

  • 方式二的代码示例如下

    package at.guigu.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * SpringMVC回写数据
     */
    //将Usercontroller放到Spring容器中
    @Controller
    @RequestMapping("/userTwo")
    public class UserControllerTwo {
    
        /**
         * SpringMVC回写数据——直接返回字符串方式一
         * @param response
         * @throws IOException
         */
        @RequestMapping(value = "/quick1")
        public void save(HttpServletResponse response) throws IOException {
            response.getWriter().print("Hello World!");
        }
    
        /**
         * SpringMVC回写数据——直接返回字符串方式二
         * @return
         */
        @ResponseBody
        @RequestMapping(value = "/quick2")
        public String save2(){
            return "Hello World!";
        }
    }
    

    <img alt="image-20240722151917529">

  • 方式二中我们一般会返回指定格式的字符串,比如JSON格式,代码步骤示例如下(以对象转为JSON格式为例)

    • 注意:将对象转换为JSON格式进行输出时我们需要借助JSON的转换工具将对象转换为JSON格式的字符串,然后在返回

    • Step1: 在pom.xml文件中导入坐标jackson-core、jackson-databindjackson-annotations

      <!--jackson-core-->
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
          <version>2.17.1</version>
      </dependency>
      <!--jackson-databind-->
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.17.1</version>
      </dependency>
      <!--jackson-annotations-->
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>2.17.1</version>
      </dependency>
      
    • Step2: 创建一个pojo包,在该包下创建一个User类,代码如下

      package at.guigu.pojo;
      
      public class User {
          private String name;
          private int age;
          public User() {}
          public User(String name, int age) {
              this.name = name;
              this.age = age;
          }
          public String getName() {
              return name;
          }
          public void setName(String name) {
              this.name = name;
          }
          public int getAge() {
              return age;
          }
          public void setAge(int age) {
              this.age = age;
          }
      
          @Override
          public String toString() {
              return "User{" +
                      "name='" + name + '\'' +
                      ", age=" + age +
                      '}';
          }
      }
      
    • Step3: UserControllerTwo类代码如下

      package at.guigu.controller;
      
      import at.guigu.pojo.User;
      import com.fasterxml.jackson.core.JsonProcessingException;
      import com.fasterxml.jackson.databind.ObjectMapper;
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.ResponseBody;
      
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      /**
       * SpringMVC回写数据
       */
      //将Usercontroller放到Spring容器中
      @Controller
      @RequestMapping("/userTwo")
      public class UserControllerTwo {
      
          /**
           * SpringMVC回写数据——直接返回字符串方式一
           * @param response
           * @throws IOException
           */
          @RequestMapping(value = "/quick1")
          public void save(HttpServletResponse response) throws IOException {
              response.getWriter().print("Hello World!");
          }
      
          /**
           * SpringMVC回写数据——直接返回字符串方式二:直接返回普通字符串数据
           * @return
           */
          @ResponseBody
          @RequestMapping(value = "/quick2")
          public String save2(){
              return "Hello World!";
          }
      
          /**
           * SpringMVC回写数据——直接返回字符串方式二:返回JSON格式响应字符串数据
           * @return
           * @throws JsonProcessingException
           */
          @ResponseBody
          @RequestMapping(value = "/quick3")
          public String save3() throws JsonProcessingException {
              User user = new User();
              user.setName("zhangsan");
              user.setAge(18);
              //使用JSON的转换工具将对象转换为JSON格式的字符串,然后在返回
              ObjectMapper mapper = new ObjectMapper();
              String json = mapper.writeValueAsString(user);
              return json;
          }
      }
      

      <img alt="image-20240722154542304">

  • 注意:我们可以利用@RestController注解来代替@Controller@ResponseBody这两个注解

    • 原因:在类级别使用 @RestController 注解,就不需要在每个方法上单独使用 @ResponseBody 注解。@RestController 本质上是 @Controller@ResponseBody 的组合。

    • 此时UserControllerTwo类中方式二的代码可更改如下

      package at.guigu.controller;
      
      import at.guigu.pojo.User;
      import com.fasterxml.jackson.core.JsonProcessingException;
      import com.fasterxml.jackson.databind.ObjectMapper;
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.ResponseBody;
      import org.springframework.web.bind.annotation.RestController;
      
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      /**
       * SpringMVC回写数据
       */
      //将Usercontroller放到Spring容器中
      @RestController
      @RequestMapping("/userTwo")
      public class UserControllerTwo {
          /**
           * SpringMVC回写数据——直接返回字符串方式二:直接返回普通字符串数据
           * @return
           */
          @RequestMapping(value = "/quick2")
          public String save2(){
              return "Hello World!";
          }
      
          /**
           * SpringMVC回写数据——直接返回字符串方式二:返回JSON格式响应字符串数据
           * @return
           * @throws JsonProcessingException
           */
          @RequestMapping(value = "/quick3")
          public String save3() throws JsonProcessingException {
              User user = new User();
              user.setName("zhangsan");
              user.setAge(18);
              //使用JSON的转换工具将对象转换为JSON格式的字符串,然后在返回
              ObjectMapper mapper = new ObjectMapper();
              String json = mapper.writeValueAsString(user);
              return json;
          }
      }
      

SpringMVC回写数据——返回对象或集合

  • SpringMVC回写数据——直接返回字符串 的示例中使用JSON的转换工具将对象转换为JSON格式的字符串,然后在返回这种方式每次都需要如下两句代码

    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(user);
    

    这样就造成了代码冗余,为避免冗余我们可对其进行优化,已便于达到如下目的:SpringMVC自动将对象或集合转为JSON格式的字符串

    • 原理:找到SpringMVC默认组件配置的配置文件DispatherServlet.properties(可详见SpringMVC核心配置文件解析),然后找到处理器适配器HandlerAdapter接口下的RequestMappingHandlerAdapter类,该类下有一个public void setMessageConverters(List<HttpMessageConverter<?>> messageConverters)方法可用来设置一个JSON转换的转换器

      • 该类的作用:处理使用 @RequestMapping 注解的控制器方法。它是 HandlerAdapter 接口的一个具体实现,负责调用带有 @RequestMapping 注解的方法来处理 HTTP 请求。
      • 可通过SpringMVC的核心配置文件来更改(配置代码及步骤可详见SpringMVC核心配置文件解析)

      <img alt="image-20240722160905336">

  • 优化步骤如下

    • Step1: SpringMVC核心配置文件代码如下

      <?xml version="1.0" encoding="UTF-8"?>
      <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="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd
             http://www.springframework.org/schema/context
             http://www.springframework.org/schema/context/spring-context.xsd
             http://www.springframework.org/schema/mvc
             http://www.springframework.org/schema/mvc/spring-mvc.xsd">
      
          <!--配置Controller层的注解的组件扫描-->
          <context:component-scan base-package="at.guigu.controller"></context:component-scan>
          <!--等同于
          <context:component-scan base-package="at.guigu">
              type指定要扫描的内容为注解,expression指定要扫描的对应注解的全限定名
              只扫描at.guigu包下有@Controller注解的类
              <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
          </context:component-scan>
          -->
          <!--配置内部资源视图解析器-->
          <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <!--将InternalResourceViewResolver类中的前缀属性prefix的值设为/jsp/-->
              <property name="prefix" value="/user/"></property>
              <!--将InternalResourceViewResolver类中的前缀属性suffix的值设为.jsp-->
              <property name="suffix" value=".jsp"></property>
          </bean>
      
          <!--配置处理器适配器-->
          <bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
              <property name="messageConverters">
                  <list>
                      <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
                  </list>
              </property>
          </bean>
      </beans>
      

      配置内部资源视图解析器以及处理器适配器都用到了setter方法注入,只是说一个是普通数据类型注入,一个是集合注入。具体注入方法解释可详见Spring完整知识点汇总一中的依赖注入

    • Step2: 直接返回字符串方式二:返回JSON格式响应字符串数据的代码更改如下

      package at.guigu.controller;
      
      import at.guigu.pojo.User;
      import com.fasterxml.jackson.core.JsonProcessingException;
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.ResponseBody;
      
      //将Usercontroller放到Spring容器中
      @Controller
      @RequestMapping("/userTwo")
      public class UserControllerFour {
          /**
           * SpringMVC回写数据——直接返回字符串方式二:返回JSON格式响应字符串数据
           * @return
           * @throws JsonProcessingException
           */
          @ResponseBody
          @RequestMapping(value = "/quick3")
          public User save3() throws JsonProcessingException {
              User user = new User();
              user.setName("zhangsan");
              user.setAge(18);
              return user;
          }
      }
      

      <img alt="image-20240722161920459">

  • 在SpringMVC核心配置文件中进行处理器适配器的配置还稍显麻烦,我们可以在SpringMVC核心配置文件中使用mvc的注解驱动来代替对处理器适配器进行的配置

    • mvc的注解驱动代码:<mvc:annotation-driven/>

      • 它能够自动加载处理器映射器RequestMappingHandlerMapping和处理器适配器RequestMappingHandlerAdapter,并且它的底层会继承jackson进行对象或集合的JSON格式字符串的转换
    • 此时SpringMVC的核心配置文件代码如下

      注意:mvc的注解驱动代码需要引入mvc的命名空间以及约束路径(可详见Spring快速入门代码实现)

      <?xml version="1.0" encoding="UTF-8"?>
      <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="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd
             http://www.springframework.org/schema/context
             http://www.springframework.org/schema/context/spring-context.xsd
             http://www.springframework.org/schema/mvc
             http://www.springframework.org/schema/mvc/spring-mvc.xsd">
      
          <!--配置Controller层的注解的组件扫描-->
          <context:component-scan base-package="at.guigu.controller"></context:component-scan>
          <!--等同于
          <context:component-scan base-package="at.guigu">
              type指定要扫描的内容为注解,expression指定要扫描的对应注解的全限定名
              只扫描at.guigu包下有@Controller注解的类
              <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
          </context:component-scan>
          -->
          <!--配置内部资源视图解析器-->
          <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <!--将InternalResourceViewResolver类中的前缀属性prefix的值设为/jsp/-->
              <property name="prefix" value="/user/"></property>
              <!--将InternalResourceViewResolver类中的前缀属性suffix的值设为.jsp-->
              <property name="suffix" value=".jsp"></property>
          </bean>
      
          <!--mvc的注解驱动-->
          <mvc:annotation-driven/>
          <!--等同于配置处理器适配器-->
          <!--<bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
              <property name="messageConverters">
                  <list>
                      <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
                  </list>
              </property>
          </bean>-->
      </beans>
      
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/cgrs572/spring-mvc-demo.git
git@gitee.com:cgrs572/spring-mvc-demo.git
cgrs572
spring-mvc-demo
SpringMvcDemo
master

搜索帮助