JavaWeb之控制层整理-网上书店(二十二)

后台控制

//过滤器已经实现编码问题
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

JavaWeb之控制层整理-网上书店(二十二)的相关文章

大项目之网上书城(十二)——完成啦

目录 大项目之网上书城(十二)--完成啦 主要改动 新增代码 1.addCategory.jsp 效果图 2.bookManager.jsp 效果图 3.userManager.jsp 效果图 4.error404.jsp 效果图 5.error500.jsp 效果图 6.errorelse.jsp 效果图 7.web.xml 8.addFenLeiServlet 9.bookDao里的addFenLei 总结 github页面 bookstoreZhang 大项目之网上书城(十二)--完成啦

【管理心得之二十二】小人物 仰视 大授权

场景再现====================Boss:小王,来我办公室一下.小王: 嗯Boss:近期总公司有会,需要到外地出差几日.我不在的这段期间里,公司大小事务你帮忙处理一下.          如果有什么难决定的事,第一时间电话.邮件联系我商定即可.小王:  明白.放心吧领导,绝不会让你失望的Boss:嗯,那就好,没事了. {小王走出办公室} 心中暗喜,"难道这就是传说中的授权,Boss不在的时候,我岂不是最高权力的行使者." ==================== 从场景

《Programming in Lua 3》读书笔记(二十二)

日期:2014.8.6 PartⅣ The C API 26 Extending Your Application 使用Lua很重要的一点是用来做配置语言.配合主语言做一些功能的配置. 26.1 The Basics 有的时候程序需要配置一些功能信息,很多时候可能有许多别的方法比用lua做配置要更简单:如使用环境变量或者读取文件,读取文件涉及到文件的解析.如果使用Lua进行配置的话,相当于用lua文件替代了要读取的如csv.txt文件等. 使用Lua进行配置的时候,就需要使用Lua API去控制

微软云计算介绍与实践(实践之二十二)

创建私有云Runbook 小张目前是手动管理大量(由晓红申请)的私有云.而自动化是私有云的重要特点,所以小张想用自动化功能去完成很多简单机械的任务.小张决定设法实现这一目标,利用System Center 2012 Orchestrator.于是我们看到了下面的内容: 1.登录到Orchestrator服务器Orchestrator 2.打开Runbook设计 3.在左边的连接下,在运行手册单击鼠标右键并选择New...>文件夹 4.给新文件夹的名称,例如CloudResources 5.在新创

从零开始学android&lt;SeekBar滑动组件.二十二.&gt;

拖动条可以由用户自己进行手工的调节,例如:当用户需要调整播放器音量或者是电影的播放进度时都会使用到拖动条,SeekBar类的定义结构如下所示: java.lang.Object ? android.view.View ? android.widget.ProgressBar ? android.widget.AbsSeekBar ? android.widget.SeekBar 常用方法 public SeekBar(Context context) 构造 创建SeekBar类的对象 publi

马哥学习笔记二十二——高可用集群原理

HA Resource:资源 FailOver:故障转移 FailBack:故障转回 资源粘性:资源是否倾向于留在当前节点 Messaging Layer:集群服务信息层,基于UDP互相传递心跳信息,集群事务信息等 heartbeat(v1,v2,v3) heartbeat v3:heartbeat,pacemaker,cluster-glue corosync cman keepalived ultramonkey CRM:(cluster resource manager)集群资源管理器,统

QT开发(二十二)——QMainWindow主窗口

QT开发(二十二)--QMainWindow主窗口 一.主窗口简介 应用程序中的主窗口是与用户进行长时间交互的顶层窗口,提供了应用程序的大部分功能,通常是应用程序启动后的第一个窗口,应用程序一般由一个主窗口和多个对话框组成. QT中直接支持主窗口,QMainWindow是QT中主窗口的基类,是继承于QWidget类的容器型组件. QMainWindow内部封装了菜单栏.工具栏.中心组件.停靠组件.状态栏等. QMainWindow内置了布局管理器,基本的组件布局如下: 二.菜单栏 QT中提供了预

企业搜索引擎开发之连接器connector(二十二)

下面来分析线程执行类,线程池ThreadPool类 对该类的理解需要对java的线程池比较熟悉 该类引用了一个内部类 /** * The lazily constructed LazyThreadPool instance. */ private LazyThreadPool lazyThreadPool; 该成员实现了单例模式,即该对象只有一个实例,属于懒汉式单例模式,当实例化该成员时,启用了线程同步机制 /** * Shut down the {@link ThreadPool}. Afte

JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中,也是能看到他的,所以还是非常值得去学习的一个知识点的,我们直接开车了 一.Map概述 泛型< k,v> 键值对,映射关系 基本特点 该集合存储键值对,是一对一对往里存,而且要保证键的唯一性 1.添加 put(key ,values) putAll() 2.删除 clear() remove(ob