后台控制
//过滤器已经实现编码问题 String op = request.getParameter("op"); if("addCategory".equals(op)) { addCategory(request,response); } else if("showAllCategories".equals(op)) { showAllCategories(request,response); } else if("addBookUI".equals(op)) { addBookUI(request,response); } else if ("addBook".equals(op)) { addBook(request,response); } else if("showAllBooks".equals(op)) { showAllBooks(request,response); } else if("login".equals(op)) { login(request,response); } else if("managerLogout".equals(op)) { managerLogout(request,response); } 一、 添加分类(添加分类模块--链接) 1. 添加分类将表单数据添加到Category中 2. 调用业务逻辑方法进行添加到数据库中 3. 添加成功提示 response.getWriter().write("<font color=‘green‘>保存成功</font>"); 4. 否则 response.getWriter().write("<font color=‘red‘>保存失败,类别已经存在</font>"); 二、 显示所有分类(查询分类模块--链接) 1. 调用业务方法查询所有分类 2. 将categories设置到request域中 3. 转发到/manager/showAllCategories.jsp 三、 链接到添加书籍页面(添加图书模块--链接) 1. 调用业务方法查询所有分类 2. 将categories设置到request域中 3. 转发到/manager/addBookUI.jsp 四、 添加书籍(添加图书模块--链接) 1. 判断是enctype是否是multipart,如果不是提示信息,返回 response.getWriter().write("请选择正确的enctype类型<a href=‘"+request.getContextPath()+"/manager/addBookUI.jsp‘>返回操作</a>"); 2. 创建文件上传对象,解析请求参数,创建book对象 3. 遍历解析到的请求对象,如果是普通字段,直接获取字段名和值,通过BeanUtils工具设置到book对象中 4. 如果不是上传字段 1). 得到文件名,唯一文件名+扩展名FilenameUtils.getExtension,将文件名设置到book对象中 2). 获取文件存储路径,如果路径不存在就创建该目录 3). 构建子目录,将子目录存储到book的path中 4). 将上传文件写入存储路径中 5. 调用业务方法将book添加到数据库中 request.setAttribute("msg","<script type=‘text/javascript‘>alert(‘文件保存成功‘);</script>"); 6. 为了重新获取书籍分类,要重新查所有分类再转发到/manager/addBookUI.jsp 五、 显示书籍(查看图书模块--链接) 1. 获取请求页码 2. 调用业务方法查询PageBean对象 findBookPageByPageNum(pageNum) 3. 设置url地址,pb.setUrl(request.getContextPath()+"/servlet/ManagerServlet?op=showAllBooks"); 4. 将page设置到request域中 5. 转发到"/manager/listBooks.jsp"
前台控制
String op = request.getParameter("op"); if("showIndex".equals(op)) { showIndex(request, response); } else if("listBookByCategory".equals(op)) { listBookByCategory(request,response); } else if("buyBook".equals(op)) { buyBook(request,response); } else if("delOneItem".equals(op)) { delOneItem(request,response); } else if("delMultiItem".equals(op)) { delMultiItem(request, response); } else if("changeItemNum".equals(op)) { changeItemNum(request,response); } else if("regist".equals(op)) { regist(request,response); } else if("active".equals(op)) { active(request,response); } else if("login".equals(op)) { login(request,response); } else if("logout".equals(op)) { logout(request,response); } else if("getOrders".equals(op)) { getOrders(request,response); } else if("showOrders".equals(op)) { showOrders(request,response); } else if("pay".equals(op)) { pay(request,response); } else if("payUI".equals(op)) { payUI(request,response); } 一、 显示前台主页(首页模块-->链接) 1. 查询所有分类,将分类的集合categories设置到request域中 2. 获取请求的页码,调用业务方法通过页码查找书籍得到一个PageBean对象 3. 设置url、设置page到request域中 4. 转发到listBooks.jsp中 二、 按照分类查询所有书籍 1. 查询所有分类,将分类的集合categories设置到request域中 2. 获取请求参数:页码和分类的id(categoryId) 3. 调用业务方法,查找PageBean对象通过页码和分类id 4. 设置url、设置request域中对象page 5. 转发到listBooks.jsp 三、 购买链接 1. 获取书籍bookId 2. 调用业务方法通过bookId查找书籍findBookId(bookId) 3. 获取session,从session域中查找购物车cart 4. 若cart为空,创建cart对象,将cart设置到session域中 5. 将书籍添加到购物车中 6. AJax响应数据,response.getWriter().write("<font color=‘red‘>购买成功,如需查看您购买的物品,请点击购物车</font"); 四、 删除单个项目 1. 获取请求参数bookdId 2. session域查找cart 3. 在购物车中移除该bookid 4. 重定向到showCart.jsp 五、 删除多个项目 1. 获取请求的ids一个数组 2. 获取session中的cart 3. 遍历ids,通过购物车进行移除 4. 重定向到/showCart.jsp 六、 改变购物项数量 1. 获取数量和书籍编号num/bookId 2. 将获取的数量强转一个int类型newNum,要作异常处理 3. 获取session对象,获取session对象的购物车 4. 如果购物车不为空,并且购物项大于0 通过书籍编号查找该购物项,设置该购物项的数量 5. 重定向到showCart.jsp 七、 注册用户(Customer) 1. 将请求的注册信息注入到Customer对象中 2. 设置客户id/code(激活码) 3. 调用业务方法进行注册用户registCustomer(c) 4. 注册成功提示信息 response.getWriter().write( "注册成功,激活码已发送到您的" + c.getEmail() + "信件中..."); 5. 如果注册时有异常就对其提示注册失败 #发送邮件 1. 开启一个SendMail类专用于发送邮件的线程 2. 构造接收客户信息和请求地址的构造函数 3. 定义props集合存储协议... 4. 创建Session、MemeMessage(邮件信息) 5. 设置发送者、接收类型、主题、内容 message.setContent("欢迎加入黑马<br/>如需激活您的账户<a href=‘http://localhost:8080/"+context+"/servlet/ClientServlet?op=active&username="+c.getUsername()+"&code="+c.getCode()+"‘>激活</a>欢迎骚扰~", "text/html;charset=UTF-8"); 保存邮件改变信息,message.saveChanges(); 6. 通过session对象得到一个火箭,设置用户名、密码connect 7. 设置发送messsage对象,和接受者 八、 激活邮件处理 1. 获取用户名和激活码 2. 调用业务方法进行激活activedCustomer(username, code) 3. 提示信息 response.getWriter().write("激活成功"); response.setHeader("Refresh", "2;URL="+request.getContextPath()); 4. 否则提示服务器忙 九、 登录操作 1. 获取用户名、密码请求参数 2. 调用业务方法进行验证loginCustomer(username, password) 3. 如果得到的用户为空,提示信息 response.getWriter().write("提示用户名和密码错误或者未激活,2秒后跳到登录页面"); response.setHeader("Refresh", "2;URL="+request.getContextPath()+"/login.jsp"); 4. 否则就将用户customer设置到session域中 5. 提示登录成功 response.getWriter().write("登录成功,2秒后跳到主页"); response.setHeader("Refresh", "2;URL="+request.getContextPath()); 十、 注销操作 1. 移除session域中的用户customer 2. 提示信息 response.getWriter().write("注销成功,2秒后跳到登录页"); response.setHeader("Refresh", "2;URL="+request.getContextPath()+"/login.jsp"); 十一、 生成订单getOrder 1. 得到session对象,从session域中查找customer 2. 如果用户为空跳转 response.sendRedirect(request.getContextPath()+"/login.jsp"); return; 3. 从session域中获取购物车对象 4. 创建Orders对象 5. 设置订单号OrdersNum,设置总金额、总数量、设置订单对应的Customer 6. 遍历购物车中的购物项 7. 获取每一个购物项 8. 创建LineItem对象,存储订单明细 9. 设置订单明细的id,设置数量,小计,设置对应的书籍Book 10. 将订单明细添加到订单中orders 11. 调用业务方法生成订单信息genOrders(orders); 12. 将订单设置到request域中,转发到pay.jsp request.setAttribute("o", orders); request.getRequestDispatcher("/pay.jsp").forward(request, response); 十二、 显示订单(我的订单)showOrders 1. 从session域中查找customer 2. 如果customer为空重定向到/login.jsp 3. 调用业务方法获取所有订单findOrdersByCustomerId(c.getId()) 4. 将订单设置到request域中 5. 转发到/showCustomerOrders.jsp
在线支付
一、 结算购物车商品pay 1. 获取订单号orderid、金额money、银行类型pd_FrpId 2. 封装参数 url="http://localhost:8080/"+request.getContextPath()+"/servlet/PaymentResponse" String hmac = PaymentUtil.buildHmac(...); 3. 将参数设置到request域中,转发到sure.jsp 4. sure.jsp表单提交到https://www.yeepay.com/app-merchant-proxy/node 5. 建立PaymentResponse类,获取request域中的值 6. 验证数据是否有效PaymentUtil.verifyCallback 7. 如果有效 r1_Code:1代表成功 r9_BType:2代表服务器点对点通信,若设置2就必须会写sucess if("1".equals(r1_Code)) { if("2".equals(r9_BType)) { response.getWriter().write("success"); } } 8. 如果if("1".equals(r1_Code))成功,调用业务方法findOrdersByOrdersNum(r6_Order) 9. 将查询到的订单修改状态,然后再调用业务方法更新订单 10. 提示信息 response.getWriter().write("支付成功!,<a href=‘http://localhost:8080/"+request.getContextPath()+"/showCustomerOrders.jsp‘>点击返回订单页面</a>"); 二、 我的订单中(付款操作) 1. 获取session对象,从session中查找customer 2. 如果为空跳转到 response.sendRedirect(request.getContextPath()+"/login.jsp"); return; 3. 获取订单号,调用业务方法查询该订单 4. 将查询到的订单设置到request域中 5. 转发到/pay.jsp中
权限控制
一、 用户登录 1. 获取请求的参数username&password 2. 业务层进行验证登录,返回user对象 3. 判断user是否为空,若不为空设置到session域中 重定向manager/index.jsp; 4. 若为空 response.getWriter().write("错误的用户名或密码,请重新登录"); 跳转到login/login.jsp 二、 用户注销 1. 从session域中移除user对象 2. 重定向/login/login.jsp #### 权限过滤器(基于URI地址过滤权限问题) 1. 对于登录、注销、获取Ajax引擎不需要过滤,所以这几个采用直接放行 2. 获取请求地址getRequestURI(),获取请求参数getQueryString(),如果请求参数不为空,拼接uri地址 3. 替换应用名为空字符串,为了在后面和权限中的地址做判断 4. 获取session中的user对象,如果user为空,重定向到后台登录页/login/login.jsp 5. 创建菜单集合menus,用作存储数据库中查询到的集合 6. 调用业务方法,通过user查找Role权限集合 service.findUserRoles(user); 7. 遍历权限集合,然后获得每一个权限对象,通过权限对象获取菜单集合service.findMenuRole(role); 8. 将查到的菜单集合添加到menus中 9. 定义一个变量hasPermission,判断是否有该权限 10. 遍历menus,判断菜单模块中的地址是否和请求的地址是否相等,如果相等设置hasPermission为true,break; 11. 如果hasPermission为true,直接放行,否则就提示没有权限
时间: 2024-10-29 19:09:39