SpringMVC(3)
响应数据和结果视图
一、返回值类型分类
1. 返回字符串:
当方法生效,返回"success"
,就会在WEB-INF/pages
下找到对应的success.jsp
,从而跳转到该页面
可以将从数据库查询到的对象存储到Request域对象中,
那么success页面可以根据域对象中的值获得user对象,
进而直接在页面输出user对象的属性。
具体代码:
response.jsp
页面:
<a href="user/testString">testString</a>
UserController
控制器类:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testString")
public String testString(Model model){
System.out.println("testString执行了");
// 模拟从数据库中查询出User对象
User user = new User();
user.setUsername("妹妹");
user.setPassword("123");
user.setAge(20);
// 将数据存储到request域对象
model.addAttribute("user", user);
return "success";
}
}
success.jsp
跳转成功页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>执行成功</h3>
<%-- (1)返回字符串 --%>
${user.username}
${user.password}
</body>
</html>
注意:
在控制器方法中使用Model
将查询的User
对象存储到request域对象
中
那么在success.jsp
跳转成功页面可以获得该request域对象
的值
2. 返回void:
由于没有返回值,默认跳转到请求路径的页面 testVoid.jsp
,而WEB-INF/pages
下并没有对应的jsp页面,所以会报错。
解决办法:
- 请求转发,手动跳转到success页面
- 重定向
- 直接进行响应
具体代码:
response.jsp
页面:
<a href="user/testVoid">testVoid</a>
UserController
控制器类:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception, IOException {
System.out.println("testVoid执行了");
// 1 请求转发
// request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
// 2 重定向
// response.sendRedirect(request.getContextPath()+"/index.jsp");
// 3 直接进行响应
// 解决中文乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("你好");
}
}
注意:
- 请求转发是一次请求,此时不会调用视图解析器,需要写完整的页面路径
- 重定向是两次请求,重新发送了请求,不能直接请求到WEB-INF里面的页面
3. 返回ModelAndView
对象:
(1)ModelAndView.addObject("user", user)
:把user对象存储到mv对象中,底层也会把user对象存储到request域对象
中
(2)ModelAndView.setViewName("success")
:跳转到哪个页面
具体代码:
response.jsp
页面:
<a href="user/testModelAndView">testModelAndView</a>
UserController
控制器类:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView() {
System.out.println("testModelAndView执行了");
// 创建ModelAndView对象
ModelAndView mv = new ModelAndView();
// 模拟从数据库中查询出User对象
User user = new User();
user.setUsername("妹妹");
user.setPassword("456");
user.setAge(20);
// 调用方法
// 1. 把user对象存储到mv对象中,底层也会把user对象存储到request域对象中
mv.addObject("user", user);
// 2. 跳转到哪个页面
mv.setViewName("success");
return mv;
}
}
success.jsp
跳转成功页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>执行成功</h3>
${user.username}
${user.password}
</body>
</html>
二、SpringMVC提供的转发和重定向
此时,视图解析器不可用,必须自己写完整的请求路径
(1)转发:forward
:完整的页面路径
return "forward:/WEB-INF/pages/success.jsp"
(2)重定向:redirect
:只能加webapp
根目录下的jsp页面,访问不到WEB-INF
文件夹里的页面
return "redirect:/index.jsp";
具体代码:
response.jsp
页面:
<a href="user/testForwardOrRedirect">testForwardOrRedirect</a>
UserController
控制器类:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("testForwardOrRedirect执行了");
// 请求的转发
return "forward:/WEB-INF/pages/success.jsp";
// 重定向
// return "redirect:/index.jsp";
}
}
三、ResponseBody响应json数据
-
模拟异步请求响应的步骤:
(1)从前端jsp中获得请求体(前端jsp中的data数据)
(2)@RequestBody:将前端请求体的json字符串转换成JavaBean对象
(3)然后查询数据库操作等
(4)@ResponseBody:将JavaBean对象转换成json字符串 -
效果:
(1)页面:返回数据库操作后的结果 “haha”,“123”,40
(2)后台:返回jsp中data的值 “hehe”,“123”,30 -
注意:
由于在web.xml
中配置了DispatcherServlet
前端控制器,会拦截所有的资源,而通常静态资源是不需要拦截的,所以在springmvc.xml
中告诉前端控制器,哪些静态资源不拦截
springmvc.xml
:
<mvc:resources mapping="/css/**" location="/css/"/> <!-- 样式 -->
<mvc:resources mapping="/images/**" location="/images/"/> <!-- 图片 -->
<mvc:resources mapping="/js/**" location="/js/"/> <!-- javascript -->
response.jsp
页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<%-- ResponseBody响应json数据 --%>
<script src="js/jquery.min.js"></script>
<script>
// 页面加载,绑定单击事件
$(function () {
$("#btn").click(function () {
// alert("hello btn");
// 发送ajax请求
$.ajax({
// 编写json格式,设置属性和值
url:"user/testAjax",
contentType:"application/json;charset=UTF-8",
data:'{"username":"hehe","password":"123","age":"30"}',
dataType:"json",
type:"post",
success:function (data) {
// data:服务器端响应的json数据,进行解析
alert(data);
alert(data.username);
alert(data.password);
alert(data.age);
}
})
});
});
</script>
</head>
<body>
<button id="btn">发送ajax的请求</button>
</body>
</html>
UserController
控制器类:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("testAjax执行了");
// 客户端发送ajax的请求,传递的是json字符串
// 只要jsp中data的key和JavaBean对象的属性名相同,那么后端自动把json字符串封装到user对象中
System.out.println(user);
// 做响应,模拟查询数据库
user.setUsername("haha");
user.setAge(40);
// 做响应,返回给前端,使用@ResponseBody注解将JavaBean对象转换成json字符串
return user;
}
}