SpringMVC中的响应数据和结果视图
- 1.返回值分类
- 1.1 返回值为 String
- 1.2 返回值为 void
- 1.3 返回值为 ModelAndView
- 2 转发和重定向
- 2.1 forward 转发
- 2.2 Redirect 重定向
- 3 ResponseBody 响应 json 数据
- 3.1 使用说明
- 3.2使用示例
1.返回值分类
1.1 返回值为 String
/**
* 返回值为 String
* @param model
* @return
*/
@RequestMapping("/testString")
public String testString(Model model){
System.out.println("testResponse方法执行了");
//模拟从数据库取出数据
User user = new User();
user.setAge(12);
user.setPassword("123123");
user.setName("zhangsan");
model.addAttribute("user",user);
// 跳转到XX页面
return "success";
}
1.2 返回值为 void
1、使用 request 转向页面,如下:
/**
* 返回值为 void 跳转页面
*/
@RequestMapping("testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("testVoid方法执行了");
//1.转发请求 (一次请求)
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
return;
}
2、也可以通过 response 页面重定向,如下:
/**
* 返回值为 void 跳转页面
*/
@RequestMapping("testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("testVoid方法执行了");
//2.重定向(两次请求)(不能访问web-inf路径下的页面)
response.sendRedirect(request.getContextPath() + "/index.jsp");
return;
}
3、也可以通过 response 指定响应结果,例如响应 json 数据:
@RequestMapping("testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("testVoid方法执行了");
//设置响应字符集
response.setCharacterEncoding("utf-8");
response.setContentType("test/html;charset=utf-8");
//直接在当前请求页面输出
response.getWriter().print("sb");
return;
}
1.3 返回值为 ModelAndView
示例代码:
//返回值为ModelAndView
@RequestMapping("testModelAndView")
public ModelAndView testModelAndView(){
ModelAndView mv = new ModelAndView();
User user = new User();
user.setName("zhangsan");
user.setAge(22);
user.setPassword("123123");
mv.addObject("user",user);
mv.setViewName("success");
return mv;
}
2 转发和重定向
2.1 forward 转发
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。我们也可以写成:
/**
* forward 和 redirect 关键字
* @return
*/
@RequestMapping("testForwardAndRedirect")
public String testForwardAndRedirect(){
System.out.println("testForwardOrRedirect执行了");
//请求转发
return "forward:/WEB-INF/pages/success.jsp";
}
(需要注意的是,如果用了 formward:则路径必须写成实际视图 url,不能写逻辑视图。 它相当于“request.getRequestDispatcher(“url”).forward(request,response)”。使用请求 转发,既可以转发到 jsp,也可以转发到其他的控制器方法。 )
2.2 Redirect 重定向
contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用:redirect:
/**
* forward 和 redirect 关键字
* @return
*/
@RequestMapping("testForwardAndRedirect")
public String testForwardAndRedirect(){
System.out.println("testForwardOrRedirect执行了");
//重定向(springMVC框架底层已经加上了项目名所以不用写)
return "redirect:/index.jsp";
}
3 ResponseBody 响应 json 数据
3.1 使用说明
作用: 该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的 数据如:json,xml 等,通过 Response 响应给客户端
3.2使用示例
需求:
使用@ResponseBody 注解实现将 controller 方法返回对象转换为 json 响应给客户端
前置知识点:
Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入 jackson 的包的坐标:
<dependencies>
<!-- jackson-->
<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>
</dependencies>
jsp 中的代码:
<script>
//页面加载,绑定单击事件
$(function () {
$("#btn").click(function () {
$.ajax({
url:"user/testAjax",
contentType:"application/json;charset=utf-8",
data:'{"name":"zhangsan","age":"12","password":"123123"}',
dataType:"json",
type:"post",
success:function (data) {
alert(data);
alert(data.name);
alert(data.password);
alert(data.age);
}
})
});
});
</script>
<!-- 测试异步请求 -->
<body>
<button id="btn">发送ajax请求</button>
</body>
控制器中的代码:
/**
* 模拟异步请求响应
* @param user
* @return
*/
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("testAjax方法执行了");
//客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
System.out.println(user);
//做响应,模拟查询数据库
user.setAge(33);
user.setPassword("23234");
//做响应
return user;
}