五、响应数据和结果视图
1、返回值分类
(1)字符串
controller方法返回字符串可以指定逻辑视图名,通过试图分析器解析为物理视图地址。
//返回值类型是字符串
@RequestMapping("/testString")
public String testString(Model model){
System.out.println("testString方法执行了");
User user = new User();
user.setUsername("杨健");
user.setPassword("123456");
user.setAge(23);
//model对象
model.addAttribute("user",user);
return "success";
}
----------------------------------------------
<a href="user/testString">testString</a>
(2)void
Servlet原始API可以作为控制器中方法的参数
//返回值类型是void
//请求转发一次请求,不用编写项目的名称
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("testString方法执行了");
//编写请求转发的程序
//request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
//重定向,也可以通过reponse页面重定向
//response.sendRedirect(request.getContextPath()+"/index.jsp");
//设置中文乱码问题,也可以通过response指定响应结果
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//直接会进行响应
response.getWriter().print("你好");
return;
}
---------------------------------------------
<a href="user/testVoid">testVoid</a>
(3)ModelAndView
ModelAndView是SpringMVC为我们提供的一个对象,该对象也可以用于控制器方法的返回值。
getModelMap(),添加模型到该对象中,我们在页面上可以直接用el表达式获取。获取方式${attributeName}
setViewName():用于设置逻辑视图名称,视图解析器会根据名称前往指定的视图。
注意:
我们在页面上获取使用的是requestScope.username取得,所以返回ModelAndView类型时,浏览器跳转只能是请求转发。
//返回ModelAndView
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(Model model){
//创建ModelAndView对象
ModelAndView mv = new ModelAndView();
System.out.println("testModelAndView方法执行了");
//模拟从数据苦衷查询User对象
User user = new User();
user.setUsername("杨澈");
user.setPassword("654321");
user.setAge(29);
//把user对象存储到mv对象中,也会把user对象存入到request对象中
mv.addObject("user",user);
//跳转到哪个页面
mv.setViewName("success");
return mv;
}
-------------------------------------------
<a href="user/testModelAndView">testModelAndView</a>
2、转发和重定向
(1)forward转发
如果用了forward:路径必须写成实际视图url,不能写成逻辑视图。它相当于“request.getRequestDispatcher(“url”).forward(request,response)”。使用请求转发,既可以转发到 jsp,也可以转发到其他的控制器方法。
//用关键字的方式进行转发或者重定向
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("testForwardOrRedirect方法执行了......");
//请求的转发
//return "forward:/WEB-INF/pages/success.jsp";
//重定向
return "redirect:/index.jsp";
}
-------------------------------------------------
<%--用转发或者重定向的方式--%>
<a href="user/testForwardOrRedirect">testForwardOrRedirect</a>
(2)Redirect重定向
contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用:redirect:它相当于“response.sendRedirect(url)”。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。
3、ResponseBody响应json数据
@ResponseBody,该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端。
Springmvc默认用MappingJacksonHttpMessageConverter对json数据进行转换,需要加入jackson的包。
<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-core</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
//@RequestBody 接收的 @ResponseBody 响应的
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("testAjax方法执行了......");
//客户端发送的是ajax请求,传的是json字符串,后端把json字符串封装到user对象中
System.out.println(user);
//做响应,模拟查询数据库
user.setUsername("吴毛豆");
user.setAge(0);
user.setPassword("686868");
//做响应
return user;
}
----------------------------------------------------------
<button id="btn">发送ajax的请求</button>