SpringMVC 从入门到精通系列 04——响应数据和结果视图
Posted Xiu Yan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC 从入门到精通系列 04——响应数据和结果视图相关的知识,希望对你有一定的参考价值。
一、 返回值分类
1.1 返回字符串
-
Controller 方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。
@RequestMapping(value="/hello") public String sayHello() { System.out.println("Hello SpringMVC!!"); // 跳转到 success.js p页面 return "success"; }
-
具体的应用场景
jsp:
<a href="user/testString">testString</a>
Controller:
@Controller @RequestMapping(path = "/user") public class UserController { /** * 返回字符串 * @param model * @return */ @RequestMapping("/testString") public String testString(Model model){ System.out.println("testString方法执行了"); //模拟从数据库中查询出user对象 User user = new User(); user.setUsername("admin"); user.setPassword("111"); user.setAge(13); model.addAttribute("user", user); return "success"; } }
成功页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <h3>成功页面</h3> ${user.username} ${user.password} ${user.age} </body> </html>
测试结果:
1.2 返回值是 void
-
如果控制器的方法返回值编写成 void,执行程序报404的异常(也有可能是空白页面),默认查找JSP页面没有找到。
原因:默认会跳转到 @RequestMapping(value="/initUpdate") initUpdate的页面。 -
可以使用请求转发或者重定向跳转到指定的页面
-
代码如下:
jsp:
<a href="user/testVoid">testVoid</a>
Controller:
@RequestMapping("/testVoid") public void testVoid(HttpServletRequest request, HttpServletResponse response)throws Exception{ System.out.println("testVoid方法执行了"); System.out.println(request.getContextPath()); //跳转到成功页面 //请求转发 //request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response); //重定向不能访问wen-inf下面的文件 //跳转到其他界面 request.getRequestDispatcher("/index.jsp").forward(request, response); response.sendRedirect(request.getContextPath()+"/index.jsp"); //设置中文乱码 response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8");//浏览器解析 //直接会进行响应 response.getWriter().print("你好"); return; }
注意:用转发和重定向用不了视图解析器,因此需要常规处理。
1.3 返回值是ModelAndView对象
-
ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图
-
具体的代码如下
jsp:
<a href="user/testModelAndView">testModelAndView</a>
Controller:
@RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ System.out.println("testModelAndView方法执行了"); //创建 ModelAndView 对象 ModelAndView mv = new ModelAndView(); User user = new User(); user.setUsername("xiuyan"); user.setPassword("222222"); user.setAge(13); //把user对象存储到mv对象中,也会把user对象存入到request对象中 mv.addObject(user); //跳转 mv.setViewName("success"); return mv; }
测试结果:
二、SpringMVC框架提供的转发和重定向
1.1 forward 请求转发
controller 方法返回 String类型,想进行请求转发也可以编写成:
/**
* "forward:转发的JSP路径",不走视图解析器了,所以需要编写完整的路径
*/
@RequestMapping("/testForward")
public String testForward(){
System.out.println("testForwardOrRedirect方法执行了");
//请求转发
//转发到成功页面
//return "forward:/WEB-INF/pages/success.jsp";
//转到其他页面
//return "forward:/index.jsp";
//其他请求
return "forward:/user/testString";
}
2.2 redirect 重定向
@RequestMapping("/testRedirect")
public String testRedirect(){
System.out.println("testForwardOrRedirect方法执行了");
//重定向
return "redirect:/user/testString";
//return "redirect:/index.jsp";
}
三、ResponseBody 响应 json 数据
3.1 响应json数据之过滤静态资源
DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。解决问题就是需要配置静态资源不进行拦截,在 springmvc.xml 配置文件添加如下配置
-
mvc:resources标签配置不过滤
- location 元素表示 webapp 目录下的包下的所有文件
- mapping 元素表示以 /static 开头的所有请求路径,如 /static/a 或者/static/a/b
<!--告诉前端控制器,哪些资源不拦截--> <mvc:resources location="/css/" mapping="/css/**"/> <!-- 样式 --> <mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 --> <mvc:resources location="/js/" mapping="/js/**" /><!--javascript-->
3.2 使用 @RequestBody 获取请求体数据
$(function () {
$('#btn').click(function () {
//发送ajax请求
$.ajax({
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"username":"hehe", "password":"123", "age":12}',
dataType:"json",
type:"post",
success:function (data) {
//data服务器响应的json数据,进行解析
alert(data.username);
alert(data.password);
alert(data.age);
}
})
});
});
@RequestMapping("/testAjax")
public void testAjax(@RequestBody String body){
System.out.println("testAjax方法执行了");
System.out.println(body);
}
测试结果:
3.3 使用 @RequestBody 注解把 json 的字符串转换成 JavaBean 的对象
@RequestMapping("/testAjax")
public void testAjax(@RequestBody User user){
System.out.println("testAjax方法执行了");
System.out.println(user);
}
测试结果:
3.4 使用 @ResponseBody 注解把 JavaBean 对象转换成 json 字符串,直接响应
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("testAjax方法执行了");
System.out.println(user);
user.setUsername("xiuyan");
user.setAge(40);
return user;
}
3.5 json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
以上是关于SpringMVC 从入门到精通系列 04——响应数据和结果视图的主要内容,如果未能解决你的问题,请参考以下文章
SpringMVC 从入门到精通系列 01——SpringMVC 概述与入门案例
SpringMVC 从入门到精通系列 05——SpringMVC 实现文件上传
SpringMVC 从入门到精通系列 02——请求参数的绑定