响应数据和结果视图
1、返回值分类
1.1、返回字符串
Controller方法返回字符串可以制定逻辑视图的名称,根据视图解析器为物理视图的地址。
主界面发送链接交于后端的控制器
<a href="user/testString">testString</a>
后端控制器Controller接收到前端的请求然后处理数据。
@Controller
@RequestMapping("/user")
@SessionAttributes
public class UserController {
/*
* 返回一个字符串类型的,数据获取到,之后,再将user对象储存在model的request域中,前端获取到之后即可直接使用。
* */
@RequestMapping("/testString")
public String testString(Model model){
System.out.println("testString执行了");
//模拟从数据库中查询出User对象
User user = new User();
user.setUsername("妹妹");
user.setPassword("123");
user.setAge(30);
model.addAttribute("user",user);
return "success";
}
}
User类
package cn.itcast.domain;
import java.io.Serializable;
public class User implements Serializable {
private String username;
private String password;
private Integer age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
再转向最后的页面
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${user.username}
${user.password}
${user.age}
<h3>执行成功</h3>
</body>
</html>
1.2、返回值是void
如果没有写返回值的话,那么程序默认会自动跳转到链接名.jsp的界面
前端的页面代码
<a href="user/testVoid">testVoid</a>
控制器代码块:其实就是使用原来在Servlet上使用的方法,创建request,response两个对象,然后使用请求转发,重定向以及直接响应的方式进行页面的跳转和数据的传输。
/*
* 返回值为空类型的数据传输和页面跳转。
* 请求转发一次请求,不用编写项目名称
*
* */
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception{
System.out.println("testVoid执行了");
// 请求
// request.getRequestDispatcher("/WEB-INF/pages/success.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代码–response.jsp
<a href="user/testModelAndView">testModelAndView</a>
控制器代码块
/*
* 使用ModelAndView
* 返回ModelAndView这个对象
* */
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
System.out.println("testModelAndView执行了");
ModelAndView mv = new ModelAndView();
User user = new User();
user.setUsername("美美");
user.setPassword("321");
user.setAge(322);
//把user对象存储到mv对象中,也会把user对象存入到request对象中
mv.addObject("user",user);
//跳转到哪个页面
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>
${user.username}
${user.password}
${user.age}
<h3>执行成功</h3>
</body>
</html>
2、使用转发和重定向的方式
SpringMVC框架提供转发和重定向的方法,使用关键字就可以。但是如果要使用这两种方法的话,它是不会走视图解析器的,所以在写路径的时候要写全。
2.1、forward请求转发
/*
* 使用关键字的方式进行转发或者重定向
* */
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("ForwardOrRedirect执行了");
//请求转发
return "forward:/WEB-INF/pages/success.jsp";
}
2.2、redirect重定向
@Controller
@RequestMapping("/user")
@SessionAttributes
public class UserController {
/*
* 使用关键字的方式进行转发或者重定向
* */
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("ForwardOrRedirect执行了");
//重定向
return "redirect:/index.jsp";
}
3、使用异步ajax的方式进行调用
DispatcherServlet会拦截到所有的资源,导致一个问题就是金泰资源(image、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 -->
使用异步ajax的方式进行请求
<script>
// 页面加载,绑定单击事件
$(function(){
$("#btn").click(function(){
alert("hello btn");
// 发送ajax请求
$.ajax({
//编写json格式,属性和值。
url:"user/testAjax",
contentType: 'application/json;charset=utf-8',
data:'{"username":"呵呵","password":"123","age":123}',
dataType:"json",
type:"post",
success:function (data) {
//服务器端会响应的json的数据,进行解析
alert(data);
alert(data.username);
alert(data.password);
alert(data.age);
}
});
});
});
</script>
控制器代码块1
/**
* 获取请求体的数据
* @param body
*/
@RequestMapping("/testJson")
public void testJson(@RequestBody String body) {
System.out.println(body);
}
使用@RequestBody注解把json的字符串转换成JavaBean的对象
// 页面加载
// 页面加载
$(function(){
// 绑定点击事件
$("#btn").click(function(){
$.ajax({
url:"user/testJson",
contentType:"application/json;charset=UTF-8",
data:'{"addressName":"aa","addressNum":100}',
dataType:"json",
type:"post",
success:function(data){
alert(data);
alert(data.addressName);
}
});
});
});
/**
* 获取请求体的数据
* @param body
*/
@RequestMapping("/testJson")
public void testJson(@RequestBody Address address) {
System.out.println(address);
}
使用@ResponseBody注解把JavaBean对象转换成json字符串,直接响应
- 要求方法需要返回JavaBean的对象
// 页面加载
$(function(){
// 绑定点击事件
$("#btn").click(function(){
$.ajax({
url:"user/testJson",
contentType:"application/json;charset=UTF-8",
data:'{"addressName":"哈哈","addressNum":100}',
dataType:"json",
type:"post",
success:function(data){
alert(data);
alert(data.addressName);
}
});
});
});
@RequestMapping("/testJson")
public @ResponseBody Address testJson(@RequestBody Address address) {
System.out.println(address);
address.setAddressName("上海");
return address;
}
注意: json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包
所以需要在pom.xml文件中引入坐标
<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>