在学习了SpringMVC的配置流程以及单元方法请求数据的获取后,我们可以使用SpringMVC搭建一个项目,在单元方法中使用SpringMVC提供的方式来获取请求信息,然后根据功能需求,声明请求处理的逻辑代码,进行请求的处理。当请求处理完成后,我们需要将此次请求的处理结果响应给浏览器,以前我们是自己在Servlet中使用response对象来完成响应的,那么在SpringMVC中如何响应请求的处理结果呢?
@RequestMapping("/testReturnVoid")
public void testReturnVoid() throws Exception {
System.out.println("AccountController 的 testForward 方法执行了。。。。");
}
在SpringMVC中如果对于当前的控制单元,没有写对应的返回值,这个时候SpringMVC就会找和自己控制单元名称一致的页面展示,如果没有配置视图解析器的前缀和后缀是没有产生404,需要注意控制单元仍然可以进。
@RequestMapping("demo1")
public void testDemo1(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 请求转发
//request.getRequestDispatcher("/forward.jsp").forward(request,response);
// 响应重定向
response.sendRedirect(request.getContextPath()+"/redirect.jsp");
}
单元方法的返回值类型设置void。因为使用response对象在单元方法中直接对此次请求进行了响应,不再通过DispatcherServlet了,既然已经响应了,就不需要再给DispatcherServlet返回值了。在单元方法上声明HttpServletResponse形参,来接收此次请求的response对象。
/*
* 返回字符串告诉DispatcherServlet跳转的路径
* 在路径之前放上一个forward: 关键字,就是请求转发
* 如果路径前的关键字是forward,那么可以省略不写
* */
@RequestMapping("demo2")
public String testDemo2() throws Exception {
//return "forward:/forwardPage.jsp";
return "/forwardPage.jsp";
}
使用通过单元方法的返回值来告诉DispatcherServlet请求转发指定的资源,如果是请求转发,forward关键字可以省略不写的
/*
* 返回字符串告诉DispatcherServlet跳转的路径
* 在路径之前放上一个redirect: 关键字,就是重定向
* 如果路径前的关键字是redirect,那么不可以省略
* /表示当前项目下.这里不需要项目的上下文路径
* */
@RequestMapping("demo3")
public String testDemo3() throws Exception {
return "redirect:/redirectPage.jsp";
}
使用通过单元方法的返回值来告诉DispatcherServlet重定向指定的资源,注意这个redirect关键字不可以省去
@RequestMapping("demo4")
public View testDemo4(HttpServletRequest req) {
View view =null;
// 请求转发
//view =new InternalResourceView("/forwardPage.jsp");
// 重定向
view=new RedirectView(req.getContextPath()+"/redirectPage.jsp");
return view;
}
RedirectView中所做的操作,最终的实现是在renderMergedOutputModel中完成实现的,简单来说RedirectView实现了链接的重定向,并且将数据保存到FlashMap中,这样在跳转后的链接中可以获取一些数据
@RequestMapping("demo5")
public ModelAndView testDemo5(HttpServletRequest req) {
ModelAndView mv=new ModelAndView();
// 请求转发
//mv.setViewName("forward:/forwardPage.jsp");
//mv.setView(new InternalResourceView("/forwardPage.jsp"));
// 重定向
//mv.setViewName("redirect:/redirectPage.jsp");
mv.setView(new RedirectView(req.getContextPath()+"/redirectPage.jsp"));
return mv;
}
ModelAndView中的Model代表模型,View代表视图,这个名字就很好地解释了该类的作用。业务处理器调用模型层处理完用户请求后,把结果数据存储在该类的model属性中,把要返回的视图信息存储在该类的view属性中,然后让该ModelAndView返回该Spring MVC框架。
当浏览器发起一个ajax请求给服务器,服务器调用对应的单元方法处理ajax请求。而ajax的请求在被处理完成后,其处理结果需要直接响应。而目前我们在单元方法中响应ajax请求,使用的是response对象,需要我们自己将要响应的数据转换 为json字符串响应,比较麻烦,而我们一直希望在单元方法中无论是否是ajax请求,都使用return语句来完成资源的响应,怎么办?
既然我们希望使用单元方法的返回值来响应ajax请求的处理结果,而目前DispatcherServlet的底层会将单元方法的返回值按照请求转发或者重定向来处理,所以就需要我们告诉DispatcherServlet,单元方法的返回值不要按照请求转发或者重定向处理,而是按照直接响应处理,将单元方法的返回值直接响应给浏览器。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
/*
* @ResponseBody
* 1方法的返回值不在作为界面跳转依据,而已直接作为返回的数据
* 2将方法的返回的数据自动使用ObjectMapper转换为JSON
*/
@ResponseBody
@RequestMapping("testAjax")
public Pet testAjax(Person p) throws JsonProcessingException {
System.out.println(p);
Pet pet =new Pet("Tom","cat");
return pet;
}
注意:把我们要响应的数据直接return即可,返回值类型为要return的数据类型。
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery.min.js"></script>
<script>
$(function(){
$("#btn").click(function(){
$.get("testAjax",{pname:"小明",page:"10"},function(data){
console.log(data.petName)
console.log(data.petType)
})
})
})
</script>
</head>
<body>
<input id="btn" type="button" value="testJSON">
</body>
</html>
关于 @RestController
相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面
@RestController
public class AjaxController {
/*
* @ResponseBody
* 1方法的返回值不在作为界面跳转依据,而已直接作为返回的数据
* 2将方法的返回的数据自动使用ObjectMapper转换为JSON
*/
@RequestMapping("testAjax")
public Pet testAjax(Person p) throws JsonProcessingException {
System.out.println(p);
Pet pet =new Pet("Tom","cat");
return pet;
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。