之前学的内容是springmvc的请求,现在来学响应。
1.当返回值为字符串时
控制器设置为:
package cn.itcast.controller;
import cn.itcast.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 返回值类型为字符串
* @param model
*/
@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对象存数据
model.addAttribute("user",user);
return "success";
}
假设从数据库中获取到数据,并存储到model中,model通过addAttribute将数据传输到@requestMapping层,参考链接:
model.addAttribute()
在前端页面输出:
<%--
Created by IntelliJ IDEA.
User: 86187
Date: 2021/3/2
Time: 10:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>执行成功</h3>
${user.username}
<br>
${user.password}
</body>
</html>
2.当返回类型为void时
当控制器无返回值时:
/**
* 返回值类型为void
* @param model
*/
@RequestMapping("/testVoid")
public void testVoid(Model model){
System.out.println("testVoid方法执行了。。。");
}
}
会发现返回页面为404,并且默认跳转到一个未知的页面(WEB-INF/pages/user/testVoid.jsp没有设计):
HTTP Status 404 – Not Found
Type Status Report
Message /springmvc_day02_02_response/WEB-INF/pages/user/testVoid.jsp
因此,
需要在控制器添加HttpServletRequest request, HttpServletResponse response
/**
* 返回值类型为void
* @param model
*/
@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);
}
}
自定义跳转到界面/WEB-INF/pages/success.jsp
。这里我们使用的是请求转发(留头不留体)rd.forward( request , response );
关于getRequestDispatcher()和请求转发和请求包含的区别以及请求转发和重定向的区别参考以下链接:getRequestDispatcher()
运行,发现跳转成功。
//编写请求转发的程序,忽略视图解析器
// request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
//重定向,等于重新发了一个新的请求
response.sendRedirect(request.getContextPath()+"/WEB-INF/pages/success.jsp");
当改成重定向,发现无法访问,原因是因为,**重定向只能访问项目下面的jsp文件,无法使用视图解析器,**如index.jsp
(在webapp下),则访问成功。
//重定向,等于重新发了一个新的请求
//response.sendRedirect(request.getContextPath()+"/WEB-INF/pages/success.jsp");
//直接会进行响应
response.getWriter().print("hello");
这样写会,直接输出参数“hello”,若想输出中文,则需添加两行:
//或解决中文乱码问题后,输出中文
// 设置中文乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//直接会进行响应
response.getWriter().print("你好");
1、pageEncoding=”UTF-8”的作用是设置JSP编译成Servlet时使用的编码。
2、contentType=”text/html;charset=UTF-8”的作用是指定服务器响应给浏览器的编码。参考链接:
request和response的setCharacterEncoding()方法
3.当返回值为modelandview类型时
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
/**
* 返回ModelAndView
* @return
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
// 第一步,创建ModelAndView对象,ModelAndView由springmvc提供
ModelAndView mv = new ModelAndView();
System.out.println("testModelAndView方法执行了...");
// 模拟从数据库中查询出User对象
User user = new User();
user.setUsername("小凤");
user.setPassword("456");
user.setAge(30);
// 把user对象存储到mv对象中,也会把user对象存入到request对象
mv.addObject("user",user);
// 跳转到哪个页面,通过视图解析器跳转,位置范围在/WEB-INF/pages/xxx.jsp
mv.setViewName("success");
return mv;
运行即可,参考链接:SpringMVC之ModelAndView的用法
4.使用关键字的方式进行转发或者重定向
当转发时:
/**
* 使用关键字的方式进行转发或者重定向
* @return
*/
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("testForwardOrRedirect方法执行了...");
// 请求的转发
return "forward:/WEB-INF/pages/success.jsp";
运行,跳转成功。
当重定向时:
/**
* 使用关键字的方式进行转发或者重定向
* @return
*/
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("testForwardOrRedirect方法执行了...");
// 请求的转发
// return "forward:/WEB-INF/pages/success.jsp";
// 重定向
return "redirect:/index.jsp";
}
运行,跳转成功。redirect:/index.jsp
不需要添加文件名,默认已添加。
5.使用@ResponseBody 注解实现将 controller 方法返回对象转换为 json 响应给客户端。
使用@ResponseBody 注解实现将 controller 方法返回对象转换为 json 响应给客户端。json格式比较常见。
首先在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>
其次,在请求页面中设计,并设计按钮:
<%--
Created by IntelliJ IDEA.
User: 86187
Date: 2021/3/2
Time: 10:26
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.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>
<a href="user/testString">testString</a>
<br>
<a href="user/testVoid">testVoid</a>
<br>
<a href="user/testModelAndView">testModelAndView</a>
<br>
<a href="user/testForwardOrRedirect">testForwardOrRedirest</a>
<br/>
<button id="btn">发送ajax的请求</button>
</body>
</html>
之后,在springmvc.xml中设计前端控制器,确保不拦截静态资源:
<!--前端控制器,哪些静态资源不拦截-->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
并在相应的位置设置他们。
最后,在控制器设计对应的函数:
/**
* 模拟异步请求响应
*/
@RequestMapping("/testAjax")
public @ResponseBody
User testAjax(@RequestBody User user){
System.out.println("testAjax方法执行了...");
// 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
System.out.println(user);
// 做响应,模拟查询数据库
user.setUsername("haha");
user.setAge(40);
// 做响应
return user;
}
}
运行可得。