文章目录
1.响应数据和结果视图
1.1 返回值分类
1.1.1 字符串
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp
success.jsp
<%--
Created by IntelliJ IDEA.
User: zhang
Date: 2020/1/1
Time: 22:26
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>执行成功</h1>
${user.username},${user.password},${user.age}
</body>
</html>
@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";
}
1.1.2 void
@RequestMapping("/testVoid")
public void testVoid(){
System.out.println("testVoid执行了...");
}
如果返回值为void,springmvc默认会去查找@RequestMapping("/testVoid")
中的testVoid
加上.jsp
后缀testVoid.jsp
文件。
而我不想让这种情况出现,该怎么做呢?
在昨天的学习中,我们知道 Servlet 原始 API 可以作为控制器中方法的参数:
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
在controller 方法形参上可以定义 request和 response,使用 request 或 response 指定响应结果:
1.使用 request 转向页面,如下:
System.out.println("testVoid执行了...");
//编写请求转发的程序(转发是一次请求,不用编写项目的名称)
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
return;
}
2.也可以通过 response 页面重定向:
response.sendRedirect(request.getContextPath()+"/index.jsp");
3.也可以通过 response 指定响应结果,例如响应 json 数据:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json 串");
1.1.3 ModelAndView
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
该对象中有两个方法:
控制器代码:
/**
* ModelAndView
* @return
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
//创建ModelAndView对象
ModelAndView mv = new ModelAndView();
//模拟出数据库中查询user对象
User user = new User();
user.setUsername("泰思特");
user.setPassword("123");
user.setAge(30);
//把user对象存储到mv对象中,也会把user对象存储到request对象中
mv.addObject("user",user);
//跳转到哪个页面
mv.setViewName("success");
return mv;
}
success.jsp
<%--
Created by IntelliJ IDEA.
User: zhang
Date: 2020/1/1
Time: 22:26
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>执行成功</h1>
${user.username},${user.password},${user.age}
</body>
</html>
1.2 转发和重定向
1.2.1 forward 转发
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。我们也可以写成:
/**
* 转发
* @return
*/
@RequestMapping("/testForward")
public String testForward(){
System.out.println("testForward方法执行了");
return "forward:/WEB-INF/pages/success.jsp";
}
需要注意的是,如果用了 formward:则路径必须写成实际视图 url,不能写逻辑视图(视图解析器不起作用)。
它相当于“request.getRequestDispatcher("url").forward(request,response)”。使用请求 转发,既可以转发到 jsp,也可以转发到其他的控制器方法
1.2.2 Redirect 重定向
contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用:redirect:
/**
* 重定向
* @return
*/
@RequestMapping("/testRedirect")
public String testRedirect(){
System.out.println("testRedirect");
return "redirect:/index.jsp";
}
它相当于“response.sendRedirect(url)”。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不 能写在 WEB-INF 目录中,否则无法找到。
1.3 ResponseBody 响应 json 数据
1.3.1 过滤静态资源
response.jsp
<button id="btn">发送弄ajax请求</button>
<script src="js/jquery-3.4.0.js"></script>
<script>
$(function(){
$('#btn').click(function(){
alert('hello ajax');
})
})
</script>
当我们点击按钮时:
无响应
因为<script src="js/jquery-3.4.0.js"></script>
也会向服务器发送请求
而我们的web.xml
中拦截了所有请求
所以我们得在spring.mvc
中配置:
<!--配置过滤器不过滤静态资源-->
<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
1.3.2 客户端发送Ajax请求,服务端响应json数据
1.3.2.1 使用说明
作用:该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的 数据如:json,xml 等,通过 Response 响应给客户
1.3.2.2 使用示例
需求:使用@ResponseBody 注解实现将 controller 方法返回对象转换为 json 响应给客户端。
前置知识点:Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入 jackson 的包。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.5</version>
</dependency>
jsp代码:
<button id="btn">发送ajax请求</button>
<script src="js/jquery-3.4.0.js"></script>
<script>
$(function(){
$('#btn').click(function(){
//发送ajax请求
$.ajax({
//编写json格式,设置属性和值
url:"/user/testAjax",
contentType:"application/json;charset=UTF-8",
data:"{username:泰思特,password:1234,age:22}",
dataType:"json",
type:"POST",
success:function(data){
//data服务器响应的json数据,进行解析
alert(data.username);
alert(data.password);
alert(data.age);
}
});
})
})
</script>
控制器代码:
/**
* 模拟异步请求响应
* @return
*/
@ResponseBody
@RequestMapping("/testAjax")
public User testAjax(User user){
System.out.println("testAjax执行了...");
//客户端发送ajax请求,传的是json字符串,后端把json字符串封装到user对象中
System.out.println(user);
//做响应
user.setUsername("张泽民");
user.setPassword("1234");
user.setAge(21);
return user;
}
运行结果: