实际开发中我们用springmvc时,很多情况下返回值都会是string类型的,但是springmvc如何区分控制器返回的是页面还是数据呢?
1、@ResponseBody注解作用该注解用于将Controller方法返回的对象,通过适当的HttpMessageConverter转化为指定格式后,写入到Response对象的body数据区。
使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json,xml等)
需要注意的是在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据
示例代码:
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 返回login登陆页面
* */
@RequestMapping(value="/login",method=RequestMethod.GET)
public String login(HttpServletRequest request){
return "login";
}
/**
* 返回"loginSuccess"字符串
* */
@RequestMapping(value="/loginSuccess",method=RequestMethod.GET)
@ResponseBody
public String loginSuccess(HttpServletRequest request){
return "loginSuccess";
}
/**
* 返回"loginError"字符串
* */
@RequestMapping(value="/loginError",method=RequestMethod.GET)
public @ResponseBody String loginError(HttpServletRequest request){
return "loginError";
}
}
上面的代码中:
login方法返回login登陆页面
loginSuccess方法返回字符串"loginSuccess"
loginError方法返回字符串"loginError"
三个方法的返回对象都是String类型的,SpringMVC框架是如何区分返回的是页面还是字符串呢?这就是@ResponseBody注解的作用了
2、springmvc 除了支持string还支持的返回方式:ModelAndView,Model,Map,void等。
Map时
@RequestMapping("/demo2/show")
public Map<String, String> getMap() {
Map<String, String> map = new HashMap<String, String>();
map.put("key1", "value-1");
map.put("key2", "value-2");
return map;
}
在jsp页面中可直通过${key1}获得到值, map.put()相当于request.setAttribute方法。
void 时
如果返回值为空,则响应的视图页面对应为访问地址
@RequestMapping("/index")
public void index() {
return;
}
对应的逻辑视图名为"index"
3、小结:(1)使用 String 作为请求处理方法的返回值类型是比较通用的方法,这样返回的逻辑视图名不会和请求 URL 绑定,具有很大的灵活性,而模型数据又可以通过 ModelMap 控制。
(2)使用void,map,Model 时,返回对应的逻辑视图名称真实url为:prefix前缀+视图名称 +suffix后缀组成。
(3)使用String,ModelAndView返回视图名称可以不受请求的url绑定,ModelAndView可以设置返回的视图名称。
—— @author lei.s