1.返回值分类
1.1 字符串
Controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
/**
* String 返回值
* 指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/pages/success.jsp
* @param model
* @return
*/
@RequestMapping("/testString")
public String testString(Model model){
System.out.println("testString方法执行了...");
User user = new User();
user.setUsername("张三");
user.setAge(18);
user.setSex("女");
// 存储
model.addAttribute("user", user);
return "success";
}
1.2 void,没有返回值
Servlet原始API可以作为控制器中方法的参数。
(1) 使用request请求转发:
/**
* 没有返回值
* @param
*/
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
User user = new User();
user.setUsername("张三");
user.setAge(18);
user.setSex("女");
//存储
request.setAttribute("user", user);
System.out.println(user);
//请求转发
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
//设置中文乱码
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
return;
}
(2) 使用response重定向:
//重定向
response.sendRedirect(request.getContextPath()+ "/response.jsp");
(3) 可以通过response指定相应结果。例如响应json数据。
//直接会进行响应
response.getWriter().print("hello");
1.3 ModelAndView
ModelAndView是SpringMVC为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
/**
* ModelAndView:数据存储+视图跳转
* @param modelAndView
* @return
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModedAndView(ModelAndView modelAndView){
User user = new User();
user.setUsername("王五");
user.setSex("男");
user.setAge(16);
//存储
modelAndView.addObject("user", user);
//跳转视图
modelAndView.setViewName("success");
return modelAndView;
}
2. 转发和重定向
2.1 forward转发
controller方法在提供了String类型的返回值之后,默认就是请求转发。我们也可以写成:
/**
* 使用关键字的方式进行转发和重定向
* @return
*/
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
//请求转发
return "forward:/WEB-INF/pages/success.jsp";
}
注意:如果用了forward:则路径必须写成实际视图url,不能写成逻辑视图。
相当于“request.getRequestDispatcher("url").forward(request,response);”。使用请求转发,既可以转发到jsp,也可以转发到其他的控制器方法。
2.2 Redirect重定向
contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用:redirect:
/**
* 使用关键字的方式进行转发和重定向
* @return
*/
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
//请求转发
// return "forward:/WEB-INF/pages/success.jsp";
//重定向
return "redirect:/response.jsp";
}
它相当于“response.sendRedirect(url)”。如果是重定向到的jsp页面,则页面不能在WEB-INF
3. ResponseBody响应json数据
3.1 使用说明
作用:该注解将Controller方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据。如:json,xml等,通过Response响应给客户端。
3.2 使用示例
使用@ResponseBody注解实现将controller方法返回对象转换为json响应给客户端。
SpringMVC默认用MappingJacksonHttpMessageConverter对json数据进行转换,需要加入依赖。
pom.xml:
<!--jackson-->
<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>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
controller代码:
// /**
// * 模拟异步请求响应
// * @param body
// */
// @RequestMapping("/testAjax")
// public void testAjax(@RequestBody String body){
// System.out.println(body);
// }
//
/**
* 模拟异步请求响应
* @param user
*/
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println(user);
// 做响应
user.setUsername("孙悟空");
user.setSex("男");
user.setAge(18);
return user;
}
ajax请求:
<head>
<title>Title</title>
<%--<script src="js/jquery.min.js"></script>--%>
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
<script>
// 页面加载,绑定点击事件
$(function(){
$("#btn").click(function () {
// alert("hello");
// 发送ajax请求
$.ajax({
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"username":"张三","age":"19","sex":"女"}',
dataType:"json",
type:"post",
success:function (data) {
alert(data);
alert(data.username);
alert(data.age);
alert(data.sex);
}
});
});
});
</script>
</head>
<body>
<button id="btn">发送ajax</button>
源码:github