请求到达指定控制器后,经过一系列业务处理,最后需要返回指定的页面或者数据,本篇整理所有类型的返回方式
一、返回值为字符串
1.最简单的类型,返回一个字符串文件名相对路径,经过视图解析器,拼接前后缀找到指定文件,响应给前台:
/**
* 返回的字符串经过视图解析器,拼接前缀后缀,找到对应文件后,进行相应
* @return 文件名
*/
@RequestMapping("/testReturnString/page")
public String page(Model model){
model.addAttribute("test","test");
return "success";//返回值经视图解析器,拼接前后缀,找到指定文件名
}
2.返回一个字符串,但该字符串的以“forward:“开头(不经过视图解析器):
/**
* 用关键字做转发
* 注:过程不会经过视图解析器,所以不会拼接配置好的前缀和后缀,因而要写完整的路径名
* @return "forward:"+跳转地址完整路径名;
*/
@RequestMapping("/testReturnString/dispatcher")
public String dispatcher(){
return "forward:/WEB-INF/pages/success.jsp";
}
3.返回一个字符串,该字符串的以“redirect:“开头(不经过视图解析器,但会在url前部自动拼接请求路径):
/**
* 用关键字做重定向
* 注:
* 1.过程不会经过视图解析器,所以不会拼接配置好的前缀和后缀,
* 2.重定向是前台重新发起请求,如果直接返回WEB-INF中的页面,会被拦截,所以要么请求controller,要么返回webapp下的文件
* 3.通过此种方式返回的页面不需要在资源前拼接请求ip端口等信息,相当于spring自动添加HttpServletRequest.getContextPath()
* @return "redirect:"+跳转地址完整路径名;
*/
@RequestMapping("/testReturnString/redirect")
public String redirect(){
return "redirect:/success.jsp";
}
二、返回值空(void)
1.所请求的方法未做任何处理,会将请求的url,即映射路径,直接返回给视图解析器,拼接前后缀,去找该页面
/**
* 方法内没有任何内容,结果相当于返回了字符串:"/testReturnVoid/getVoid"(也就是请求的映射),经过视图解析器拼接前后缀后的这个文件
*/
@RequestMapping("/testReturnVoid/getVoid")
public void getVoid(){
}
2.通过HttpServletRequest实现请求转发(这种方式不经过视图解析器,所以要写文件的完整路径):
/**
* 通过最原始的方式进行请求转发
*/
@RequestMapping("/testReturnVoid/dispatcher")
public void dispatcher(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
return;
}
3.通过HttpServletResponse进行请求重定向(需注意,重定向为再次请求,需写控制器的映射路径或可直接访问的文件名)
/**
* 通过最原始的方式进行重定向
*/
@RequestMapping("/testReturnVoid/redirect")
public void redirect(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.sendRedirect(request.getContextPath()+"/success.jsp");
return;
}
三、返回ModelAndView对象
该对象由spring提供,通过给该对象数据、页面,该对象通过视图解析器进行页面查找和数据渲染。
实际一、1中返回字符串最后也是经过ModelAndView处理的:
model.addAttribute("test","test"); 等同于 modelAndView.addObject("test","test");
return "success" 等同于 modelAndView.setViewName("success");
/**
* 通过返回ModelAndView对象,经过视图解析器,获得该对象中的model(数据),以及viewName(页面),经过视图解析器进行跳转
* @return
*/
@RequestMapping("/testReturnVoid/modelAndView")
public ModelAndView modelAndView(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("user",new Studet("张三","123"));//给数据
modelAndView.setViewName("success");//给页面
return modelAndView;
}
四、返回数据对象
前台通过ajax向后台传输json格式的数据、后台以json格式的数据响应给前台,都要通过格式转换工具,实现json与javabean之间的互相转化:
1.首先要导入对json数据进行转化的依赖,实现json与javabean之间的转化
<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>
2.接收ajax请求的参数使用@RequestBody修饰,就可通过jackson的jar进行格式转换,即ajax提交的json字符串,会根据键值对,匹配到对象对应的属性中。
3.ajax接受返回值类型为json,通过@ResponseBody修饰方法或者修饰方法的返回值,即可将方法的返回值由对象转化为json字符串,返回给对应的ajax请求,ajax的success回调函数可对json对象进行解析。
js中的ajax请求:
$.ajax({
url : "user/testReturnVoid/getData",
contentType : "application/json;charset=UTF-8",
data : '{"username":"123"}',
dataType : "json",
type : "post",
success:function (data) {
alert(data.username);
alert(data.passworld);
alert(data.date);
}
})
controller:
@ResponseBody
@RequestMapping("/testReturnVoid/getData")
public Studet getData(@RequestBody Studet student){//接收的json字符串经过@RequestBody转化为对象
Studet studet = new Studet();
studet.setUsername("张三");
studet.setPassworld("123");
studet.setDate(new Date());
return studet;//返回的对象经过@ResponseBody转化为json
}