3-SpringMVC的数据响应

image-20201207223140203

1.2页面跳转

image-20201207223217866

1.2.2 ModelAndView

@RequestMapping(value = @RequestMapping(value = "/quick2")
public ModelAndView save2(){
    ModelAndView modelAndView = new ModelAndView();
    // 设置模型数据  jsp中通过${name}取
    modelAndView.addObject("name","zhangsan");
    // 设置视图名称
    modelAndView.setViewName("success");
    return modelAndView;
}

//参数ModelAndView 由 Spring框架注入

@RequestMapping(value = @RequestMapping(value = "/quick3")
public ModelAndView save3(ModelAndView modelAndView){
    modelAndView.addObject("username","wangwu");
    modelAndView.setViewName("success");
    return modelAndView;
}
@RequestMapping(value = @RequestMapping(value = "/quick4")
public String save4(Model model){
    model.addAttribute("key4","value4");
    return "success";
}

// 不推荐下面这种,因为用了SpringMVC 就用框架的

@RequestMapping(value = @RequestMapping(value = "/quick5")
public String save5(HttpServletRequest servletRequest){
    servletRequest.setAttribute("key5","value5");
    return "success";
}

1.3回写数据

1.3.1直接回写字符串

  1. 尽可能不用下面这种
@RequestMapping(value = @RequestMapping(value = "/quick6")
public void save6(HttpServletResponse servletResponse) throws IOException {
   servletResponse.getWriter().println("/quick6");
}
  1. 用注解@ResponseBody

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

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

1.3.2回写json字符串

方法一

@RequestMapping(value = @RequestMapping(value = "/quick8")
@ResponseBody
public String save8() throws IOException {
    return "{\"username\":\"zhangshan\",\"age\":18}";
}

方法二:用jackson工具将对象转为Json字符串

@RequestMapping(@RequestMapping(value = "/quick9")
@ResponseBody
public String save9() throws IOException {
    User user = new User("aishang",25);
    // json转换工具将对象转为Json字符串
    ObjectMapper objectMapper = new ObjectMapper();
    return objectMapper.writeValueAsString(user);
}
  1. 导坐标

<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-coreartifactId>
    <version>2.9.0version>
dependency>

<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-databindartifactId>
    <version>2.9.0version>
dependency>

<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-annotationsartifactId>
    <version>2.9.0version>
dependency>

这里可能出现ObjectMapper NoClassDefError

通过在Project Structure -> Artifacts -> 对应war exploded -> Out Layout-> 添加对lib中

1.3.3 返回对象或集合

简化

每次返回都要用ObjectMapper 转,重复过多。通过为处理适配器配置消息转换参数,指定使用jackson进行对象或集合的转换。

RequestMappingHandlerAdapter是DispatcherServlet.properties中配置的

@RequestMapping(@RequestMapping(value = "/quick9")
@ResponseBody
//期望SpringMVC将User转化成json字符串
public User save10() {
    User user = new User("aishang",25);
    return user;
}
//spring-mvc.xml
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    "messageConverters">
        
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
        </list>
    property>
</bean>

上面的配置也麻烦,通过注解进一步简化:

在SpringMVC的各个组件中,RequestMappingHandlerMapping处理器映射器、处理器适配器RequestMappingHandlerAdapter、视图解析器称为它的三大组件。

使用<mvc:annotation-driven>自动加载RequestMappingHandlerAdapter和RequestMappingHandlerMapping,可用在spring-mvc.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。同时内部集成jackson进行对象或集合到json字符串的转换。

// 要加mvc的命名空间

<mvc:annotation-driven/>

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!