本文主要参考:精通Spring 4.x ――企业应用开发实战 陈雄华 著 。有兴趣的读者可以搜索阅读
总结返回值之前先简要回顾下spring mvc的工作原理,对返回值的理解有一些帮助:
spring mvc 的框架结构: (图片来自网络)
1、用户在浏览器发送页面地址请求到java代码程序中,spring mvc中的dispatcherServlet控制器负责总调度 2、根据用户的地址请求对应寻找处理器映射器handlermapping,大概就是代码中的@requestmapping, 3、4、处理器映射器找到对应的处理器handler,大概就是代码中对应的类的具体方法,期间要经过处理器适配器handleradapter(这是细节,不必在意), 5、处理器经过一番处理,就是具体方法中的业务处理,返回一个逻辑视图和模型ModelandView给调度中心dispatcherServlet, 6、注意第5步只是逻辑视图,还需要经过一步视图解析器viewResolver,把逻辑二字去掉,变成真正的视图view,并且渲染模型数据 7、8渲染模型之后,变成真实视图就返回给前端浏览器用户那里去进行渲染,展示给用户看
名称解析: DispatcherServlet:前端控制器(可以理解为调度中心) 用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。 HandlerMapping:处理器映射器 HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。 Handler:处理器 Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。 由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
HandlAdapter:处理器适配器 通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
View Resolver:视图解析器 View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 View:视图 springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。 一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
———————文艺的昏割线——————————————–
而本文的spring mvc的几种返回值的总结正是描述的上述spring mvc作用中的第5步,处理器经过处理之后可以返回的几种不同的东西;根据博主目前的水准,大概知道有这么几种:
1、String(包含传入参数是@ModelAttribute,实体类,Model,Map,ModelMap,简单数据)(实际开发中的多用这个) 返回的字符串即逻辑视图名,这是开发中最常用且多变化的部分
@ModelAttribute既可以绑定在方法上(请看3部分),也可以绑定在方法入参的实体类中(不常用),其实绑定在实体类中,可以直接用实体类名来和前端匹配即可;
@Controller @RequestMapping("/user") public class UserController { .............. @RequestMapping(value = "/handle62") public String handle62(@ModelAttribute("user") User user) { user.setUserName("tom"); return "/user/showUser"; } }这里入参去掉@ModelAttribute(“user”),让前端界面的参数和User.java中的属性名一致,即可注入模型中,前端界面就可以用${user.username}了,即User.java中的属性名
Model,Map,ModelMap这三者其实都差不多,ModelMap实现了Map的接口,使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap。
@RequestMapping(value = "/handle63") public String handle63(ModelMap modelMap) { User user = (User) modelMap.get("user"); user.setUserName("tom"); modelMap.addAttribute("testAttr", "value1"); return "/user/showUser"; }参数类型推荐使用包装数据类型,因为基础数据类型不可以为null 整型:Integer、int 字符串:String 单精度:Float、float 双精度:Double、double 布尔型:Boolean、boolean
使用@RequestParam常用于处理简单类型的绑定,可以指定名字
public String editItem(@RequestParam(value="item_id", required=true) String id) { ............. }2、ModelAndView:(不常用) 在处理方法体中,可以使用如下方法添加模型数据: ModelAndView addAllObjects(Map String,?> modelMap) ModelAndView addObject(String attributeName, Object attributeValue)
可用通过如下方法设置视图: void setView(Object view):指定一个具体的视图对象 void setViewName(String viewName) :指定一个逻辑视图名
@Controller @RequestMapping("/user") public class UserController { .............. public ModelAndView createUser(User user) { userService.createUser(user); ModelAndView mav = new ModelAndView(); mav.setViewName("user/createSuccess"); mav.addObject("user", user); return mav; } }这样在createSuccess.jsp界面上就可以使用${user}变量 3、实体类 @ModelAttribute可以绑定在方法上,这样在每次执行UserController中的任何一个请求处理方法前,spring mvc先执行该方法,并将返回值以user为键添加到模型中去
@Controller @RequestMapping("/user") public class UserController { .............. @ModelAttribute("user") public User getUser() { User user = new User(); user.setUserId("1001"); user.setUserName("<>"); return user; } } }还有一种实体类是返回json对象,这里要用到@ResponseBody,springmvc自动将对象转化为json对象,要注意区别json对象和json字符串http://blog.csdn.net/qianyiyiding/article/details/51615961
@Controller @SpringBootApplication public class Demo2Application { ....... @ResponseBody @RequestMapping("/hello") public Person index2(String name){ return new Person("hell",22); } }浏览器访问http://localhost:8080/hello,得到{“name”:”hell”,”age”:22} 常用于ajax传值
4、void(不常用) 逻辑上也可以返回void,即什么都不返回,但是貌似这样做没什么意义 5、@SessionAttribute 能够在多个请求之间共用摸个模型的属性数据