第26章  JSP+Struts+Hibernate开发实例
以上章节详细介绍了Struts和Hibernate技术,这一章将综合使用这两个当今最为流行的Web开发技术,在第24章创建的实例基础上,来重新实现用户登录系统,并且增加购物车功能,Struts提供了很好的MVC设计模式的支持;Hibernate是很好的数据层技术,可以实现完全的面向对象数据库设计。接下来就向读者展示这两种技术完美结合。
本章要点包括以下内容:
❑列举实例介绍
❑Struts+Hibernate技术的结合使用
❑Hibernate的自动生成工具使用
26.1  实例介绍
26.1.1  实例所实现的功能
除了第24章中实例所展示的功能之外,将增加如下功能:
(1)当用户登录后,在首页中将显示“产品展示”链接和“我的购物车”链接,如图26.1所示。具体如何实现,请查看下面将要创建的index.jsp页面代码。
图26.1  首页效果
(2)单击“产品展示”链接,出现如图26.2所示的页面效果,此页面显示出所有产品信息。并可以单击“加入购物车”链接把此产品加入到购物车。具体实现将在后面讲解。
·438·
Eclipse从入门到精通
图26.2  产品展示
(3)在首页中单击“我的购物车”链接可以查看到已经购买到的产品信息,包括此产品的购买数量。在如图26.3所示的页面中,单击“删除”链接可以把此产品从购物车中消除,。此处有一个不完善的地方,当顾客想减少产品数量,而不是删除时,将无法操作。如果读者有兴趣,可以自行实现。其实非常简单,只要实现一个操作数据库表user_product中存放购买数量的方法即可。
图26.3  我的购物车
26.1.2  文件的结构
在二十四章创建的实例基础,需要创建和修改的文件如下:
(1)修改User.java接口类和DBUser.java类文件:在这两个类中增加一个List集合类型的products 属性,用于存储用户购买的所有产品。需要注意的是,DBUser为持久层的实体类,User只是DBUser 类的一个接口。这样的设计模式只是为了后期代码扩展。
(2)创建Product.java接口类和DBProduct.java类文件:需要注意的是,此类中也定义了一个List 集合类型的users属性,用于存储购买此类产品的所有用户信息,所以DBUser和DBProduct实体类之间是多对多的关系。另外还定义了一个Kind类型的属性,该属性记录该产品所属的类型。
(3)创建Kind.java接口类和DBKind.java类文件:该类为产品类型的实体类。DBProduct对DBKind 实体类是多对一的关系,即多个产品可以为一种类型,但是不允许一个商品同时属于多个类型。
第18章常用插件扩展点·439·
(4)修改Struts的配置文件l,详细见下面的l文件。
(5)在MyLogin项目的j2src\cn\login目录下创建hibernate的映射文件l,详细见本章下面内容。
(6)根据创建的实体类以及映射文件显示的实体之间的关系来创建相应的数据库表,读者除了手动建立数据库表之外还可以使用net.l.hbm2ddl.SchemaExportTask工具自动生成相应的数据库表。在此实例中,将手动创建如下数据库表:p_kind、product、user_product以及users(此表在第十二章介绍的实例中已经创建,此处直接使用,不需要修改)。user_product为users和product之间的关系表,记录着它们之间的多对多的关系。
(7)创建AbstractProduct.java抽象类和SqlProduct.java类文件:该类定义了对产品实体类进行数据库操作的各种方法,AbstractProduct.java为抽象类,实现了listProduct()和listProducts()两个方法。这里SqlProduct只是空实现,随着功能的增加,将再对SqlProduct进行扩展。
(8)修改第十四章创建的AbstractUser.java抽象类和SqlUser.java类文件,这两个类主要是使用Hibernate进行数据层操作。具体详见这两个文件的源代码。
jsp创建
(9)创建ShopCarForm.java类和ShopCarAction.java类。
(10)创建相应的页面JSP文件:myShopCar.jsp用于显示购物车中的信息;listProduct.jsp显示出所
有的产品信息。另外修改index.jsp页面,在<logic:present name="user">体中添加“产品展示”和“我的购物车”两个链接。
(11)另外,还需要使用到上一章已经创建的HibernateUtil.java类文件。
26.2  Struts+Hibernate开发
有了以上的介绍之后,下面正式进入开发阶段。
26.2.1  创建实体类
需要创建的实体类依次如下:
26.2.1.1.修改用户实体类DBUser和接口User
在第24四章实例中创建的DBUser添加一个List集合类型的属性products变量,用于记录所有的购买的商品信息。添加代码如下:
private List products = new ArrayList();
相应的set和get方法如下:
public void setProducts(List products){
=
products;
this.products
}
public List getProducts(){
products;
return
}
在这个实例当中还继续使用了接口继承的编程思路,对以上的set和get方法在User接口中进行定义。如下所示:
public void setProducts(List products);
public List getProducts();
读者一定要注意的是,DBUser被用作为实体类,而不是User接口类作为实体类。
·440·
Eclipse从入门到精通
26.2.1.2.创建商品实体类DBProduct和Product接口
在包del下创建商品接口类Product,代码如下:
package del;
import java.util.List;
public interface Product {
/*****只定义各属性对应的set和get方法,但不实现*****/
public void setId(int id);
public int getId();
public void setName(String name);
public String getName();
public void setPrice(float price);
public float getPrice();
public void setStocks(int stocks);
public int getStocks();
public void setKind(Kind kind);
public Kind getKind();
public void setDiscription(String discription);
public String getDiscription();
public void setUsers(List users);
public List getUsers();
}
程序说明:DBProduct实体类(包名为del)继承这个接口类,并定义各个相应属性。注意List集合类型的users属性是用来存储购买这种产品的用户,所以这里商品实体类和用户实体类之间是多对多的关系。
26.2.1.3.创建商品种类实体类DBKind和Kind接口
在del包下创建Kind接口类,详细代码代码如下:
package del;
public interface Kind {
/*****只定义各属性对应的set和get方法,但不实现*****/
public void setId(int id);
public int getId();
public void setName(String name);
public String getName();
public void setDiscription(String discription);
public String getDiscription();
}
程序说明:SqlKind实体类(包名为:del)继承这个接口类,并定义相应属性,此实体类用于记录产品的种类信息。商品实体类DBProduct和种类实体类DBKind之间是多对一的关系。
三个实体类DBuser、DBProduct和DBKind之间的关系如下:
❑用户实体类DBuser和商品实体类DBProduct之间是多对多的关系,即一名用户可以购买多个商品,一个商品也可以由多个用户购买,所在这两个实体类中都定义一个List类型的属性,用于存储对方信息。对应数据库表,需要在这两个之间创建一个user_product表来表示它们之间的关系,以及存储彼此的信息。
❑商品实体类DBProduct和种类实体类DBKind之间是多对一的关系,即多个商品可以同属于一种商品类别,但是一个商品只能属于一种类别。在DBProduct实体类中定义了一个Kind类属性,
第18章常用插件扩展点·441·
来表示此商品所属的商品类别。
下面根据需要实现的功能以及三个实体类之间的关系,来配置相应的映射文件l以及Struts配置文件l。
26.2.2  创建XML配置文件
26.2.2.1  创建映射文件l
在MyLogin项目中的j2src\cn\login目录下创建Hibernate的实体类到数据库表的映射文件l,根据前一章的讲解,这是Hibernate中最为重要的一步。它不仅表示了实体之间的关系,还定义实体类如何向数据库表进行映射,也就是说这一文件告诉了Hibernate应该如何进行数据层的操作。详细的代码内容如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"hibernate.sourceforge/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
关于实体类SqlUser的映射关系  -->
<!--
<class name="del.DB User" table="users">
<id name="user_id" unsaved-value="0">
<generator class=" assigned "/>
</id>
<property name="password"/>
<property name="name"/>
<property name="sex"/>
<property name=”birth”/>
<property name="descrption"/>
<list name="products" table="user_product" lazy=”true”>
<key column="user_id"/>
<index column="position"/>
<many-to-many class="del.DBProduct" column="product_id"/>
</list>
</class>
<!-- 关于实体类SqlKind的映射关系  -->
<class name="del.DBKind" table="p_kind">
<id name="id" unsaved-value="0">
<generator class="increment"/>
</id>
<property name="name"/>
<property name="discription"/>
</class>
<!-- 关于实体类SqlProduct的映射关系  -->
<class name="del.DBProduct" table="product">
<id name="id" unsaved-value="0">
<generator class="increment"/>
</id>
<property name="name"/>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。