商城项目第五天
今日任务:
Redis优化
完成分类信息的增删改查(后台管理员)
Redis优化 (选做)
一定要开启 redis 导入工具类 配置文件
CategoryService
/**
* 查询所有的分类信息
* 使用redis 优化
* 1:先去redis中查询 分类信息
* 获取连接对象 查询
* get("categories")
* 2.1:如果 数据不存在
* 说明是第一次访问,
* 2.1.1 找到dao--mysql--查询
* List<Category> list
* 有了 但是返回数据之前
* 2.1.2
* 将数据存到 redis中
* 键 categories
* 值 list--json数据存储
*
* 2.2 有了数据
* 将 数据取出来
* 但是这个数据 是一个字符串(集合哪种json!)
* 将这个字符串---转换回来 称为List集合
*
* 将集合数据返回
*
* @return
*/
@Override
public List<Category> findAllCategorys() {
List<Category> list = null;
try {
/*
1:先去redis中查询 分类信息
*/
// 连接 redis 获取jedis对象
Jedis jedis = JedisUtils.getJedis();
// 去redis中获取 到 categories对应的数据
String categories = jedis.get("categories");
if(categories==null){//redis中没数据 第一次来查询
//第一次查 还得找到 dao
list=categoryDao.findAllCategorys();
//将集合list 转换成 json形式 并且变成字符串形式
String s = JSONArray.fromObject(list).toString();
// 将数据存到 redis中
// 键 字符串 值 集合转换成json 形式的字符串
jedis.set("categories",s);
}else{
//redis中有数据
// categories 是一个json 字符串形式的 (里面的数据是 集合格式)
// 将这个json字符串形式东西 转换成 以前的list集合
// 将JSON字符串 转换成 json对象形式!!
JSONArray jsonArray = JSONArray.fromObject(categories);
// 转换成list集合
list = jsonArray.toList(jsonArray, Category.class);
}
jedis.close();
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
查询所有分类信息
实现步骤
- 分类列表页面发送AJAX请求
- Servlet查询所有分类信息数据
- JSON数据格式响应客户端
- 判断奇数偶数行,显示数据
category/list.html
//页面加载成功之后 发送ajax请求
$(function(){
var url = "/admin?method=findAllCategorys";
HM.ajax(url,"",function(data){
if(data.code==0){
alert(data.message);
}
if(data.code==1){//成功
//解析数据
// data.data 就是 所有的分类信息 数组
var cateArr = data.data;
//展示 要 拿到每个分类信息
$.each(cateArr,function(index,c){
// c 就是每一个分类信息
// tr的class属性 有两个 cate_tr tr_odd cate_tr tr_even
// c 都有 index 0 2 4 cate_tr tr_odd 1 3 5 cate_tr tr_even
var strClass = index%2==0?"cate_tr tr_odd":"cate_tr tr_even";
var str = `<tr class="${strClass}" >
<td>
${c.cid}
</td>
<td>
${c.cname}
</td>
<td >
<a href="http://www.itheima342.com:8020/web/view/admin/category/edit.html?cid=${c.cid}" class="a_button_edit"></a>
<a href="javascript:;" "del('${c.cid}')" class="a_button_del"></a>
</td>
</tr>`;
$("#cate_list").append(str);
});
}
})
})
AdminServlet
/*
查询所有分类信息
*/
public void findAllCategorys(HttpServletRequest request, HttpServletResponse response)
throws InvocationTargetException, IllegalAccessException,
IOException {
// 找到 service查询
List<Category> categorys = categoryService.findAllCategorys();
if(categorys!=null && categorys.size()>0){//查询到了多个分类信息
Result result = new Result(Constant.SUCCESS,"管理员查询分类信息成功",categorys);
//需要把 result变成json格式
response.getWriter().write(JSONObject.fromObject(result).toString());
return;
}
//响应json格式 这种格式 需要跟前端商量!!!
// 按照 规则 去进行json的响应
// Result就是规则
Result result = new Result(Constant.FAILS,"查询分类信息失败");
//需要把 result变成json格式
response.getWriter().write(JSONObject.fromObject(result).toString());
}
添加新的分类
实现步骤
- 添加页面发起AJAX请求,提交填写的分类数据
- Servlet 接收数据,并调用业务层保存数据
- 业务层调用持久层保存数据,并清空数据库缓存
- Servlet响应添加成功信息
category/add.html
// 添加功能完成
function addCategroy(){
var cname = $("#cname").val();
if(!cname.trim()){
//如果没写内容
alert("请输入分类名称!!")
return;
}
var url = "/admin?method=addCategory";
var params = "cname="+cname;
HM.ajax(url,params,function(data){
if(data.code){
alert(data.message);
location.href="http://www.itheima342.com:8020/web/view/admin/category/list.html";
}
})
}
AdminServlet
/*
添加分类信息
*/
public void addCategory(HttpServletRequest request, HttpServletResponse response)
throws InvocationTargetException, IllegalAccessException,
IOException {
//1:获取cname
String cname = request.getParameter("cname");
// 设置cid 封装一个 category对象
Category category = new Category();
category.setCid(UUIDUtils.getUUID());
category.setCname(cname);
// 交给service
categoryService.addCategory(category);
//响应json格式 这种格式 需要跟前端商量!!!
// 按照 规则 去进行json的响应
// Result就是规则
Result result = new Result(Constant.SUCCESS,"添加分类信息成功");
//需要把 result变成json格式
response.getWriter().write(JSONObject.fromObject(result).toString());
}
CategoryService
/**
* 添加分类信息
* @param cname
*/
public void addCategory(String cname) {
try {
dao.addCategory(cname);
// 增删改 更新了分类信息
// 让redis清除掉 数据
clearRedis();
} catch (SQLException e) {
e.printStackTrace();
}
}
/*
清空缓存
*/
public void clearRedis(){
Jedis jedis = JedisUtils.getJedis();
jedis.del("categories");
jedis.close();
}
CategoryDao
/*
添加分类信息
*/
@Override
public void addCategory(Category category) throws SQLException {
String sql = "insert into category values(?,?)";
Object[] params = {category.getCid(),category.getCname()};
qr.update(sql,params);
}
修改分类信息回显
实现步骤
- 分类编辑页面获取分类
- 发送请求,获取分类名称
- 分类名称显示在页面中
category/edit.html
//页面加载成功之后 要向服务器发送请求 获取分类信息 并完成展示
$(function(){
var cid = HM.getParameter("cid");
var url = "/admin?method=info";
var params = "cid="+cid;
HM.ajax(url,params,function(data){
if(data.code==1){//成功 将数据回显
//得到了 我们需要的 分类信息数据
var cate = data.data;
$("#cname").val(cate.cname);
}
})
})
AdminServlet
/*
查询分类信息
*/
public void info(HttpServletRequest request, HttpServletResponse response)
throws InvocationTargetException, IllegalAccessException,
IOException {
//1:获取cid
String cid = request.getParameter("cid");
// 交给service
Category category = categoryService.info(cid);
//响应json格式 这种格式 需要跟前端商量!!!
// 按照 规则 去进行json的响应
// Result就是规则
Result result = new Result(Constant.SUCCESS,"查询到了分类信息",category);
//需要把 result变成json格式
response.getWriter().write(JSONObject.fromObject(result).toString());
}
CategoryService
/*
根据cid查询 分类信息
*/
@Override
public Category info(String cid) {
Category category=null;
try {
category= categoryDao.info(cid);
} catch (SQLException e) {
e.printStackTrace();
}
return category;
}
CategoryDao
// 根据cid查询分类信息
@Override
public Category info(String cid) throws SQLException {
String sql = "select * from category where cid=?";
Object[] params = {cid};
return qr.query(sql, new BeanHandler<>(Category.class), params);
}
修改商品分类
实现步骤
- 分类编辑页面发送请求,提交主键和分类名称
- Servlet接收参数,传递到业务层修改数据
- 修改完毕后清空redis数据缓存
- 显示修改完毕后的信息
category/edit.html
/**
* 完成 修改操作 事件
*/
function editCategroy(){
// 要修改的分类的id
var cid = HM.getParameter("cid");
// 将输入框中内容cname获取
var cname = $("#cname").val();
if(!cname.trim()){
//如果没写内容
alert("请输入分类名称!!")
return;
}
var url = "/admin?method=editCategory";
var params = "cid="+cid+"&cname="+cname;
HM.ajax(url,params,function(data){
if(data.code==1){
alert(data.message);
location.href="list.html";
}
})
}
AdminServlet
/*
完成 编辑操作 也就是修改操作
*/
public void editCategory(HttpServletRequest request, HttpServletResponse response)
throws InvocationTargetException, IllegalAccessException,
IOException {
//1:获取cid
String cid = request.getParameter("cid");
String cname = request.getParameter("cname");
Category category = new Category();
category.setCid(cid);
category.setCname(cname);
// 交给service
categoryService.editCategory(category);
//响应json格式 这种格式 需要跟前端商量!!!
// 按照 规则 去进行json的响应
// Result就是规则
Result result = new Result(Constant.SUCCESS,"分类信息修改成功");
//需要把 result变成json格式
response.getWriter().write(JSONObject.fromObject(result).toString());
}
CategoryService
//修改分类信息
@Override
public void editCategory(Category category) {
try {
categoryDao.editCategory(category);
// 将redis中数据清空
clearRedis();
} catch (SQLException e) {
e.printStackTrace();
}
}
CategoryDao
// 修改分类信息 根据cid修改cname
@Override
public void editCategory(Category category) throws SQLException {
String sql = "update category set cname = ? where cid = ?";
Object[] params = {category.getCname(),category.getCid()};
qr.update(sql,params);
}
删除商品分类
实现步骤:
- 提示用户是否确认删除
- 发送AJAX请求,提交分类主键
- 删除该商品分类,并清空redis数据库缓存
- 如果该分类下有商品,则不能删除
category/edit.html
/**
* 删除事件
*/
function del(cid){
if(confirm("您确认要删除该分类信息吗?")){
// 确认 执行删除操作
// 向服务器发送请求 根据cid删除该条记录
var url = "/admin?method=deleteCategory";
var params = "cid="+cid;
HM.ajax(url,params,function(data){
if(data.code==1){
//删除成功
alert(data.message);
location.reload();
}
if(data.code==0){
//删除失败
alert(data.message);
location.reload();
}
})
}
}
AdminServlet
/*
完成 根据cid删除分类信息
*/
public void deleteByCid(HttpServletRequest request, HttpServletResponse response)
throws InvocationTargetException, IllegalAccessException,
IOException {
//1:获取cid
String cid = request.getParameter("cid");
// 交给service
try {
//如果没问题 不会走 catch!!
categoryService.deleteByCid(cid);
} catch (CanNotDeleteException e) {
// 如果有问题 就会走catch
//给有问题的响应
Result result = new Result(Constant.FAILS,e.getMessage());
//需要把 result变成json格式
response.getWriter().write(JSONObject.fromObject(result).toString());
return;
}
//响应json格式 这种格式 需要跟前端商量!!!
// 按照 规则 去进行json的响应
// Result就是规则
Result result = new Result(Constant.SUCCESS,"删除分类信息成功");
//需要把 result变成json格式
response.getWriter().write(JSONObject.fromObject(result).toString());
}
CategoryService
// 根据cid删除数据
@Override
public void deleteByCid(String cid) throws CanNotDeleteException{
try {
// 删除之前 先根据cid查询一下 该分类下 是否还有关联的商品信息!!
long total = productDao.findTotalByCid(cid);
if(total>0){//有数据
// 分类信息下有数据 你还去删除 你说你是不是 做错了!!
//做了错事 就是错误 或者叫做异常
// java中用来表示问题 的 一个机制 就叫异常机制!!
// 做错事了 那么就要 报出来 抛出来!!
// throw new Exception("该分类信息有关联数据,不能删除!!");
// Exception 不要用老大!!
// 应该具体一点 自己定义一个不能删除的异常!!
// 将 不能删除的异常 抛出来
throw new CanNotDeleteException("该分类信息有关联数据,不能删除!!");
}else{//没有数据
categoryDao.deleteByCid(cid);
// 将redis中数据清空
clearRedis();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
CategoryDao
// 根据cid删除 分类信息
@Override
public void deleteByCid(String cid) throws SQLException {
String sql = "delete from category where cid = ?";
Object[] params = {cid};
qr.update(sql,params);
}