文章目录
SpringMVC - (05) 域对象共享数据
1. 域对象的简介
域对象的作用:保存数据,获取数据,共享数据.
Servlet三大域对象:
对象名称 | 对象的类型 |
---|---|
request | HttpServletRequest |
session | HttpSession |
application | ServletContext |
1.1 request
创建:客户端向服务器发送一次请求,服务器就会创建request对象.
销毁:服务器对这次请求作出响应后就会销毁request对象.
有效:仅在当前请求中有效。
1.2 session
创建:服务器端第一次调用getSession();(保存在服务器内存中)
销毁:
1.非正常关闭服务器(正常关闭session会序列化,再次启动服务器session会被反序列化);
2.session过期了默认30分钟.
3.手动调用session.invalidate();
注意:关闭浏览器再次访问会找不到session的会话id而不是session被销毁了。
有效:用户打开浏览器会话开始,直到关闭浏览器会话才会结束。一次会话期间只会创建一个session对象。
1.3 application
创建:服务器启动的时候,服务器为每个WEB应用创建一个属于该web项目的对象ServletContext类.
销毁:服务器关闭或者项目从服务器中移除的时候.
有效:此信息在整个服务器上被保留。
2. 向request域对象共享数据
向域对象共享数据的方式:
- 使用原生servlet的API
- 使用SpringMVC提供的API
- ModelAndView
- Model
- map
- ModelMap
2.1 使用ServletAPI向request域对象共享数据
将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象
控制器:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/show")
public String show(HttpServletRequest request){
// 通过getParameter()获取参数
String username = request.getParameter("username");
String password = request.getParameter("password");
// 通过setAttribute()向域中共享数据
request.setAttribute("username", username);
request.setAttribute("password", password);
return "show";
}
}
通过request.getParameter(“username”)获取到请求报文中username
通过request.getParameter(“password”)获取到请求报文中password
通过request.setAttribute(键名, 值)方法,将想要向域中共享的数据存储到域中,在展示页面通过${键名}直接获取
客户端发起请求:
控制器接收到请求参数,向域中存储username和password,然后转发到show.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>共享数据展示</title>
</head>
<body>
<h1>共享的数据</h1>
<h2 th:text="'username:' + ${username}"></h2>
<h2 th:text="'password:' + ${password}"></h2>
</body>
</html>
在show.html页面通过 u s e r n a m e 和 {username}和 username和{password}获取到username和password
2.2 使用ModelAndView向request域对象共享数据
ModelAndView有Model和View的功能
- Model主要用于向请求域共享数据
- View主要用于设置视图,实现页面跳转
控制器:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/show")
public ModelAndView show(String username, String password){
//创建ModelAndView对象
ModelAndView mav = new ModelAndView();
//向请求域共享数据
mav.addObject("username", username);
mav.addObject("password", password);
//设置视图,实现页面跳转
mav.setViewName("show");
return mav;
}
}
通过mav.addObject(键名, 值)方法,将想要向域中共享的数据存储到域中,在展示页面通过${键名}直接获取
客户端发起请求:
控制器接收到请求参数,向域中存储username和password,然后通过mav.setViewName(“show”)设置视图,跳转到show.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>共享数据展示</title>
</head>
<body>
<h1>共享的数据</h1>
<h2 th:text="'username:' + ${username}"></h2>
<h2 th:text="'password:' + ${password}"></h2>
</body>
</html>
在show.html页面通过 u s e r n a m e 和 {username}和 username和{password}获取到username和password
注意:方法的返回值是一个ModelAndView对象
2.3 使用Model向request域对象共享数据
控制器:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/show")
public String show(String username, String password,Model model){
//向域中共享数据
model.addAttribute("username", username);
model.addAttribute("password", password);
return "show";
}
}
通过model.addAttribute(键名, 值)方法,将想要向域中共享的数据存储到域中,在展示页面通过${键名}直接获取
客户端发起请求:
控制器接收到请求参数,向域中存储username和password,然后转发到show.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>共享数据展示</title>
</head>
<body>
<h1>共享的数据</h1>
<h2 th:text="'username:' + ${username}"></h2>
<h2 th:text="'password:' + ${password}"></h2>
</body>
</html>
在show.html页面通过 u s e r n a m e 和 {username}和 username和{password}获取到username和password
2.4 使用Map向request域对象共享数据
控制器:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/show")
public String show(String username, String password, Map<String, Object> map){
//向域中共享数据
map.put("username", username);
map.put("password", password);
return "show";
}
}
通过map.put(键名, 值)方法,将想要向域中共享的数据存储到域中,在展示页面通过${键名}直接获取
客户端发起请求:
控制器接收到请求参数,向域中存储username和password,然后转发到show.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>共享数据展示</title>
</head>
<body>
<h1>共享的数据</h1>
<h2 th:text="'username:' + ${username}"></h2>
<h2 th:text="'password:' + ${password}"></h2>
</body>
</html>
在show.html页面通过 u s e r n a m e 和 {username}和 username和{password}获取到username和password
2.5 使用ModelMap向request域对象共享数据
控制器:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/show")
public String show(String username, String password, ModelMap modelMap){
//向域中共享数据
modelMap.addAttribute("username", username);
modelMap.addAttribute("password", password);
return "show";
}
}
通过modelMap.addAttribute(键名, 值)方法,将想要向域中共享的数据存储到域中,在展示页面通过${键名}直接获取
客户端发起请求:
控制器接收到请求参数,向域中存储username和password,然后转发到show.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>共享数据展示</title>
</head>
<body>
<h1>共享的数据</h1>
<h2 th:text="'username:' + ${username}"></h2>
<h2 th:text="'password:' + ${password}"></h2>
</body>
</html>
在show.html页面通过 u s e r n a m e 和 {username}和 username和{password}获取到username和password
3. 向session域共享数据
控制器:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/show")
public String show(String username, String password, HttpSession session){
//向域中共享数据
session.setAttribute("username", username);
session.setAttribute("password", password);
return "show";
}
}
通过 session.setAttribute(键名, 值)方法,将想要向域中共享的数据存储到域中,在展示页面通过${session.键名}直接获取
客户端发起请求:
控制器接收到请求参数,向域中存储username和password,然后转发到show.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>共享数据展示</title>
</head>
<body>
<h1>共享的数据</h1>
<h2 th:text="'username:' + ${session.username}"></h2>
<h2 th:text="'password:' + ${session.password}"></h2>
</body>
</html>
在show.html页面通过 s e s s i o n . u s e r n a m e 和 {session.username}和 session.username和{session.password}获取到username和password
4. 向application域共享数据
控制器:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/show")
public String show(String username, String password, HttpSession session){
// 创建SErvletContext对象
ServletContext application = session.getServletContext();
// 向域中共享数据
application.setAttribute("username", username);
application.setAttribute("password", password);
return "show";
}
}
通过application.setAttribute(键名, 值)方法,将想要向域中共享的数据存储到域中,在展示页面通过${application.键名}直接获取
客户端发起请求:
控制器接收到请求参数,向域中存储username和password,然后转发到show.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>共享数据展示</title>
</head>
<body>
<h1>共享的数据</h1>
<h2 th:text="'username:' + ${application.username}"></h2>
<h2 th:text="'password:' + ${application.password}"></h2>
</body>
</html>
在show.html页面通过 a p p l i c a t i o n . u s e r n a m e 和 {application.username}和 application.username和{application.password}获取到username和password