Controller中方法的返回值(下)

返回void

如果你不用spring mvc帮你完成资源的跳转,此时可以将controller中的方法返回值设置为void。一般情况下有下面两个应用场景:

  • 通过原始的servlet来实现跳转
  • ajax响应

先来看第一个,使用servlet来实现跳转,spring mvc底层就是servlet,因此我们可以在controller中使用servlet中的方法来实现页面的跳转,参数的传递。

package com.monkey1024.controller;

import com.monkey1024.bean.School;
import com.monkey1024.bean.Student;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 方法返回void
 */
@Controller
public class ReturnVoidController01 {

    @RequestMapping("returnVoid")
    public void welcome(HttpServletRequest request, HttpServletResponse response, Student student) throws Exception{

        request.setAttribute("student", student);

        //因为使用servlet中的api,所以视图解析就不能使用了
        request.getRequestDispatcher("/jsp/welcome.jsp").forward(request,response);

    }


}

上面的写法跟之前在servlet中是一样的。

再来看下ajax响应,编写前台页面

<html>
<head>
    <title>Title</title>
    <script src="/js/jquery-3.3.1.js"></script>
</head>
<body>
    <button id="ajaxRequest">提交</button>
</body>
<script>
    $(function () {
       $("#ajaxRequest").click(function () {
           $.ajax({
               method:"post",
               url:"/ajaxRequest",
               data:{name:"monkey",age:18},
               dataType:"json",
               success:function (result) {
                   console.log(result.name + "," + result.age);
               }
           });
       });
    });

</script>
</html>

创建Controller,这里使用了fastjson,所以需要将fastjson的jar包导入到项目中:

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.46</version>
</dependency>

在Controller中添加下面方法

@RequestMapping("/ajaxRequest")
public void ajaxRequest(HttpServletRequest request, HttpServletResponse response, Student student) throws Exception{

    PrintWriter out = response.getWriter();
    String jsonString = JSON.toJSONString(student);

    out.write(jsonString);
}

返回Object类型

倘若需要controller中的方法返回Object类型,需要先配置下面内容:

  • 添加jackson的jar依赖,在Spring mvc中使用了jackson来进行json数据格式的转换。

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.4</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.4</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.4</version>
    </dependency>
    
  • 在springmvc.xml文件中添加注解驱动。

    <mvc:annotation-driven/>

上面两个配置缺一不可。

返回字符串

之前在controller方法中返回字符串,spring mvc会根据那个字符串跳转到相应的页面中。这里返回的字符串会添加到响应体中传递到前台页面中,此时需要在方法上添加一个注解@ResponseBody即可。

package com.monkey1024.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 方法返回Object类型
 */
@Controller
public class ReturnObjectController01 {

    @RequestMapping(value = "/returnString")
    @ResponseBody
    public Object returnString() throws Exception{

        return "小猴子1024";

    }

}

在前台页面中发送ajax请求:

<html>
<head>
    <title>Title</title>
    <script src="/js/jquery-3.3.1.js"></script>
</head>
<body>
    <button id="ajaxRequest">提交</button>
</body>
<script>
    $(function () {
       $("#ajaxRequest").click(function () {
           $.ajax({
               method:"post",
               url:"/returnString",
               success:function (result) {
                   console.log(result);
               }
           });
       });
    });

</script>
</html>

上面的程序在执行结束后会出现乱码,此时需要在@RequestMapping中添加produces属性:

@Controller
public class ReturnObjectController01 {

    @RequestMapping(value = "returnString", produces = "text/html;charset=utf-8")
    @ResponseBody
    public Object returnString() throws Exception{

        return "小猴子1024";

    }

}

返回map类型

创建controller:

@Controller
public class ReturnObjectController01 {

    @RequestMapping("returnString")
    @ResponseBody
    public Object returnString() throws Exception{

        Map<String, String> map = new HashMap<>();
        map.put("hello", "你好");
        map.put("world", "世界");


        return map;

    }

}

jsp中添加ajax:

$(function () {
       $("#ajaxRequest").click(function () {
           $.ajax({
               method:"post",
               url:"/returnString",
               success:function (result) {
                   console.log(result.hello);
               }
           });
       });
    });

除了这些之外还可以返回其他类型:List,自定义类型等,此时spring mvc会将这些数据转成json格式再发送到前端