HttpSession-服务端会话技术
HttpSession 域对象 可以存东西
服务器会为每一个用户创建一个独立的HttpSession
HttpSessionn 原理
当Servlet第一次访问Servlet的时候 服务器端会给该用户创建一个独立的Session
并且生成一个SessionID,这个Session在响应浏览器的时候 会被装进cookie中
从而被保存在浏览器中 当用户下一次再一次访问Servlet的时候,请求中会携带着cookie中的SessionID去访问
服务器会根据这个sessionID去查看是否有Session对象 有就拿出来使用
没有 就创建一个Session(相当于第一次访问)
域的范围
Context域 > Session域 > Request域
Session域 只要会话不结束,就会存在 但是Session有默认的存活时间 30分钟
简单实现
在访问网址中?后面加上一条信息,在demo01中通过请求捕获这条信息,再通过request获取session域,将这条信息保存到
session域中,由于session域存在的时间较长,只要会话不关闭,session便可存在(30分钟),且一个用户对应一个session
此时再用demo02获取这条session,将session中username里的值取出来,输出到网页
public class Demo01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
HttpSession session = request.getSession();
session.setAttribute("username", username);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
public class Demo02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
HttpSession session = request.getSession();
String username = (String)session.getAttribute("username");
response.getWriter().write(username);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
<servlet>
<servlet-name>user</servlet-name>
<servlet-class>com.lanou3g.Demo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>user</servlet-name>
<url-pattern>/user</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>demo02</servlet-name>
<servlet-class>com.lanou3g.Demo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo02</servlet-name>
<url-pattern>/demo02</url-pattern>
</servlet-mapping>
测试
只要服务器和浏览器不关闭,一个用户便只有一个session,此时将两本书添加到购物车中,然后查看购物车的内容,
可以看到添加的两本书籍,此时刷新浏览器,但不关闭浏览器,再次查看购物车中的内容,任然可以看到添加进的书籍
当关闭浏览器时,再进去查看购物车,书籍将消失
模拟购物功能
大概需要几个页面来完成 --- 需要几个Servlet
需要:
三个servlet类
书类 id bookName
模拟假数据的类
map集合 HashMap<String,Book>
方法: 根据ID获取对应的书
1 --- 葵花
2 --- 辟邪
3 --- 九阴
钝化:服务器停止时 如果你的session中存了对象 并且该对象实现了序列化接口Serializable
系统会把你保存的session序列化到服务器的work文件夹你的工程下一个文.件
活化:当你重新启动了服务器,系统会重新把钝化下来的那个文件加载为session中
package com.lanou3g.car;
import java.io.Serializable;
public class Book implements Serializable{
private static final long serialVersionUID = 1L;
private String id;
private String name;
public Book() {
super();
// TODO Auto-generated constructor stub
}
public Book(String id, String name) {
super();
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Book [id=" + id + ", name=" + name + "]";
}
}
package com.lanou3g.car;
/*
* 模拟假数据
*/
import java.util.HashMap;
public class BookUtil {
// 声明一个保存书的容器
private static HashMap<String, Book> books = new HashMap<>();
// 添加数据
static {
books.put("1", new Book("1","葵花宝典"));
books.put("2", new Book("2","九阴真经"));
books.put("3", new Book("3","辟邪剑谱"));
books.put("4", new Book("4","如来神掌"));
}
// 获取集合的方法
public static HashMap<String,Book> getBooks(){
return books;
}
// 按id查找对应书的方法
public static Book findBookById(String id) {
return books.get(id);
}
}
public class ShowAllBooks extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
HashMap<String, Book> books = BookUtil.getBooks();
PrintWriter out = response.getWriter();
for (String key : books.keySet()) {
Book book = books.get(key);
// 响应到网页上
out.write(" <a href='" +request.getContextPath()+"/AddBook?id="+book.getId()+"'>"+book.getName()+"</a><br/>");
}
// 添加查看购物车的连接
out.write("<a href='"+request.getContextPath()+"/showCar'>查看购物车</a>");
// 设置session有效时间
request.getSession().setMaxInactiveInterval(10);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
public class AddBook extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
// 获取点击的是那本书(获取参数)
String id = request.getParameter("id");
Book book = BookUtil.findBookById(id);
// 创建一个容器(相当于购物车 保存买的书)
// 两种情况 1.已经存过书了 2没存过
HttpSession session = request.getSession();
ArrayList<Book> car = (ArrayList)session.getAttribute("car");
if(car == null) {
// 相当于第一次访问 创建容器
car = new ArrayList<>();
}
// 把书添加到容器中
car.add(book);
// 把这个容器添加到session中
session.setAttribute("car", car);
// 显示添加成功
// 1秒后返回商品列表项
response.setHeader("refresh", "1;url=/sh-web-servlet06/ShowAllBooks");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
public class showCar extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
ArrayList<Book> cars = (ArrayList<Book>)session.getAttribute("car");
if(cars == null) {
out.write("购物车为空");
// 2秒跳回 商品列页面
response.setHeader("refresh", "2;url="+request.getContextPath()+"/ShowAllBooks");
}else {
// 遍历输出
for (Book book : cars) {
out.write(book + "<br/>");
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
public class DoLogin extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
// 获取到请求过来的参数(表单提交过来的参数)
String userName = request.getParameter("userName");
String pwd = request.getParameter("pwd");
String code = request.getParameter("code");
PrintWriter out = response.getWriter();
// 是否wanglong 123
if("wanglong".equals(userName) && "123".equals(pwd)) {
HttpSession session = request.getSession();
String wcode = (String)session.getAttribute("wcode");
if(wcode.equalsIgnoreCase(code)) {
out.write("欢迎登陆");
}else {
// 使用request域 保存 验证码错误的信息
request.setAttribute("msg", "你验证码输入错误");
// 请求转发
request.getRequestDispatcher("/1.jsp")
.forward(request, response);
}
}else {
out.write("用户名或密码错误");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function changeCode() {
/*从文档中取出img图片*/
var img = document.getElementsByTagName("img")[0];
/*获取图片的src属性 并赋值
注意:如果请求的网址完全相同 则浏览器不会帮你刷新
可以拼接当前时间 让每次请求的网址都不一样
*/
img.src = "/sh-web-servlet06/codeServlert?time=" + new Date().getTime();
}
</script>
</head>
<body>
<%
// 书写java代码
// 获取request中的数据
String msg = (String)request.getAttribute("msg");
if(msg != null){
out.write(msg);
}
%>
<form action="/sh-web-servlet06/doLogin" method="post">
用户名:<input type="text" name="userName"/><br>
密码:<input type="password" name="pwd"/><br>
验证码:<input type="text" name="code"/>
<img src="/sh-web-servlet06/codeServlert" onclick="changeCode()"/>
<a href="javascript:changeCode()">看不清换一张</a>
<br>
<input type="submit" value="登录"/><br>
</form>
</body>
</html>