基于JSP网上书店系统 第4页
如图3-2为本系统的功能模块图。
若图片无法显示请联系QQ752018766
数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率,以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储的效率,保证数据的完整和一致。
针对一般在线书店的需求,得出如下需求信息。
§ 用户分为游客和已注册用户。
§ 订单分为单张详细订单和总订单。
§ 一个用户可以购买多本图书。
§ 一个用户对应一张订单。
§ 一个列表对应多张订单。
针对本系统功能分析,总结出如下的需求信息。
§ 用户,包括数据项:用户ID、用户名、密码。
§ 图书,包括数据项:图书编号、图书名、价格、图书介绍。
§ 订单列表,包括数据项:订单编号、图书编号、购书数量。
§ 订单,包括数据项:订单编号、用户编号、下单时间。
从本系统中规划出的实体有:用户实体、图书实体、订单实体、订单列表实体。
实体之间关系的E-R图如图3-3所示。
购书 用户 订单列表 订单 图书
1 N
M N
1
L
N
图3-3
用户信息实体的E-R图如图3-4所示。
图书实体的E-R图如图3-5所示。
订单实体的E-R图如图3-6所示。
订单列表实体的E-R图如图3-7所示。
若图片无法显示请联系QQ752018766
在线书店数据库中各个表的设计结果如下面的标和所示。
表3-8为图书信息列表。
我设计的这个系统是一个由JSP实现的网上购书系统。它实现了基本的登录验证、查询商品、分页处理、购物车处理以及订单处理功能,其主要界面见图4-1:若图片无法显示请联系QQ752018766
这个购书系统主要有2类文件,一类是Bean文件,我把它们统一放在了cart文件夹里,保存在jakarta-tomcat-5.0.27\common\classes\cart下,(这是tomcat要求的默认存放Bean的路径);另一类是jsp文件,保存在jakarta-tomcat-5.0.27\webapps\ROOT。(这是tomcat的默认工作环境)
Bean文件:CartManager.java,OrderEntity.java,OrderItemEntity.java
ProductEntity.java,UserEntity.java
Jsp文 件:cart.jsp
1)用户作为实体,我把他的id, 姓名,密码作为其属性在Bean里面做了定义,它们都是和数据库里的user表相对应的,在这个Bean里封装的方法也主要是对这个表进行操作.这个几个属性都被定义为类的私有成员,外界不可访问
private String id;
private String userName;
private String userPassword;
2)构造函数里做了2件事情,第一:寻找数据库连接驱动;第二:对上面的3个私有成员初始化:
public static String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
public static String sConnStr = "jdbc:odbc:cart";
public static Connection conn = null;
public UserEntity(String id,String userName,String userPassword)
{
try
{
Class.forName(sDBDriver);
//采用Class.forName方法显式加载一个驱动程序
}
catch(java.lang.ClassNotFoundException e)
{
System.err.println("UserEntity: " + e.getMessage());
}
this.id=id;
this.userName=userName;
this.userPassword=userPassword;
}
根据上面对变量sDBDriver ,sConnStr的定义和初始化可以看出,我在连接数据库的时候采用的是jdbc-odbc桥的方式,这种方式采用的驱动是JDK自带的,不需要另外安装。但是,为了与特定的数据库连接,我们必须建立一个数据源:cart。给3个属性赋值,我利用了this指针。
3)这个类我封装了2类方法:一是查找特定用户名的所有记录,代码如下:
public static UserEntity queryUser(String userName) throws SQLException
{
try
{
Class.forName(sDBDriver);
}
catch(java.lang.ClassNotFoundException e)
{
System.err.println("UserEntity: " + e.getMessage());
}
//query from database
String sql="select id,user_name,user_password from user where user_name= ? ";
ResultSet rs = null;
try
{
conn = DriverManager.getConnection(sConnStr);
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1,userName);
rs = prepStmt.executeQuery();
}
catch(SQLException ex)
{
System.err.println("OrderItemEntity executeQuery: " + ex.getMessage());
}
UserEntity user=null;
if(rs.next())
user=new UserEntity(rs.getString(1),rs.getString(2),rs.getString(3));
return user;
}
这个函数有1个参数,String userName,就是通过这个用户名在user表里查询相应的用户的。要查询数据库里user表,就必须先连接数据库。连接数据库第一步是加载驱动,之后就是进行连接。我采用DriverManager类的getConnection方法来建立与cart数据源的连接,连接成功后,返回一个Connection类的对象conn.要查找特定用户名的纪录,其实就是对uesr进行查询操作。PreparedStatement对象就是用于查询语句的执行,它是Statement的子类,与Statement不同的地方,PreparedStatement对象可以接受参数,这里需要接受的参数是user_name,然后进行预编译。在每一次执行这个查询,都可以给sql语句传输不同的user_name,这样大大提高了灵活性。要想查询后的结果最后显示给用户,必须对ResultSet对象进行操作,即对rs进行操作。我在程序里是把该记录赋给一个UserEntity对象。
该类封装的另一种方法是:用户名和密码的获得。这个主要是为了方便后面验证用户合法性使用
public String getUserName()
{
return userName;
}
public String getUserPassword()
{
return userPassword;
}
虽然我做的是一个购书系统,但考虑到系统的可扩展性,我把书当作一种商品来进行定义。同样,参照数据库里的product表,我给商品这个类定义了如下4个属性,商品id,商品名称,商品价格,商品note,其类型同样是该类的私有属性:
private String id;
private String productName;
private String productPrice;
private String productNote;
1)其构造函数和用户实体类基本上一致,所以代码及其说明我在这里就省略了。
2)对商品的操作也主要是2类,一类是对特定商品的查询,其原理和查询用户是一样的,但是有一点小小的区别,即查询商品可以使查询所有的商品,或者是查询特定id的商品,我通过以下代码把这2种查询合在了queryProduct这个函数里:
String sql="select id,product_name,product_price,product_note from product ";
if(productId.compareTo("")!=0)
sql=sql+" where id = ? ";
Vector v=new Vector();
ResultSet rs = null;
其关于连接数据库,查询记录的代码和上面的大致雷同,所以在这里就省略了。
显示商品是分页显示的,其代码如下:
while(rs.next())
{
++i;
if(i>pageCount*pageSize)
{
if(i<=(pageCount+1)*pageSize)
v.add(new ProductEntity(rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4)));
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页