Java体系知识之Cookie&Web Storage
(1)Cookie在Java中使用
(2)Cookie在JS中使用
(3)Web Storage 了解
(4)综合案例-购物车
1 Cookie
1.1 HTTP协议
(1)超文本传输协议,请求-响应的协议
(2)无状态协议:
浏览器 服务器
服务器端:
只关心请求;
即使这个客户端已访问过服务端了,服务端也不知道
(3)追踪用户访问情况:
会话追踪技术:
cookie:
cookie,客户端保存数据;
数据不安全;
服务器压力小;
建议存储简单|不重要的|少量的|英文格式的数据
session:
session,服务器端保存数据;sessionId,保存到客户端Cookie中;
数据安全;
服务器压力大;
典型面试题:cookie和session区别
隐藏框:type="hidden"
URL后面拼接参数
1.2 Cookie简介
(1)一小段文本信息
(2)保存在客户端
(3)键值对形式存储,键值对都是字符串
(4)当访问网站时,本地Cookie中的数据会随着请求一块发送到服务端
(5)Cookie中的数据:可增|可删|可修改
数据不安全,建议存储简单|不重要的|少量的|英文格式的数据
1.3 Java中使用Cookie
1.3.1 WriteCookieServlet
package com.javasm.basic;
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.io.PrintWriter;
@WebServlet("/write")
public class WriteCookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("myName","tom");
cookie.setPath("/");
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print("写出Cookie成功");
writer.flush();
writer.close();
}
}
1.3.2 ReadCookieServlet
package com.javasm.basic;
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.io.PrintWriter;
@WebServlet("/read")
public class ReadCookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for (Cookie cookie:cookies) {
System.out.println(cookie.getName()+" "+cookie.getValue());
if("myName".equals(cookie.getName())){
cookie.setValue("jack");
cookie.setPath("/");
cookie.setMaxAge(60*60);
resp.addCookie(cookie);
}
}
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print("写出Cookie成功");
writer.flush();
writer.close();
}
}
1.4 JS中使用Cookie
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="button" value="增加" onclick="addCookie()">
<input type="button" value="读取" onclick="readCookie()">
<input type="button" value="删除" onclick="delCookie()">
</body>
<script>
function addCookie() {
document.cookie = "address=sd;path=/;expires=" + new Date("2024-08-25 18:45:24");
}
function readCookie() {
console.log(document.cookie);
var strings = document.cookie.split("; ");
strings.forEach(cookie => {
console.log(cookie);
var keyAndVal = cookie.split("=");
if ("myAge" == keyAndVal[0]) {
var newAge = parseInt(keyAndVal[1]) + 1;
console.log(newAge);
document.cookie = keyAndVal[0] + "=" + newAge + ";path=/;expires=" + new Date("2024-08-25 18:45:24");
}
})
}
function delCookie() {
document.cookie = "address=sd;path=/;expires=" + new Date("2014-08-25 18:45:24");
}
</script>
</html>
2 Web Storage
2.1 技术简介
(1)Web Storage:
客户端本地保存数据,数据不会主动随着请求发送到服务端
(2)存储数据:
localStorage:没有时间限制
sessionStorage:浏览器关闭,自动失效
(3)方法:
增加:
xx.setItem(key,val)
xx.key=val
获取:
xx.getItem(key)
xx.key
删除:
xx.removeItem(key) 有条件移除值
xx.clear() 清除所有值
(4)了解
2.2 案例实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<input type="button" value="增加" onclick="add()">
<input type="button" value="读取" onclick="read()">
<input type="button" value="删除" onclick="del()">
</body>
<script>
function add() {
sessionStorage.setItem("id", "1");
sessionStorage.name = "tom";
}
function read(){
console.log(localStorage.getItem("id"))
console.log(localStorage.id);
console.log(sessionStorage.name);
console.log(sessionStorage.getItem("name"));
}
function del(){
localStorage.removeItem("id");
sessionStorage.clear();
}
</script>
</html>
3 综合案例
3.1 案例分析
(1)购物车案例:
进入产品界面->将指定产品添加到购物车->进入购物车界面看到数据
(2)流程:
A.进入产品界面:呈现产品数据
prod.html->ProdServlet->ProdService->ProdDao
ProdServlet->prod.html
B.将指定产品添加到购物车:将产品数据保存到Cookie中
prod.html
document.cookie
C.进入购物车界面看到数据:呈现加入购物车的产品数据
读取Cookie中的数据
CartServlet->ProdService->ProdDao
CartServlet->cart.html
(3)技术:
Vue+Axios+qs+Servlet
(4)数据表:
t_prod:
prod_id 产品编号
prod_name 产品名称
prod_img 产品图片
prod_price 产品价格
prod_desc 产品描述
3.2 案例实现
3.2.1 持久层
3.2.1.1 ProdDao
package com.javasm.dao;
import com.javasm.entity.Prod;
import java.sql.SQLException;
import java.util.List;
public interface ProdDao {
List<Prod> findProdList() throws SQLException;
}
3.2.1.2 ProdDaoImpl
package com.javasm.dao.impl;
import com.javasm.dao.ProdDao;
import com.javasm.entity.Prod;
import com.javasm.util.DBUtils;
import org.apache.commons.dbutils.BasicRowProcessor;
import org.apache.commons.dbutils.GenerousBeanProcessor;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
public class ProdDaoImpl implements ProdDao {
QueryRunner runner = new QueryRunner();
@Override
public List<Prod> findProdList() throws SQLException {
Connection conn = DBUtils.getConn();
String sql = "select prod_id,prod_name,prod_img,prod_price,prod_desc from t_prod";
BeanListHandler<Prod> listHandler = new BeanListHandler<>(Prod.class, new BasicRowProcessor(new GenerousBeanProcessor()));
List<Prod> prodList = runner.query(conn, sql, listHandler);
DBUtils.getClose(conn, null, null, null);
return prodList;
}
}
3.2.2 业务层
3.2.2.1 ProdService
package com.javasm.service;
import com.javasm.entity.Prod;
import java.util.List;
public interface ProdService {
List<Prod> findProdList();
}
3.2.2.2 ProdServiceImpl
package com.javasm.service.impl;
import com.javasm.dao.ProdDao;
import com.javasm.dao.impl.ProdDaoImpl;
import com.javasm.entity.Prod;
import com.javasm.service.ProdService;
import java.sql.SQLException;
import java.util.List;
public class ProdServiceImpl implements ProdService {
ProdDao prodDao = new ProdDaoImpl();
@Override
public List<Prod> findProdList() {
List<Prod> prodList = null;
try {
prodList = prodDao.findProdList();
} catch (SQLException e) {
throw new RuntimeException(e);
}
return prodList;
}
}
3.2.3 控制层
3.2.3.1 ProdServlet
package com.javasm.servlet
import com.alibaba.fastjson.JSON
import com.javasm.entity.CodeAndMsg
import com.javasm.entity.Prod
import com.javasm.entity.ReturnEntity
import com.javasm.service.ProdService
import com.javasm.service.impl.ProdServiceImpl
import javax.servlet.ServletException
import javax.servlet.annotation.WebServlet
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
import java.io.IOException
import java.io.PrintWriter
import java.util.List
/**
* @author: ShangMa
* @className: ProdServlet
* @description: 控制层-产品
* @date: 2022/8/25 16:41
*/
@WebServlet("/prod")
public class ProdServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ProdService prodService = new ProdServiceImpl()
List<Prod> prodList = prodService.findProdList()
// 返回响应数据
ReturnEntity re = new ReturnEntity()
if (prodList.size() > 0) {
re.setReturnCode(CodeAndMsg.DATA_SUCCESS.getReturnCode())
re.setReturnMsg(CodeAndMsg.DATA_SUCCESS.getReturnMsg())
re.setReturnData(prodList)
} else {
re.setReturnCode(CodeAndMsg.DATA_FAILURE.getReturnCode())
re.setReturnMsg(CodeAndMsg.DATA_FAILURE.getReturnMsg())
}
resp.setContentType("application/json
PrintWriter writer = resp.getWriter()
writer.print(JSON.toJSONString(re))
writer.flush()
writer.close()
}
}
3.2.4 prod.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<style>
.prod-table {
margin: 10px auto;
}
table, td, th {
border: 1px solid black;
}
img {
width: 10%;
}
td {
text-align: center;
}
</style>
</head>
<body>
<div id="root">
<table class="prod-table">
<caption>产品模块</caption>
<tr>
<th>产品编号</th>
<th>产品名称</th>
<th>产品价格</th>
<th>产品描述</th>
<th>产品操作</th>
</tr>
<tr v-for="prod in prodList">
<td>{{prod.prodId}}</td>
<td>
<img :src="'/'+prod.prodImg">
<br>
{{prod.prodName}}
</td>
<td>{{prod.prodPrice}}</td>
<td>{{prod.prodDesc}}</td>
<td>
<input type="button" value="添加购物车" @click="addCart()">
</td>
</tr>
</table>
</div>
</body>
<script>
new Vue({
el: "#root",
data: {
prodList: []
},
methods: {
addCart() {
}
},
mounted() {
axios.post("/prod", "")
.then(resp => {
console.log(resp);
this.prodList = resp.data.returnData;
})
.catch();
}
})
</script>
</html>