SpringMVC第三弹。

SpringMVC-3-响应数据与文件上传

1. 响应数据

在使用SpringMVC响应数据时,控制器(controller)的返回值可以有三种。

  1. 字符串

    controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @RequestMapping("/sayHello")
    public String sayHello(HttpServletRequest request, HttpServletResponse response){
    System.out.println("sayHello方法执行了");
    User user = new User();
    user.setUsername("Tobing");
    user.setPassword("root");
    user.setAge(19);
    request.setAttribute("user",user);
    return "success"; // 此处转发到success.jsp
    }

    执行原理

    字符串响应

  2. void

    可以使用Servlet原生的API作为控制器参数,通过request和response对象进行转发重定向

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @RequestMapping("/sayVoid")
    public void sayVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
    System.out.println("sayVoid方法执行了");
    //1.使用request转向页面
    //request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
    //2.通过Response页面重定向
    //response.sendRedirect("sayHello");
    //3.通过request直接写入响应结果
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/json;charset=utf-8");
    response.getWriter().write("Hello World!!!");
    }
  3. ModelAndView

    SpringMVC还提供ModelAndView对象可以用作控制器返回值。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @RequestMapping("/testReturnModelAndView")
    public ModelAndView testReturnModelAndView(){
    System.out.println("testReturnModelAndView方法执行了");
    ModelAndView mv = new ModelAndView();
    User user = new User();
    user.setUsername("Tobing");
    user.setPassword("root");
    user.setAge(19);
    mv.addObject("user",user);
    mv.setViewName("success"); // 设置逻辑视图名称,视图解析器会根据名称前往指定视图
    return mv;
    }

    ModelAndView对象提供addObject方法可以将Object类型的对象封装到request域中。同时提供setViewName方法设置逻辑视图名称,这时视图解析器就可以根据名前往指定视图。

  4. 转发和重定向

    controller方法在使用String返回值时,支持使用forward(转发)和redirect(重定向)关键字进行响应。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @RequestMapping("testForwardOrRedirect")
    public String testForwardOrRedirect(HttpServletRequest request){
    User user = new User();
    user.setUsername("actogo");
    user.setPassword("root");
    user.setAge(19);
    //return "forward:/WEB-INF/pages/success.jsp"; // 相当于request.getRequestDispatchet("url").forward(request,response);
    return "redirect:sayHello";
    }

2. 响应json数据

前端页面的ajax请求,发送json数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<body>
<script>
$(function(){
$("#btn").click(function(){ // 点击按钮发送ajax请求
$.ajax({
url:"user/testJson", // 设置请求url
//设置数据类型
contentType:"application/json;charset=UTF-8",
//设置数据
data:'{"username":"hehe","password":"123","age":30}',
dataType:"json", // 数据封装类型
type:"post", // 数据提交方式
success:function(data){
// data:服务器端响应的json的数据,进行解析
alert(data.username);
alert(data.password);
alert(data.age);
}
});

});
});
</script>
<button id="btn">提交</button>
</body>

后端控制器使用RequestBody注解将json数据封装到指定JavaBean,使用ResponseBody注解将返回的JavaBean封装为json返回。

1
2
3
4
5
6
7
8
9
10
11
@RequestMapping("testJson")
public @ResponseBody User testJson(@RequestBody User user) {
// 输出RequestBody封装的JavaBean
System.out.println(user);
// 处理数据
user.setUsername("actogo");
user.setAge(20);
user.setPassword("root");
// 返回数据
return user;
}

3. SpringMVC实现文件上传

评论