无返回值_修炼SpringMVC-注解开发-处理器方法的返回值

本文详细介绍了SpringMVC中注解开发处理器方法的四种常见返回值类型:ModelAndView、String、void和自定义对象(Object)。返回ModelAndView适用于跳转并传递数据,返回String则用于指定逻辑视图名,无返回值void常用于ServletAPI操作和Ajax响应,而返回自定义对象需结合@ResponseBody将数据转化为Json响应给浏览器。文章通过实例演示了每种返回值类型的使用方法和应用场景。
摘要由CSDN通过智能技术生成

上一篇:《修炼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);    });}
f59d21aff7390b078cf54a236bf80406.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值