Maxon's Blog

SpringMVC 数据响应

1

SpringMVC 数据响应

SpringMVC的数据响应方式

  • 页面跳转
    • 直接返回字符串
    • 通过ModelAndView对象访问
  • 回写数据
    • 直接返回字符串
    • 返回对象集合

1. 页面跳转

1.1 返回字符串形式

  • 直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转

    Java
    //方法上 请求地址 http://localhost:port/quick
    @RequestMapping("/quick")
    public String save(){
        System.out.println("UserController save running....");
        //跳转的视图
        //默认 forward:  可以改成 redirect:
        return "success";
    }
    

1.2 返回ModelAndView对象

Java
@RequestMapping("/quick2")
public ModelAndView save2(){
    /*
    * Model:模型  作用封装数据
    * View :视图  作用展示数据*/
    ModelAndView modelAndView = new ModelAndView();
    //设置模型数据
    modelAndView.addObject("username", "aowu");
    //设置视图名称
    modelAndView.setViewName("success");
    return modelAndView;
}

SpringMVC 可以帮助方法的参数进行注入

Java
@RequestMapping("/quick3")
//SpringMVC 可以帮助方法的参数进行注入
public ModelAndView save3(ModelAndView modelAndView){
    //设置模型数据
    modelAndView.addObject("username", "aowu_wuhu");
    //设置视图名称
    modelAndView.setViewName("success");
    return modelAndView;
}

Model和View分开 View以字符串形式返回

Java
@RequestMapping("/quick4")
//Model和View分开  View以字符串形式返回
public String save4(Model model){
    model.addAttribute("username", "aowu_wuhu_haha");
    return "success";
}

使用MVC框架注入JavaWeb Request对象 (不常用)

Java
@RequestMapping("/quick5")
//SpringMVC框架帮助方法的参数进行注入
public String save5(HttpServletRequest request){
    request.setAttribute("username","Wuhu_Aowu");
    return "success";
}

2.回写数据

2.1 直接返回字符串

Web基础阶段,客户端访问服务器端,如果想直接回写字符串作为响应体返回的话,只需要使用response.getWriter().print("hello world")即可,那么在Controller中想直接回写字符串该怎样呢?

  • 通过SpringMVC框架注入的response对象,使用response.getWriter().print("hello world")回写数据,此时不需要视图跳转,业务方法返回值为void.

    Java
    @RequestMapping("/quick6")
        //SpringMVC框架帮助方法的参数进行注入
        //注入response对象 利用response对象进行回写
        public void save6(HttpServletResponse response) throws IOException {
            response.getWriter().print("Hey Noobs!");
        }
    
    
  • 将需要回写的字符串直接返回,但此时需要通过@ResponseBody注解告知SpringMVC框架,方法返回的字符串不是跳转时直接在http响应体中返回

    Java
    @RequestMapping("/quick7")
    @ResponseBody //告知SpringMVC框架,该方法不进行视图跳转,直接回写数据
    public String save7(){
        return "im noob";
    }
    
  • 使用Json转换工具将对象转换成JSON格式字符串再返回

Xml
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.13.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.13.3</version>
</dependency>
Java
@RequestMapping("/quick9")
@ResponseBody //告知SpringMVC框架,该方法不进行视图跳转,直接回写数据
public String save9() throws JsonProcessingException {
    User user=new User();
    user.setUsername("Aowu");
    user.setAddr("Moon");
    user.setAge(100);

    //使用Json转换工具将对象转换成JSON格式字符串再返回
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(user);

    return json;
}

2.2 返回对象或集合

让SpringMVC自动将User转换成Json格式的字符串

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>
Java
@RequestMapping("/quick10")
@ResponseBody
//让SpringMVC自动将User转换成Json格式的字符串
public User save10() throws JsonProcessingException {
    User user=new User();
    user.setUsername("Wuhu");
    user.setAddr("Moon");
    user.setAge(200);
    return user;
}

在方法上添加@ResponseBody就可以返回json格式的字符串,但是这样配置比较麻烦,配置的代码比较多,因此,我们可以使用mvc注解驱动代替上述配置

Xml
<!--mvc注解驱动-->
<mvc:annotation-driven/>

SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解折器称为Spring MVC的三大组件。 使用<mvc:annotation-driven>动加载RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter(处理适配器),可用在Spring-xml.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。 同时使用<mvc:annotation-driven>默认底层就会集成,ackson进行对象或集合的json格式字符串的转换。