一、返回值分类
1、请求返回值为字符串
(1)点击response.jsp中的超链接,发送请求。
(2)根据请求路径,执行UserController类中的testString()方法,查到数据放入Model中,Model可以把值传到request域,这样页面就可以拿到数据了。
(3)UserController类中的testString()方法返回字符串"success",在springmvc.xml中配置的视图解析器,会根据配置及返回值,找到/WEB-INF/pages/目录下的success.jsp,并跳转至这个页面。
(4)success.jsp页面中<page>标签中配置的 isELIgnored="false" 会使EL表达式生效,从而在页面上显示出后台查询出的值。
<!-- response.jsp,发起请求连接的页面 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="user/testString" >testString</a>
</body>
</html>
<!-- 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>
@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(18);
// model对象
model.addAttribute("user",user);
return "success";
}
}
public class User implements Serializable{
private String username;
private String password;
private Integer age;
// 省略get and set
}
2、请求无返回值
(1)如果不做处理,即执行testVoidOne()方法,后台执行完后默认会去@RequestMapping()标注的路径下找jsp文件,如下代码若不处理,则会到:项目名/WEB-INF/pages/user目录下找testVoid.jsp文件。
(2)调用请求转发(只进行一次请求),即执行testVoidTwo()方法,不会使用springmvc.xml中配置的视图解析器,所以转发页面目录地址要写完整。
(3)调用请求重定向(进行两次请求),即执行testVoidThree()方法,第二次请求不能直接访问/WEB-INF/pages/目录,要利用request.getContextPath()方法获取项目名,拼接完整页面文件路径。
(4)直接通过输出流响应数据,即执行testVoidFour()方法,要注意设置中文编码格式。
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testVoidOne")
public void testVoidOne(Model model){
System.out.println("testVoidOne方法执行了...");
}
@RequestMapping("/testVoidTwo")
public void testVoidTwo(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("testVoidTwo方法执行了...");
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
return;
}
@RequestMapping("/testVoidThree")
public void testVoidThree(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("testVoidThree方法执行了...");
response.sendRedirect(request.getContextPath()+"/index.jsp");
return;
}
@RequestMapping("/testVoidFour")
public void testVoidFour(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("testVoidFour方法执行了...");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print("你好");
return;
}
}
3、返回ModelAndView对象
ModelAndView是SpringMVC为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
<!-- response.jsp,发起请求连接的页面 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="user/testModelAndView" >testModelAndView</a>
</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testModelAndView")
public String testModelAndView(){
System.out.println("testModelAndView方法执行了...");
ModelAndView mv = new ModelAndView();
// 模拟从数据库中查询出User对象
User user = new User();
user.setUsername("小明");
user.setPassword("123");
user.setAge(18);
// 把user对象存储到mv对象中,也会把user对象存入到request对象
mv.addObject("user",user);
// 跳转到哪个页面
mv.setViewName("success");
return mv;
}
}
二、利用关键字进行转发和重定向(使用较少)
用关键字进行转发(forward)和重定向(redirect),是无法使用视图解析器的,所以跳转到的页面目录地址要写完整。重定向(redirect)的页面目录地址不必写出项目名,框架自动填补了。
<!-- response.jsp,发起请求连接的页面 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="user/testForwardOrRedirect" >testForwardOrRedirect</a>
</body>
</html>
@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)利用ajax发送异步请求,在src/main/webapp/js文件夹下导入jquery.min.js,并在发送请求页面导入。
(2)由于DispatcherServlet会拦截到所有的资源,就会导致静态资源(img、css、js)也被拦截而不能使用。需要在springmvc.xml文件添加不拦截静态资源文件的配置,见以下代码。
(3)ajax中要以json字符串的形式,封装传入后台的数据,字符串中的key要与JavaBean的属性名称一致。控制器中@RequestBody注解会自动将客户端传来的json数据封装为相应的JavaBean,但是需要导入jackson相关jar包。
(4)后台控制器处理完业务之后,@ResponseBody注解会将JavaBean对象数据转换为json格式数据返回给客户端,从而完成异步请求。
<!-- 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.xml文件添加的配置内容 -->
<!-- 前端控制器,哪些静态资源不拦截 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<!-- response.jsp,发起请求连接的页面 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<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":"Jack","password":"123","age":26}',
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>
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("testAjax方法执行了...");
// 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
System.out.println(user);
// 模拟查询数据库
user.setUsername("Tom");
user.setAge(28);
// 响应
return user;
}
}