1.返回String
核心控制器会将返回的字符串抛到视图解析器中解析出完整页面路径,然后将根据页面中的格式将model中的数据取出对页面进行渲染。最后将渲染好的页面返回给前端。这是最常见基本的响应方式,前面基本都是这么写的。这里不做赘述。有需要的去前面看。
2.返回void
返回void意味着我们不希望通过视图解析器解析页面,但是如果我们什么都不写,默认会去查找当前控制器方法对应的请求路径+.jsp。所以这时候我们需要在处理器方法中通过转发或者重定向来选择返回的视图。
1)网页部分
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--testVoid-->
<a href="testVoid">testVoid</a>
</body>
</html>
2) 控制器
@RequestMapping("/redirect")
public String redirect(){
return "success";
}
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request,HttpServletResponse response) throws Exception {
response.sendRedirect(request.getContextPath()+"/redirect");
//request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
return;
}
注意:转发是一次将请求转到另一个页面做处理,而重定向则是再模拟用户发起一次请求,页面上的地址会跳转两次。因此是跳转后的页面是无法访问到你一开始发出的request的。所以重定向是两次请求,转发则是一次请求。
3.返回ModelAndView
ModelAndView是Spring提供的一个对象,可以用来调整具体的jsp视图
1)网页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--testModelAndView-->
<a href="testModelAndView">testModelAndView</a>
</body>
</html>
2) 控制器
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
ModelAndView mv = new ModelAndView();
User user = new User();
user.setName("张三");
mv.addObject("user",user);
mv.setViewName("success");
return mv;
}
这个方式与返回String的方式相似,但其实返回String的方式的底层实现也是ModelAndView的形式
4.使用关键字的方式实现转发与重定向
1)网页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--testKeyWord-->
<a href="testKeyWord">testKeyWord</a>
</body>
</html>
2) 控制器
@RequestMapping("/redirect")
public String redirect(){
return "success";
}
@RequestMapping("/testKeyWord")
public String testKeyWord(){
//return "forward:/WEB-INF/pages/success.jsp";
return "redirect:/redirect";
}
5.ResponseBody响应json数据
当前端页面通过ajax向后台发起ajax请求时,需要后台返回json格式的数据给前端,这是需要用到这个注解。
<mvc:resources location="/js/" mapping="/js/**"/>
在springmvc配置文件中添加此配置告诉控制器,对于这个文件夹与mapping对对应的路径请求我们不再拦截。记住位置不要写反,因为我写反了就页面资源404.
2.编写页面代码发起ajax请求
<%--
Created by IntelliJ IDEA.
User: 50422
Date: 2020/4/26
Time: 12:42
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="js/jquery-3.2.1.min.js"></script>
<script>
$(function () {
为按钮赋予点击事件
$("#btn").click(function () {
//ajax请求属性设置
$.ajax({
url:"testAjax",//请求路径
contentType:"application/json;charset=UTF-8",//编码格式
data:'{"name":"hehe","age":"33"}',//数据体,json格式
dataType:"json",//数据类型
type:"post",//请求方式
//请求成功后的回调函数
success:function (data) {
alert(data.name+"/"+data.age);
}
});
});
});
</script>
</head>
<body>
<!--ajax-->
<button id="btn" >发送ajax请求</button>
</body>
</html>
3.控制器代码
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println(user);
user.setName("老子回来了");
return user;
}
通过RequestBody与ResponseBody可以对json格式与pojo对象进行一个注入和转换,但是要添加jackson的jar包
4.maven添加依赖
<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>