一: session
存在位置: HttpSession 保存在服务器, 并且为每一个访问的用户创建一个Session对象;
浏览器关闭会话就结束了!
实现原理: Session 的实现,是依赖cookie实现的, 用户第一次访问网页的时候,系统会给用户创建一个独立的Session和分配id号,
当请求完成,响应回浏览器的时候, 系统会创建一个cookie出来 cookie中保存着Session和id
浏览器接收到响应, 会把响应中的cookie存储到浏览器中( 相当于储存了Session的id)
当用户(从浏览器)再次访问网页时,请求中会携带这个cookie 也就是带着Id号去请求,
网页接收到这个请求, 会取出cookie中的id去找对应的Session 如果有直接使用,没有就创建新的;
作用范围: 一次会话中都有效, 会话结束(session失效), 浏览器不关闭一直有效;
默认有效时间 : 30分钟 session.setMaxInactiveInterval(6600); 设置有效时间,单位秒: 设置为零,一直有效.
获取session : HttpSession session =request .getSession(); 一般进行判断的时候要进行强转成字符串类型
String attribute = (String)session.getAttribute("username");
session钝化: 将session写入到文件中;
session活化: 将写到文件中的session 读回到Session对象中;
如果: 服务器突然停了,session的信息不回消失, 会保存在: work/catalinaa/localhost/工程/SESSION.SER;
注意: 通过钝化和活化来保证,你的session中存在数据的安全. session 中保存的对象一定要实现序列化(S)接口;
例题: 利用session 完成数据的保存和读取
利用Session实现购物车功能;
* 1.该功能有几个页面组成(流程图)
* 2.分析需要多少类,
* 3.并且每个类中要实现什么逻辑,
* 4.最后再跟产品确认一遍;
*
* 界面
* 1.列表页显示所有商品,
* 2.添加页面
* 显示添加成功
* 3.购物车页面
* 显示添加到购物车中的商品详尽信息;
* 4注销购物车页面
* 显示注销成功;
*
* 分析有多少个类;
* 1. 商品类(book类)
* String id ,name
* 2. 制造假数据的类;(BookUitl)
* 1. 创建一个容器map key ==id, value==书的对象 ,添加四本书进去;
* 2. 提供一个, 通过id获取获取对应书的方法;
* 3. 获取map集合的方法;
* 3. 列表类(Servlet)
* 通过a标签显示列表超链接;
* 点击a标签把该书的id传递到添加类,
* 可以通过a标签拼接网址? id= 然后进行网址拼接
* 4. 添加类(sevrlet)
* 获取要添加的id ,通过id取出对应的书,将添加的书添加容器中list里面
* 将list添加到到Session域中 ,
* carlist booklist
* 回写: 添加成功.
* 5. 购物车类(Servlet)
* 1. 没添加数就直接点了购物车
* 购物是空的 回写;
* 3秒钟回到列表页
*
* 2.购物车中有商品
* 直接回写购物车中商品的详细信息;
* 6. 注销类 (Servlet)
* 清空购物车;---?
1. 创建BOOK类
利用Session实现购物车功能;
* 1.该功能有几个页面组成(流程图)
* 2.分析需要多少类,
* 3.并且每个类中要实现什么逻辑,
* 4.最后再跟产品确认一遍;
*
* 界面
* 1.列表页显示所有商品,
* 2.添加页面
* 显示添加成功
* 3.购物车页面
* 显示添加到购物车中的商品详尽信息;
* 4注销购物车页面
* 显示注销成功;
*
* 分析有多少个类;
* 1. 商品类(book类)
* String id ,name
* 2. 制造假数据的类;(BookUitl)
* 1. 创建一个容器map key ==id, value==书的对象 ,添加四本书进去;
* 2. 提供一个, 通过id获取获取对应书的方法;
* 3. 获取map集合的方法;
* 3. 列表类(Servlet)
* 通过a标签显示列表超链接;
* 点击a标签把该书的id传递到添加类,
* 可以通过a标签拼接网址? id= 然后进行网址拼接
* 4. 添加类(sevrlet)
* 获取要添加的id ,通过id取出对应的书,将添加的书添加容器中list里面
* 将list添加到到Session域中 ,
* carlist booklist
* 回写: 添加成功.
* 5. 购物车类(Servlet)
* 1. 没添加数就直接点了购物车
* 购物是空的 回写;
* 3秒钟回到列表页
*
* 2.购物车中有商品
* 直接回写购物车中商品的详细信息;
* 6. 注销类 (Servlet)
* 清空购物车;---?
2. 创建BookUtils保存书, 里面创建一个map集合;模拟假的数据库;
import java.util.HashMap;
import java.util.Map;
public class BookUtil {
//声明容器保存书并且进行初始化
private static HashMap<String, Book> map = new HashMap<>();
//添加一次假数据就行,使用静态代码块 静态只能使用静态的
//构造方法私有化
private BookUtil(){
}
static {
//添加四本书
map.put("1", new Book("1", "葵花宝典"));
map.put("2", new Book("2", "九阴真经"));
map.put("3", new Book("3", "辟邪剑谱"));
map.put("4", new Book("4", "玉女心经"));
}
//获取容器的方法
public static HashMap<String, Book> getBookMap(){
return map;
}
//通过id 找到对应书的方法;
public static Book getBookById( String id) {
return map.get(id);
}
}
3. 实现将书显示在页面上的功能ShowAllbooks;
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> bookMap = BookUtil.getBookMap();
// 获取一下输出流,将书名写在网页上 ,
PrintWriter writer = response.getWriter();
for (String key : bookMap.keySet()) {
// 获取所有书
Book book = bookMap.get(key);
// 将所有书的名字输出到网页上.
//调转工程的路径 相对路径 ; 打印出来就是你工程的名字
//request.getContextPath(); 以后只用这个就好了;
writer.write("<a href='"+request.getContextPath()+"/addBook?id="+ book.getId()+"'>"+book.getBookName()+"</a><br/>");
}
//写购物车
writer.write("<a href='"+request.getContextPath()+"/showCar' >查看购物车</a><br/>");
//writer.write("<a href='"+request.getContextPath()+"/showCar' >删除</a><br/>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
4. 添加书到session里面去AddBook;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;
import org.apache.catalina.SessionListener;
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");
//显示购物车内容
HttpSession session = request.getSession();
ArrayList<Book> list =(ArrayList<Book>) session.getAttribute("booklist");
if (list==null) {
//没有这个容器,并且三秒后跳转列表页;
System.out.println("购物车是空的");
response.setHeader("refresh","3;url="+request.getContextPath()+"/showAllBooks");
}else {
//不是null,直接输出商品信息;
for (Book book : list) {
System.out.println(book);
response.getWriter().write(book+"<br/>");
}
}
//session中的方法;设置Session有效存活时间, 以秒为单位
//如果设置零或者负数,Session将永远不会过期;
// session.setMaxInactiveInterval(60*30);
//让Session失效注销用户信息
// session.invalidate();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
5. 通过获取Session, 来讲已经选择的数放入显示在网页上
package com.lanou3g.car;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;
import org.apache.catalina.SessionListener;
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");
//显示购物车内容
HttpSession session = request.getSession();
ArrayList<Book> list =(ArrayList<Book>) session.getAttribute("booklist");
if (list==null) {
//没有这个容器,并且三秒后跳转列表页;
System.out.println("购物车是空的");
response.setHeader("refresh","3;url="+request.getContextPath()+"/showAllBooks");
}else {
//不是null,直接输出商品信息;
for (Book book : list) {
System.out.println(book);
response.getWriter().write(book+"<br/>");
}
}
//session中的方法;设置Session有效存活时间, 以秒为单位
//如果设置零或者负数,Session将永远不会过期;
// session.setMaxInactiveInterval(60*30);
//让Session失效注销用户信息
// session.invalidate();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
6. 删除所有已经添加的书 , 也就是将session删除;
package com.lanou3g.car;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class Delete 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();
//调用方法,session被删除;
session.invalidate();
response.getWriter().write("显示注销成功");
//注销成功,三秒后跳转回显示书的网页;
response.setHeader("refresh", "3;url=" + request.getContextPath() + "/showAllBooks");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}