文章目录
课前掌握
- cookie:小饼干 小甜饼
- session:会话、会议
- 缓存:
- Session 服务器端缓存 eg:Apache:html php asp\Tomcat:jsp
- Cookie 本地浏览器缓存
- Redis 数据库缓存:MYSQL是关系型数据库 Redis是非关系型数据库
- Cookie和Session的关系
- 一个Cookie可以认为是一个「变量」,形如
name=value
,存储在浏览器- 服务器可以一次设置多个 cookie,所以有时候说 cookie 也是「一组」键值对儿
- 一个Session可以理解为一种数据结构,多数情况是「映射」(键值对),存储在服务器上
- 一个Cookie可以认为是一个「变量」,形如
会话概述
- 两个人你问我答的过程就是一个会话
- 一个用户在某网站上的整个购物过程就是一个会话
- Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程
- 在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session
Cookie对象
-
Cookie在浏览器和服务器之间的传输
-
浏览器 & Cookie
- 浏览器 ——> Cookie:将Server1的Cookie保存起来
- Cookie ——> 浏览器:第一次访问,不存在cookie 后续访问,直接获取cookie
-
浏览器 & 服务器
- 浏览器 ——> 服务器:第一次访问Server1 后续访问Server1
- 浏览器 ——> 服务器:第一次响应 setCookie: name = value
-
结论:
- 第一次访问服务器,服务器会增加Set-Cookie头字段,将Cookie信息发送到浏览器,并保存到客户端
- 当后续访问到服务器时,会在请求信息中将用户信息以Cookie的形式发送给服务器
-
如何创建Cookie?
-
在Servlet API中提供了javax.servlet.http.Cookie类,它包含了生成Cookie信息(存入 - set)和提取(提取 - get)Cookie信息各个属性的方法
-
Cookie类的常见API
显示用户上次访问时间
package cn.javabs.server.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/lastAccessServlet")
public class LastAccessServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置编码乱码
response.setContentType("text/html;charset=utf-8");
// 如何创建Cookie? 通过请求对象进行获取Cookie
// 获取所有的Cookie、并且存放在 Cookie数组中
Cookie[] cookies = request.getCookies();
System.out.println("cookie" + cookies.length);
/**
* 有没有可能是空的! 答案: 有可能是空的。
* 没有上网、没有发出请求、浏览器就不会给你响应、没有响应就没有cookie信息
* 如果cookies 是空的、 长度有没有? 答案: 没有长度
*/
// 遍历数组
for (int i = 0; cookies != null && i < cookies.length; i++) {
System.out.println("cookie" + i + "的名字是:" + cookies[i].getName());
if ("lastAccessTime".equals(cookies[i].getName())) {
String value = cookies[i].getName();
System.out.println("value" + value);
break;
}
}
/**
* 创建Cookie? 实例化
* Cookie cookie = new Cookie();
* 报错 是因为会去访问有参数的构造方法、 没有写参数
* 查看源代码发现如下: name 是 cookie 的名称 | value 是cookie的值
* public Cookie(String name, String value) {}
*/
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String currentTime = sdf.format(date);
System.out.println("currentTime" + currentTime);
currentTime.replace("", "");
}
}
Session对象
-
概念
- 客户端(浏览器)存储到服务器(Tomcat)的过程叫做Session技术
- 当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,Session对象相当于病历档案,ID相当于就医卡号
- Session是借助Cookie技术来传递ID属性的 【因为Session是服务器的,Cookie是客户端的】
-
如何获取Session对象?
-
HttpServletRequest定义了用于获取Session对象的getSession()方法
public HttpSession getSession(boolean create)
public HttpSession getSession()
-
HttpSession的重要方法
-
ServletContext getServletContext() 用于返回前HttpSession对象所属于的web应用程序对象 void setAttribute(String name,String value) 用于将一个对象与一个名称关联后存储到当前的HttpSession对象中 String getAttribute() 用于从当前HttpSession对象中返回制定名称的属性对象 void removeAttribute(String name) 用于从当前HttpSession对象中删除指定名称的属性
-
-
-
结论:
- Web服务器采用了超时管理来判断客户端是否存在 【超时的时间值,单位为分钟】
- 若在一定时间内没有请求访问,那么将对应的Session变成垃圾,进行清除;反之,web服务器会创建一个新的Session镀锡iang,并分配一个ID属性
-
<Session-config> <session-timeout>30</session-timeout> </Session-config>
- Web服务器采用了超时管理来判断客户端是否存在 【超时的时间值,单位为分钟】
-
案例一:Session实现购物车
-
设计图书实体类
-
public class Book { private int id; private String name; private String price; // 生成Getter Setter方法和toString()方法 }
-
-
数据库创建图书表
-
create database usermanager user usermanager create table book( id int primary key auto_increment, name varchar(30) not null unique, price double );
-
-
BookServlet
-
package cn.javabs.server.session; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException; import java.util.List; @WebServlet("/bookServlet") public class BookServlet extends HttpServlet { BookService bookService = new BookService(); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); String anhao = request.getParameter("anhao"); switch (anhao){ case "find": find(request,response); break; case "buy": buy(request,response); } } /** * 查询图书列表 */ private void find(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List bookList = bookService.findAllBook(); request.setAttribute("list",bookList); request.getRequestDispatcher("/server/bookList.jsp").forward(request,response); } } /** * 购买的图书 */ private void buy(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String sid = request.getParameter("id"); int id = Integer.parseInt(sid); Book book = bookService.findBookById(id); // 创建会话对象 HttpSession session = request.getSession(); session.setAttribute("book",book); Cookie cookie = new Cookie("JSESSIONID",session.getId()); response.addCookie(cookie); request.getRequestDispatcher("/day09/success.jsp").forward(request,response); } }
-
-
BookService
-
package cn.javabs.server.session; import java.util.List; public class BookService { BookDao bookDao = new BookDao(); public List findAllBook() { return bookDao.find(); } public Book findBookById(int id) { return bookDao.findBookById(id); } }
-
-
BookDao
-
package cn.javabs.server.session; import cn.javabs.user.util.DruidUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import java.sql.SQLException; import java.util.List; public class BookDao { QueryRunner qr = new QueryRunner(DruidUtils.getDataSource()); /** * 查询图书列表 */ public List find() { try { return qr.query("select * from book",new BeanListHandler<>(Book.class)); } catch (SQLException e) { throw new RuntimeException(e); } } /** * 根据传入的id查询图书 */ public Book findBookById(int id) { try { return qr.query("select * from book where id=?",new BeanHandler<>(Book.class)); } catch (SQLException e) { throw new RuntimeException(e); } } }
-