SpringMVC的Controller控制器返回值详解简介
对于springMVC处理⽅法⽀持⽀持⼀系列的返回⽅式:
1. ModelAndView
2. Model
3. ModelMap
4. Map
5. View
6. String
7. Void
具体介绍
mvc的controller详细介绍每⼀个返回类型的各个特点;
ModelAndView
1@RequestMapping(method=RequestMethod.GET)
2public ModelAndView index(){
3ModelAndView modelAndView = new ModelAndView("/user/index");
4modelAndView.addObject("xxx", "xxx");
5return modelAndView;
6}
通过ModelAndView构造⽅法可以指定返回的页⾯名称,也可以通过setViewName()⽅法跳转到指定的页⾯ ,
使⽤addObject()设置需要返回的值,addObject()有⼏个不同参数的⽅法,可以默认和指定返回对象的名字。
调⽤addObject()⽅法将值设置到⼀个名为ModelMap的类属性,ModelMap是LinkedHashMap的⼦类,
具体请看类。
1@RequestMapping(method=RequestMethod.GET)
2public ModelAndView index(){
3ModelAndView modelAndView = new ModelAndView();
4modelAndView.addObject("xxx", "xxx");
5modelAndView.setViewName("/user/index");
6return modelAndView;
7}
对于ModelAndView类的属性和⽅法
Model
⼀个模型对象,主要包含封装好的model和modelMap,以及.util.Map,当没有视图返回的时候视图名称
将由requestToViewNameTranslator决定;Model 是⼀个接⼝, 其实现类为ExtendedModelMap,继承了ModelMap类。
ModelMap
待续
Map
1@RequestMapping(method=RequestMethod.GET)
2public Map<String, String> index(){
3Map<String, String> map = new HashMap<String, String>();
4map.put("1", "1");
5//map.put相当于request.setAttribute⽅法
6return map;
7}
PS:响应的view应该也是该请求的view。等同于void返回。
Java代码
1. @RequestMapping("/demo2/show")
2.    publicMap<String, String> getMap() {
3.        Map<String, String> map = newHashMap<String, String>();
4.        map.put("key1", "value-1");
5.        map.put("key2", "value-2");
6.        returnmap;
7.    }
在jsp页⾯中可直通过${key1}获得到值, map.put()相当于request.setAttribute⽅法。
写例⼦时发现,key值包括 - . 时会有问题.
View
这个时候如果在渲染页⾯的过程中模型的话,就会给处理器⽅法定义⼀个模型参数,然后在⽅法体⾥⾯往模型中添加值。可以返回
pdf excel等,暂时没详细了解。
String
对于String的返回类型,笔者是配合Model来使⽤的;
1@RequestMapping(method = RequestMethod.GET)
2public String index(Model model) {
3String retVal = "user/index";
4List<User> users = Users();
5model.addAttribute("users", users);
6
7return retVal;
8}
或者通过配合@ResponseBody来将内容或者对象作为HTTP响应正⽂返回(适合做即时校验);
1@RequestMapping(value = "/valid", method = RequestMethod.GET)
2public@ResponseBody
3String valid(@RequestParam(value = "userId", required = false) Integer userId,
4@RequestParam(value = "logName") String strLogName) {
5return String.valueOf(!userService.isLogNameExist(strLogName, userId));
6
7}
ps:返回字符串表⽰⼀个视图名称,这个时候如果需要在渲染视图的过程中需要模型的话,就可以给处理器添加⼀个模型参数,然后在⽅法体往模型添加值就可以了,
String 指定返回的视图页⾯名称,结合设置的返回地址路径加上页⾯名称后缀即可访问到。
注意:如果⽅法声明了注解@ResponseBody ,则会直接将返回值输出到页⾯。
例如:
Java代码
1. @RequestMapping(value = "/something", method = RequestMethod.GET)
2. @ResponseBody
3. publicString helloWorld()  {
4. return"Hello World";
5. }
上⾯的结果会将⽂本"Hello World "直接写到http响应流。
Java代码
1. @RequestMapping("/welcome")
2. publicString welcomeHandler() {
3.  return"center";
4. }
返回字符串代表的意义:
1):字符串代表逻辑视图名
真实的访问路径=“前缀”+逻辑视图名+“后缀”
注意:如果返回的String代表逻辑视图名的话,那么Model的返回⽅式如下:
public String testController(Model model){
model.addAttribute(attrName,attrValue);//相当于ModelAndView的addObject⽅法
return "逻辑视图名";
}
2):代表redirect重定向
redirect的特点和servlet⼀样,使⽤redirect进⾏重定向那么地址栏中的URL会发⽣变化,同时不会携带上⼀次的request 案例:
public String testController(Model model){
return "redirect:path";//path代表重定向的地址
}
3):代表forward转发
通过forward进⾏转发,地址栏中的URL不会发⽣改变,同时会将上⼀次的request携带到写⼀次请求中去
案例:
public String testController(Model model){
return "forward:path";//path代表转发的地址
}
详细例⼦参考:blog.csdn/u011001084/article/details/52847174
Void
当返回类型为Void的时候,则响应的视图页⾯为对应着的访问地址
01@Controller
02@RequestMapping(value="/type")
03public class TypeController extends AbstractBaseController{
04
05@RequestMapping(method=RequestMethod.GET)
06public void index(){
07ModelAndView modelAndView = new ModelAndView();
08modelAndView.addObject("xxx", "xxx");
09}
10}
返回的结果页⾯还是:/type
PS:这个时候我们⼀般是将返回结果写在了HttpServletResponse 中了,如果没写的话,spring就会利⽤RequestToViewNameTranslator 来返回⼀个对应的视图名称。如果这个时候需要模型的话,处理⽅法和返回字符串的情况是相同的。
⼩结:
1.使⽤ String 作为请求处理⽅法的返回值类型是⽐较通⽤的⽅法,这样返回的逻辑视图名不会和请求 URL 绑定,具有很⼤的灵活性,⽽模型数据⼜可以通
过 ModelMap 控制。
2.使⽤void,map,Model 时,返回对应的逻辑视图名称真实url为:prefix前缀+视图名称 +suffix后缀组成。
3.使⽤String,ModelAndView返回视图名称可以不受请求的url绑定,ModelAndView可以设置返回的视图名称。
Model model,HttpServletRequest request, ModelMap map声明变量
request.setAttribute("test", "haiwei1request");
map.addAttribute("test", "haiweiModelMap");
model.addAttribute("test", "haiweiModel");
我通过${test}这个⽅式取值,优先取Model和ModelMap的,Model和ModelMap是同⼀个东西,谁最后赋值的就取谁的,然后是request,最后是从session中获取