java学习之服务器第27天( -- 四大域对象之一 ( Session详解 ) --)

一: 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);
	}

}


       

     
 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值