返回值分类
- 字符串
- 指定逻辑视图名,通过视图解析器解析为物理地址
//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp
@RequestMapping(path="/hello")
public String sayHello(){
System.out.println("Hello SpringMVC!");
return "success";
}
- 无返回值(void)
- 没有返回值的页面跳转,默认跳转到@RequestMapping的路径的jsp页面上,但没有这个页面所以报404,例如@RequestMapping("/testReturnVoid"),这时页面就会跳到testReturnVoid.jsp页面
- 用request来请求转发
@RequestMapping("/testReturnVoid")
public void testReturnVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 用request来请求转发
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
}
3. 用response来页面重定向(不能访问WEB-INF里的页面)
@RequestMapping("/testReturnVoid")
public void testReturnVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 用response来页面重定向
// 相当于客户端重新发了一条请求,所以不能访问WEB-INF里的页面
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
4. 通过response指定响应结果
@RequestMapping("/testReturnVoid")
public void testReturnVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 通过response指定响应结果,例如响应接收数据
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json 串");
}
- ModelAndView
- 通过返回 ModeAndView 对象来实现页面跳转和数据传输,据说底层也是这样做的,比如说Model对象+返回String的形式
@RequestMapping("/testReturnModelAndView")
public ModelAndView testReturnModelAndView() {
ModelAndView mv = new ModelAndView();
// 就像Model对象的addAttribute()方法一样
mv.addObject("username", "张三");
// 指定逻辑视图名,通过视图解析器解析为物理地址,就像有返回值一样
mv.setViewName("TestOutput");
return mv;
}
转发和重定向
- forward 转发
- controller提供String返回值之后,默认就是请求转发
- 如果用了forward: 则路径必须写成成实际视图 url,不能写逻辑视图
- 返回值开头必须是forward:
@RequestMapping("/testForward")
public String testForward() {
System.out.println("testForward 方法执行了。。。。");
// 相当于 request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response)
return "forward:/WEB-INF/pages/success.jsp";
}
- Redirect 重定向
- 返回值开头必须是redirect:
- jsp 页面不 能写在 WEB-INF 目录中,否则无法找到
@RequestMapping("/testRedirect")
public String testRedirect() {
System.out.println("testRedirect 方法执行了。。。。");
// 相当于response.sendRedirect("/index.jsp")”,jsp不在WEB-INF文件夹内
return "redirect:/index.jsp";
}
ResponseBody 响应 json 数据
- 作用:
该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的 数据如:json,xml 等,通过 Response 响应给客户端 - 加入依赖
<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>
- jsp页面的json及按钮
<%-- 引入js--%>
<%-- 先在springmvc.xml里面对资源放行--%>
<%-- <mvc:resources mapping="/js/**" location="/js/"/>--%>
<script src="js/jquery.min.js"></script>
<script>
$(function () {
$("#btn1").click(function () {
$.ajax({
// url对应下面controller的方法
url:"CommonTest/testAjax",
// url:"CommonTest/testJson",
// url:"CommonTest/testReturnJavabean",
contentType:"application/json;charset=UTF-8",
data:'{"username":"hehe","password":"123"}',
// 规定返回一定是json格式,返回success字符串时注释
dataType:"json",
type:"post",
success:function(data){
// data服务器端响应的json的数据,进行解析
alert(data);
alert(data.username+','+data.password);
}
})
})
})
</script>
<button id="btn1">发送ajax的请求1</button>
<button id="btn2">发送ajax的请求2</button>
<button id="btn3">发送ajax的请求3</button>
- controller里面的代码(接收、接收及方法字符串和接收、更改及返回Javabean)
/**
* 响应 json 数据的控制器,如果获取特定的值那就用map来作形参
*/
@RequestMapping("/testAjax")
public String testJson(@RequestBody String body) {
System.out.println(body);
return "success";
}
/**
*把json的字符串转换成JavaBean的对象,并响应
*/
@ResponseBody
@RequestMapping("/testJson")
public String testJson(@RequestBody User user) {
System.out.println(user);
return "success";
}
/**
*把json的字符串转换成JavaBean的对象,并返回实体类
*/
@ResponseBody
@RequestMapping("/testReturnJavabean")
public User testReturnJavabean(@RequestBody User user) {
System.out.println(user);
user.setUsername("赵四");
return user;
}
- 分别的执行结果
- 浏览器无响应
- 接收及方法字符串
- 更改及返回Javabean
- 浏览器无响应