设计实体

设计数据库表

编写DAO

jspdiv中不能用百分比定位JavaWeb基本图书治理体系用户购置添加权限修订版 Ruby

抽取DAO

编写Service

前台样式

head.jsp

<div id=\"大众User\"大众&gt; 用户名:<input type=\"大众text\公众 name=\"大众username\"大众> 密码:<input type=\公众password\"大众 name=\公众password\"大众> <button name=\公众login\公众>上岸</button> <button name=\公众register\"大众>注册</button></div>head.css

#body { position: relative;}#user { position: absolute; margin-top: 130px; margin-left: 1364px;}效果:

实现上岸注册功能

当点击上岸按钮的时候,把数据带过去给Servlet,让Servlet调用BusinessService方法,实现上岸。
注册同理…..因此,我们须要用到JavaScript代码

head.jsp

javaScript代码

UserServlet

购买模块

在显示图书的时候,顺便添加购买的超链接

<li><a href=\"大众#\"大众>购买</a></li>

设计购物车实体

如果不清楚为什么这样设计,可参考我之前的博文:http://blog.csdn.net/hon_3y/article/details/56481439#t5

Cart实体

设计购物项实体

处理用户想要买的书本Servlet

<li><a href=\"大众${pageContext.request.contextPath}/BuyServlet?book_id=${book.id}\公众>购买</a></li>BuyServlet

供应显示购物车商品的Servlet

显示购物车的JSP页面

效果:

订单模块

在前台用户界面中,当用户要把购物车付款时,该当供应天生订单的超链接….

设计订单实体

订单该当包含id,收货人信息,下单的韶光,订单的总价,订单的状态【有无发货】..而不应该包含商品的信息的。
商品的信息用一个专门的”订单项“来表示

一个订单对应多个订单项,这是一对多的关系!

设计订单项实体

设计数据库表

订单表

mysql不能创建名为”order”的表,后边加个s就可以

订单项表:

表之间的构造:

设计Dao

二次更新

在编写dao的时候,尤其是Add方法。
它是将所有数据都封装到Order工具上,然后取出数据,把数据插入到数据表中

实在,我们的Order和OrderItem的操作可以分开。
OrderItem也可以其余编写一个Dao,那么我们在插入完Order工具之后,得到Order工具返回的主键,再调用OrderItemDao的方法来插入OrderItem的数据,这样我以为会让代码清晰一些。
在OrderItemDao中吸收的是一个`List`,由于我们一个订单会对应多个订单项。

抽取成DAO接口

BussinessService

天生订单的Servlet

用户查询自己的订单Servlet

显示订单数据的JSP

效果:

后台查询订单的状况Servlet

显示订单状况的JSP

查看详细订单的详细信息Servlet

查看详细订单的详细信息JSP

处理发货的Servlet

效果:

添加权限掌握

目前为止,我们已经学习了动态代理技能和表明技能了。
于是我们想要为之前的bookStore项目添加权限掌握…..

只有用户有权限的时候,后台管理才可以进行相对应的操作…..

实现思路

之前我们做权限管理系统的时候,是根据用户要求的URI来判断该链接是否须要权限的。
这次我们利用动态代理的技能和表明来判断:用户调用该方法时,检讨该方法是否须要权限…

根据MVC模式,我们在web层都是调用service层来实现功能的。
那么我们详细的思路是这样的:

web层调用service层的时候,得到的并不是ServiceDao工具,而是我们的代理工具在service层中的方法添加表明,如果方法上有表明,那么解释调用该方法须要权限…当web层调用代理工具方法的时候,代理工具会判断该方法是否须要权限,再给出相对应的提示….

设计实体、数据库表

上次我们做的权限管理系统是引入了角色这个观点的,这次紧张为了练习动态代理和表明技能,就以大略为主,不引入角色这个实体。
直接是用户和权限之间的关系了。

Privilege实体

数据库表

privilege表

CREATE TABLE privilege ( id VARCHAR(40) PRIMARY KEY, name VARCHAR(40));

privilege和user是多对多的关系,于是利用第三方表来掩护他们的关系

user_privilege表

CREATE TABLE user_privilege ( privilege_id VARCHAR(40), user_id VARCHAR(40), PRIMARY KEY (privilege_id, user_id), CONSTRAINT privilege_id_FK FOREIGN KEY (privilege_id) REFERENCES privilege(id), CONSTRAINT user_id_FK1 FOREIGN KEY (user_id) REFERENCES user(id));

添加测试数据

为了方便,直接添加数据了。
就不写详细的DAO了。

在数据库中添加了两个权限

这里写图片描述

为id为1的user添加了两个权限

编写DAO

后面在动态代理中,我们须要检讨该用户是否有权限…那么就必须查找出该用户拥有的哪些权限。
再看看用户有没有相对应的权限

抽取到接口上

List<Privilege> findUserPrivilege(String user_id);

表明模块

编写表明

@Retention(RetentionPolicy.RUNTIME)public @interface permission { String value();}在Service层方法中须要权限的地方添加表明CategoryServiceImpl

抽取Service

把Service的方法抽取成ServiceDao。
在Servlet中,也是通过ServiceFactory来得到Service的工具【和DaoFactory是类似的】

CategoryService

ServiceFactory

PrivilegeExcetption

当用户没有上岸或者没有权限的时候,我们该当给用户一些友好的提示….于是我们自定义了PrivilegeException

我们继续的是Exception,通过方法名抛出去。
但是我们是通过代理工具调用方法的,于是sun公司的策略便是把它们转换成运行期非常抛出去。

因此,我们就在Servlet上得到非常,再给出友好的提示。

效果:

没有上岸的时候:

上岸了,但是没有相对应的权限的时候

上岸了,并且有权限

要点总结

该权限掌握是十分优雅的,只要我在Service层中添加一个表明…那么当web层调用该方法的时候就须要判断用户有没有该权限….

外界调用Service层的方法是代理调用invoke()方法,我们在invoke()方法可以对其进行增强!
invoke()方法内部便是在查询调用该方法上有没有表明,如果没有表明,就可以直接调用。
如果有表明,那么就得到表明的信息,判断该用户有没有权限来访问这个方法在反射详细方法的时候,必须记得要给出相对应的参数!
在invoke()方法抛出的编译期间非常,java会自动转换成运行期非常进行抛出…利用contains()方法时,就要重写该工具的hashCode()和equals()

原文地址:https://dwz.cn/K6hlBAnN作者:Java3y