您的位置 首页 java

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

用户模块

要登陆后才能购买,因此我们先写购买模块.

设计实体

设计数据库表

编写 Dao

抽取DAO

编写 service

前台样式

  • head. JSP
<div id="User">
 用户名:<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>
 

设计购物车实体

如果不清楚为什么这样设计,可参考我之前的博文:#t5

  • Cart实体

设计购物项实体

处理用户想要买的书籍Servlet

 <li><a href="${pageContext.request
.contextPath}/BuyServlet?book_id=${book.id}">购买</a></li>
 
  • BuyServlet
「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

提供显示购物车商品的Servlet

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

显示购物车的JSP页面

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

效果:

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

订单模块

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

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

设计订单实体

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

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

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

设计订单项实体

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

设计数据库表

  • 订单表

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

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

  • 订单项表:
「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

  • 表之间的结构:
「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

设计Dao

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

二次更新

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

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

抽取成DAO接口

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

BussinessService

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

生成订单的Servlet

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

用户查询自己的订单Servlet

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

显示订单数据的JSP

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

效果:

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

后台查询订单的状况Servlet

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

显示订单状况的JSP

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

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

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

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

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

处理发货的Servlet

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

效果:

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

添加权限控制

目前为止,我们已经学习了动态代理技术和注解技术了。于是我们想要为之前的bookStore项目添加权限控制…..

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


实现思路

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

之前我们做权限管理系统的时候,是根据用户请求的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
「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

抽取Service

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

CategoryService

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

ServiceFactory

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

PrivilegeExcetption

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

「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

我们继承的是Exception,通过方法名抛出去。但是我们是 通过代理对象调用方法的,于是sun公司的策略就是把它们转换成运行期异常抛出去

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


效果:

  • 没有登陆的时候:
「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

  • 登陆了,但是没有相对应的权限的时候
「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

  • 登陆了,并且有权限
「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

要点总结

该权限控制是十分优雅的, 只要我在Service层中添加一个注解…那么当web层调用该方法的时候就需要判断用户有没有该权限… .

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

文章来源:智云一二三科技

文章标题:「JavaWeb基础」图书管理系统:用户、购买、添加权限(修订版)

文章地址:https://www.zhihuclub.com/193600.shtml

关于作者: 智云科技

热门文章

网站地图