上一篇:《修炼SpringMVC-注解开发-处理器的请求参数配置》
如果文中有纰漏,请多多指正!!!
使用@Controller注解,注解的处理器,其内部方法常用返回值大致总结为以下4种类型:
- 返回ModelAndView类型
- 返回String类型
- 无返回值void
- 返回自定义类型对象(Object)
下面我们将逐一讲解。
1.返回ModelAndView类型
关于ModelAndView类型,我们可以理解其是由两部分组成:Model(模型即要传递的数据)和View(要跳转的资源视图)。
如果处理器方法处理完成后,需要跳转其它资源,并且需要在跳转的资源之间传递数据,此时方法返回ModelAndView类型最合适不过。
如果处理器方法只进行跳转而不传递数据,或者只传递数据而不向任何资源跳转(如Ajax异步响应),此时返回ModelAndView,不是Model多余就是View多余。
2.返回String类型
处理器方法返回String类型,我们可以为其指定逻辑视图名,通过视图解析器可以将其转换为物理视图地址。根据跳转资源定义方式的不同,可以将返回的视图名划分为
- 返回内部资源逻辑视图名称
- 返回View对象名
2.1)返回内部资源逻辑视图名称
如果我们要跳转的资源为内部资源,则视图解析器可以使用InternalResourceViewResolver内部资源视图解析器。此时处理器方法返回的字符串就是要跳转的页面的文件名。与视图解析器中prefix、suffix相结合,形成要访问的URI。
如果我们不配置使用视图解析器,则处理器方法可直接返回资源的物理视图名。
例如,我们要访问/WEB-INF/index.jsp
- xml配置
- 处理器方法
@Controller@RequestMapping("/test")public class HelloController { @RequestMapping("/index.do") public String toIndex() throws Exception { return "index"; }}
如果我们直接返回资源的物理视图名,xml配置就无需在配置InternalResourceViewResolver视图解析器。处理器方法直接返回资源的物理视图名即可即return "/WEB-INF/index.jsp"
2.2)返回View对象名
如果我们将要跳转的资源配置为视图对象,那么处理器返回的字符串就是要跳转资源视图View的名称,此时我们可以使用解析器BeanNameViewResolver或XmlViewResolver、ResourceBundleViewResolver。
例:
- 配置视图解析器:
- 配置资源视图View:
- 处理器方法
@Controller@RequestMapping("/test")public class HelloController { @RequestMapping("/index.do") public String toIndex() throws Exception { //return "innerResource"; return "outerResource"; }}
3.无返回值void
对于无返回值的应用场景,最主要的有两类:
- 通过ServletAPI传递数据并完成跳转
- Ajax响应
3.1)通过ServletAPI传递数据并完成跳转
此应用场景是通过在处理器方法中放入ServletAPI参数,来完成资源跳转以及传递数据,通俗来讲,就和我们之前进行Servlet编程一样。
举例说明:
- xml配置
- 处理器方法(访问/WEB-INF/index.jsp)
@Controller@RequestMapping("/test")public class HelloController { @RequestMapping("/index.do") public void toIndex(HttpServletRequest request, HttpServletResponse response) throws Exception { //请求转发 request.setAttribute("a", "aaa"); request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response); //重定向 //response.sendRedirect(request.getContextPath()+"/index.jsp"); }}
3.2)Ajax响应
如果处理器对请求处理后,无需跳转其它任何资源,例如Ajax响应,此时可以让处理器方法的返回值为void。
举例
- xml配置
- 处理器
@Controller@RequestMapping("/test")public class HelloController { @RequestMapping("/ajax.do") public void ajaxDeal(HttpServletResponse response,String name) throws Exception { response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); out.print(name); out.close(); }}
- jsp页面
WebContent
4.返回自定义类型对象(Object)
关于处理器方法返回Object对象。但是不是作为逻辑视图出现的,而是作为直接在页面显示的数据出现的。
返回Object对象,需要使用@ResponseBody注解,将转换后的Json数据放入到响应体中。
由于返回Object数据,一般都是将数据转换成Json对象后传给浏览器,这个转换过程是由Jackson工具完成,需要导入相关的jar包(实际开发中版本可能不一样):
jackson-annotations-2.5.0.jarjackson-core-2.5.0.jarjackson-databind-2.5.0.jar
同时还需要配置注解驱动:。
举例:
- xml配置
- 处理器
@RequestMapping("/object.do")@ResponseBodypublic Object object(HttpServletResponse response,String name) throws Exception { return 22;}
- jsp页面
WebContent
注意:关于Object,其
4.1)可以是数值型对象
例:Integer、Long 等
4.2)可以是字符串对象
字符串含有中文时,接收方可能会出现乱码,此时需要在注解`@RequestMapping`的produces属性中指定字符集:@RequestMapping(value="/object.do",produces="text/html;charset=utf-8")
4.3)可以是自定义对象
- 自定义对象
//教育程度public class Educational { private String schoolName;//学校名称 //setter and getter}
- 处理器返回
此时配置produces="text/html;charset=utf-8"将会出现406.如果出现乱码,我们需要将text/html改成application/json.
@RequestMapping(value="/object.do") @ResponseBody public Object object(HttpServletResponse response) throws Exception { return new Educational("本科"); }
- 页面回调函数处理
success:function(data){ alert(data.schoolName);}
4.4)可以是Map对象
- 自定义Map
@RequestMapping(value="/object.do")@ResponseBodypublic Object object(HttpServletResponse response) throws Exception { Map map = new HashMap(); map.put("key1", 22); map.put("key2", new Educational("博士")); return map;}
- 页面回调函数处理
success:function(data){ alert(data.key1); alert(data.key2.schoolName);}
4.5)可以是List对象
- 自定义List
@RequestMapping(value="/object.do")@ResponseBodypublic Object object(HttpServletResponse response) throws Exception { List list = new ArrayList(); list.add("1"); list.add(new Educational("博士")); return list;}
- 页面回调函数处理(示例)
success:function(data){ $(data).each(function(index){ if(index == 0) alert(data[index]); if(index == 1) alert(data[index].schoolName); });}