springMVC响应数据和结果视图

返回值分类

  1. 返回字符串

    Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。

//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp
@RequestMapping("/testReturnString")
public String testReturnString() {
  System.out.println("AccountController 的 testReturnString 方法执行了。。。。");
  return "success";
}

    具体的应用场景

@Controller
@RequestMapping("/user")
public class UserController {
  /**
  * 请求参数的绑定
  */
  @RequestMapping(value="/initUpdate")
  public String initUpdate(Model model) {
    // 模拟从数据库中查询的数据
    User user = new User();
    user.setUsername("张三");
    user.setPassword("123");
    user.setMoney(100d);
    user.setBirthday(new Date());
    // 如果在类上添加 @SessionAttributes(value= {"xxx"},types={xxx.class}) 注解,
    // 表示把数据也存一份到session域中
    model.addAttribute("user", user); // 把数据保存到request域中
    return "update";
  }
}
<h3>修改用户</h3>
${ requestScope }
<form action="user/update" method="post">
  姓名:<input type="text" name="username" value="${ user.username }"><br>
  密码:<input type="text" name="password" value="${ user.password }"><br>
  金额:<input type="text" name="money" value="${ user.money }"><br>
  <input type="submit" value="提交">
</form>

  2. 返回值是void

    1. 如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。
      默认会跳转到@RequestMapping(value="/initAdd") initAdd的页面。
    2. 可以使用请求转发或者重定向跳转到指定的页面

@RequestMapping(value="/initAdd")
public void initAdd(HttpServletRequest request,HttpServletResponse response) throws Exception {
  System.out.println("请求转发或者重定向");
  // 请求转发
  // request.getRequestDispatcher("/WEB-INF/pages/add.jsp").forward(request, response);
  // 重定向
  // response.sendRedirect(request.getContextPath()+"/add2.jsp");
  // 直接响应数据
  response.setCharacterEncoding("utf-8");
  response.setContentType("application/json;charset=utf-8");
  response.getWriter().write("{\"name\": \"lily\"}");
}

  3. 返回值是ModelAndView对象

    ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。

/**
* 返回ModelAndView对象
* 可以传入视图的名称(即跳转的页面),还可以传入对象。
* @return
* @throws Exception
*/
@RequestMapping(value="/findAll")
public ModelAndView findAll() throws Exception {
  ModelAndView mv = new ModelAndView();
  // 跳转到list.jsp的页面
  mv.setViewName("list");
  // 模拟从数据库中查询所有的用户信息
  List<User> users = new ArrayList<>();
  User user1 = new User();
  user1.setUsername("张三");
  user1.setPassword("123");
  User user2 = new User();
  user2.setUsername("赵四");
  user2.setPassword("456");
  users.add(user1);
  users.add(user2);
  // 添加对象,把数据存入request域中
  mv.addObject("users", users);
  return mv;
}

转发和重定向

  1.forward请求转发

    controller方法返回String类型,默认就是请求转发。请求转发也可以编写成

/**
* 使用forward关键字进行请求转发
* "forward:转发的JSP路径",不走视图解析器了,所以需要编写完整的路径
* @return
* @throws Exception
*/
@RequestMapping("/delete")
public String delete() throws Exception {
  System.out.println("delete方法执行了...");
  // return "forward:/WEB-INF/pages/success.jsp"; // 转发到jsp页面
  return "forward:/user/findAll"; // 转发到控制器
}
@RequestMapping("/forward")
    public ModelAndView forward() {
        ModelAndView mv = new ModelAndView();
        // mv.setViewName("forward:/WEB-INF/pages/success.jsp"); // 转发到jsp页面
        mv.setViewName("forward:/hello"); // 转发到控制器
        return mv;
    }

    重定向:

/**
* 重定向
* @return
* @throws Exception
*/
@RequestMapping("/count")
public String count() throws Exception {
  System.out.println("count方法执行了...");
  // springMVC会自动补充完整 http://localhost:8080/项目名
  return "redirect:/add.jsp";
  // return "redirect:/user/findAll";
}
/*public ModelAndView redirect() { ...... }*/

      注意:如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到
    RedirectAttributes参数:

      1. 使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面 ,如http://localhost:8080/test.jsp?a=a
      2. 使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,
        这里的redirect必须是方法映射路径,jsp无效。

@RequestMapping("/redirectAttributes")
public String redirectAttributes(RedirectAttributes attr) {
  // attr.addAttribute("a", "a");
  // return "redirect:/test.jsp";

  attr.addFlashAttribute("b", "b");
  return "redirect:/redirect";
}

 ResponseBody响应json数据

  作用:
    该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据
    如:json,xml 等,通过 Response 响应给客户端

  注意:如果把@ResponseBody配置到方法中,则表示直接把返回值打印在浏览器页面上

  使用@RequestBody获取请求体数据:

/**
* 获取请求体的数据
* @param body
*/
@RequestMapping("/testJson")
public void testJson(@RequestBody String body) {
System.out.println(body);
}

  使用@RequestBody注解把json的字符串转换成JavaBean的对象:

/**
* 获取请求体的数据
* @param address
*/
@RequestMapping("/testJson")
public void testJson(@RequestBody Address address) {
  System.out.println(address);
}

  使用@ResponseBody注解把JavaBean对象转换成json字符串,直接响应:

@RequestMapping("/testJson")
public @ResponseBody Address testJson(@RequestBody Address address) {
  System.out.println(address);
  address.setAddressName("上海");
  return address;
}

    json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包

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

 

posted @ 2020-02-15 13:27  糖不甜,盐不咸  阅读(164)  评论(0编辑  收藏  举报