admin 管理员组

文章数量: 887031


2023年12月20日发(作者:怎么判断十六进制是不是汉字)

第26章 JSP+Struts+Hibernate开发实例

以上章节详细介绍了Struts和Hibernate技术,这一章将综合使用这两个当今最为流行的Web开发技术,在第24章创建的实例基础上,来重新实现用户登录系统,并且增加购物车功能,Struts提供了很好的MVC设计模式的支持;Hibernate是很好的数据层技术,可以实现完全的面向对象数据库设计。接下来就向读者展示这两种技术完美结合。

本章要点包括以下内容:

 列举实例介绍

 Struts+Hibernate技术的结合使用

 Hibernate的自动生成工具使用

26.1 实例介绍

26.1.1 实例所实现的功能

除了第24章中实例所展示的功能之外,将增加如下功能:

(1)当用户登录后,在首页中将显示“产品展示”链接和“我的购物车”链接,如图26.1所示。具体如何实现,请查看下面将要创建的页面代码。

图26.1 首页效果

(2)单击“产品展示”链接,出现如图26.2所示的页面效果,此页面显示出所有产品信息。并可以单击“加入购物车”链接把此产品加入到购物车。具体实现将在后面讲解。

·438·

Eclipse从入门到精通

图26.2 产品展示

(3)在首页中单击“我的购物车”链接可以查看到已经购买到的产品信息,包括此产品的购买数量。在如图26.3所示的页面中,单击“删除”链接可以把此产品从购物车中消除,。此处有一个不完善的地方,当顾客想减少产品数量,而不是删除时,将无法操作。如果读者有兴趣,可以自行实现。其实非常简单,只要实现一个操作数据库表user_product中存放购买数量的方法即可。

图26.3 我的购物车

26.1.2 文件的结构

在二十四章创建的实例基础,需要创建和修改的文件如下:

(1)修改接口类和类文件:在这两个类中增加一个List集合类型的products属性,用于存储用户购买的所有产品。需要注意的是,DBUser为持久层的实体类,User只是DBUser类的一个接口。这样的设计模式只是为了后期代码扩展。

(2)创建接口类和类文件:需要注意的是,此类中也定义了一个List集合类型的users属性,用于存储购买此类产品的所有用户信息,所以DBUser和DBProduct实体类之间是多对多的关系。另外还定义了一个Kind类型的属性,该属性记录该产品所属的类型。

(3)创建接口类和类文件:该类为产品类型的实体类。DBProduct对DBKind实体类是多对一的关系,即多个产品可以为一种类型,但是不允许一个商品同时属于多个类型。

第18章 常用插件扩展点

·439·(4)修改Struts的配置文件,详细见下面的文件。

(5)在MyLogin项目的j2srccnlogin目录下创建hibernate的映射文件,详细见本章下面内容。

(6)根据创建的实体类以及映射文件显示的实体之间的关系来创建相应的数据库表,读者除了手动建立数据库表之外还可以使用ExportTask工具自动生成相应的数据库表。在此实例中,将手动创建如下数据库表:p_kind、product、user_product以及users(此表在第十二章介绍的实例中已经创建,此处直接使用,不需要修改)。user_product为users和product之间的关系表,记录着它们之间的多对多的关系。

(7)创建抽象类和类文件:该类定义了对产品实体类进行数据库操作的各种方法,为抽象类,实现了listProduct()和listProducts()两个方法。这里SqlProduct只是空实现,随着功能的增加,将再对SqlProduct进行扩展。

(8)修改第十四章创建的抽象类和类文件,这两个类主要是使用Hibernate进行数据层操作。具体详见这两个文件的源代码。

(9)创建类和类。

(10)创建相应的页面JSP文件:用于显示购物车中的信息;显示出所有的产品信息。另外修改页面,在体中添加“产品展示”和“我的购物车”两个链接。

(11)另外,还需要使用到上一章已经创建的类文件。

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){

ts = products;

}

public List getProducts(){

return products;

}

在这个实例当中还继续使用了接口继承的编程思路,对以上的set和get方法在User接口中进行定义。如下所示:

public void setProducts(List products);

public List getProducts();

读者一定要注意的是,DBUser被用作为实体类,而不是User接口类作为实体类。

·440·

Eclipse从入门到精通

26.2.1.2.创建商品实体类DBProduct和Product接口

在包下创建商品接口类Product,代码如下:

package ;

import ;

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实体类(包名为)继承这个接口类,并定义各个相应属性。注意List集合类型的users属性是用来存储购买这种产品的用户,所以这里商品实体类和用户实体类之间是多对多的关系。

26.2.1.3.创建商品种类实体类DBKind和Kind接口

在包下创建Kind接口类,详细代码代码如下:

package ;

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实体类(包名为:)继承这个接口类,并定义相应属性,此实体类用于记录产品的种类信息。商品实体类DBProduct和种类实体类DBKind之间是多对一的关系。

三个实体类DBuser、DBProduct和DBKind之间的关系如下:

 用户实体类DBuser和商品实体类DBProduct之间是多对多的关系,即一名用户可以购买多个商品,一个商品也可以由多个用户购买,所在这两个实体类中都定义一个List类型的属性,用于存储对方信息。对应数据库表,需要在这两个之间创建一个user_product表来表示它们之间的关系,以及存储彼此的信息。

 商品实体类DBProduct和种类实体类DBKind之间是多对一的关系,即多个商品可以同属于一种商品类别,但是一个商品只能属于一种类别。在DBProduct实体类中定义了一个Kind类属性,

第18章 常用插件扩展点

·441·来表示此商品所属的商品类别。

下面根据需要实现的功能以及三个实体类之间的关系,来配置相应的映射文件以及Struts配置文件。

26.2.2 创建XML配置文件

26.2.2.1 创建映射文件

在MyLogin项目中的j2srccnlogin目录下创建Hibernate的实体类到数据库表的映射文件,根据前一章的讲解,这是Hibernate中最为重要的一步。它不仅表示了实体之间的关系,还定义实体类如何向数据库表进行映射,也就是说这一文件告诉了Hibernate应该如何进行数据层的操作。详细的代码内容如下:

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"/">

·442·

Eclipse从入门到精通

代码说明:

(1)代码中定义的表示关键字段id自动增加,对应的SQL语句,就是使用Max函数把数据库表的最大id值取出,然后加一在赋值给新的id。关于generator的属性在上一章已经有详细介绍。

(2)根据口诀“类的字段有则映射有、类的字段无则映射无”,所以在DBProduct实体类的映射配置中定义了关系。

 name=”kind”对应DBProduct实体类内中的属性名

 column="kind_id"对应数据库表product中的字段kind_id,通过这个外部关键字来与数据库表p_kind进行关联。

 class=""定义了商品类别的实体类DBKind。

 cascade="save-update"属性设置表示Hibernate会进行自动关联存储,例如,存储实体类DBProduct时,会把DBProduct指定的DBKind实体类也一便存储。

(3)在DBUser实体类映射配置中定义了List集合映射,此处没有使用Set集合类,是因为Set集合不能存储重复的对象,而一个用户很有可能会购买多个同一商品,所以这里使用List集合类,并进行List集合映射定义。读者需要注意的一点,当使用List集合映射时,就不可以再定义cascade="save-update"属性。如配置文件所示。

(4)在中设置了lazy=”true”,表示使用延迟,这是Hibernate中非常重要的概念,主要使用在多对多以及一对多关系中。具体在实例程序中讲解。

(5)此处定义了用户和商品之间单向的多对多关系。

定义了数据库表user_product中的外部关键字user_id与users表进行关联。

 由于这里使用的List集合映射,所以还要指定来表示实例在List中的位置,在创建user_product表时,需要创建一个position字段。

中的class属性指定SqlProduct实体类,并且定义column="product_id",即使用product_id外键来与product数据库表相关联。

26.2.2.2 修改Struts配置文件

首先在体中添加一个ActionForm类,代码如下:

然后在体中添加如下代码:

name="listProduct"

path="/"/>

name="myShopCar"

path="/"/>

name="index"

path="/"/>

第18章 常用插件扩展点

·443·在体中添加的代码如下:

path="/listProduct"

type="dAction"

parameter="/"

scope="request">

path="/myShopCar"

type="dAction"

parameter="/"

scope="request">

path="/shopCarAction"

type="rAction"

parameter="method"

name="shopCarForm"

validate="true"

scope="request"

input="/">

path="/index"

type="dAction"

parameter="/"

scope="request">

代码说明:

此处创建的ShopCarAction类是一个DispatchAction类,parameter="method"的设置表示接收来自页面的method属性,通过这个属性值来指定这个DispatchAction类调用其中某个方法(例如添加、删除或者修改等)。

26.2.3 创建数据库表

除了使用到以上章节创建的users表之后,根据以上创建的实体类,以及实体类之间的关系,创建如下三个数据库表。

26.2.3.1 创建p_kind表

在以上章节创建的数据库mydb1中新建一个p_kind表,用户存放商品类别的信息,SQL语句如下:

DROP TABLE IF EXISTS `mydb1`.`p_kind`;

CREATE TABLE `mydb1`.`p_kind` (

`id` int(10) unsigned NOT NULL auto_increment,

`name` varchar(45) NOT NULL default '',

`discription` varchar(1024) NOT NULL default '',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

·444·

Eclipse从入门到精通

主关键字为id,name为类别名称,discription字段为信息描述。

26.2.3.2.创建product表

用于存储商品信息的product表,相应的SQL语句如下:

DROP TABLE IF EXISTS `mydb1`.`product`;

CREATE TABLE `mydb1`.`product` (

`id` int(10) unsigned NOT NULL auto_increment,

`name` varchar(45) NOT NULL default '',

`price` float NOT NULL default '0',

`stocks` int(10) unsigned NOT NULL default '0',

`discription` varchar(1024) NOT NULL default '',

`kind_id` int(10) unsigned NOT NULL default '0',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

主键为“id”,通过外部关键字“kind_id”与数据库表p_kind相关联。

26.2.3.3.创建user_product表

此表为userinfo和product表之间的关联表,具体创建的SQL语句如下:

DROP TABLE IF EXISTS `mydb1`.`user_product`;

CREATE TABLE `mydb1`.`user_product` (

`user_id` int(10) unsigned NOT NULL default '0',

`product_id` int(10) unsigned NOT NULL default '0',

`id` int(10) unsigned NOT NULL auto_increment,

`position` int(10) unsigned NOT NULL default '0',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk;

读者也可以使用工具,根据XML映射文件自动生成如上的数据库表。这样可以简化创建表格的工作,此处选择手动创建,只是为了让读者加深了解Hibernate是如何把实体类映射到数据库表。

26.2.4 创建相应的操作类

有读者可能认为以下的有些操作类是不需要创建的,完全可以把这部分工作移交到Action类中实现,这确实是可以的。但是笔者认为在开发应用系统时,尽量在设计上把功能细分,并且更多地使用继承开发模式,这样有利用后期代码的扩展和维护,而且不至于使Action类代码过于冗长。

26.2.4.1.创建操作商品的类和

这里继续使用继承的思想,首先在包下创建抽象类:

package ;

import ;

import ateException;

import ;

import n;

import ction;

import ateUtil;

import uct;

public abstract class AbstractProduct {

/*****取出单个产品信息(包括产品类型)******/

第18章 常用插件扩展点

public List listProduct(int id) throws HibernateException

{

Product product = new DBProduct();

Session session = tSession(); //获取到Session

Transaction tx = ransaction(); //创建一个事务

·445· Query query = Query("select p, from DBProduct as p where =:id");

eger("id",id); //给HQL语句的id字段赋值,实现条件查询

List list = ();

(); //事务批量执行

ession(); //关闭session

return list;

}

/*****取出所有产品信息(包括产品类型)*****/

public List listProducts() throws HibernateException

{

Session session = tSession();

Transaction tx = ransaction();

Query query = Query("select p, from SqlProduct as p");

List list = ();

();

ession();

return list;

}

}

程序说明:

 listProduct(int id)方法根据给定的商品id取出相对应的实例对象,此处使用到的HibernateUtil类已经在上一章创建了,此类专门对session进行管理,包括创建和关闭。

 调用eger("id",id)给HQL语句中的id字段进行赋值,需要赋值的字段前加上冒号,以跟别的字段相区别。

 listProducts()方法把所有关于DBProduct实体类的实例对象取出来。

然后再在包下创建相应的继承类SqlProductFactory,但是暂时不定义任何方法,只是用于后期扩展。

26.2.4.2.修改关于User的操作类和

这两个类已经在第七章节中创建了,修改这两个类,在抽象类中实现ListUsers()和ListUser()两个方法,另外定义四个方法,以实现Hibernate的数据库操作,修改代码如下:

/******取出所有用户信息*****/

public Iterator ListUsers() throws HibernateException{

Session session = tSession();

Transaction tx = ransaction();

Query query = Query("from DBUser");

List list = ();

();

ession();

return or();

}

/*****根据用户名取出对应的一名用户信息*****/

public User ListUser(String userid){

·446·

Eclipse从入门到精通

User user = null;

Session session = tSession();

Transaction tx = ransaction();

Query query = Query("from DBUser as u where _id=:userid");

ameter("userid",userid);

List list = ();

if(!y()) //判断list集合类是否为空

user = (User)(0); //取出对象信息,因为存在List中的是Object对象,所要这里下塑造型

();

ession();

return user;

}

/*****根据传递过来的session以及用户名取出对应的一名用户信息*****/

public User ListUser(Session session,String userid){

User user = null;

Transaction tx = ransaction();

Query query = Query("from DBUser as u where _id=:userid");

ameter("userid",userid);

List list = ();

if(!y())

user = (User)(0);

();

return user;

}

…….

public abstract List listMyProducts(int id); //取出该用户购物车中的所有商品

public abstract int countProduct(int user_id,int p_id); //计算该商品购买的数量

public abstract void buyProduct(User user,Product product); //把商品加入到购物车中

public abstract void delProduct(User user,Product product); //把商品从购物车中删除

程序说明:

(1)此抽象类实现的两个方法和ProductFactory类中实现的两个方法相类似,程序设计的思想就是父类中首先实现公用方法,然后在继承类中实现专有的方法。

(2)请注意ListUser(Session session,String userid)方法和ListUser(String userid)方法的区别,仅仅是前一个方法通过传递一个Session,而不是在内部生成Session。因为在SqlUser实体类中包含了商品实例的集合类,这里使用了延迟(在文件中配置了lazy=”true”),在获取延迟字段的数据之前是不能关闭Session的,所以这里通过传递一个Session参数获取到一个用户实例,然后在关闭Session之前取出这个实例中的各个字段(包括集合类中的产品类)。

在继承类SqlUser中实现AbstractUser抽象类定义的四个方法,代码如下:

……

public List listMyProducts(int id) throws HibernateException

{ //取出该用户购物车中的所有商品

Session session = tSession();

Transaction tx = ransaction();

//使用特殊的elements()函数返回所有的product实例

Query query = Query("select u,p from DBUser as u,DBProduct as p

where p in elements(ts) and =:id");

eger("id",id);

List list = ();

第18章 常用插件扩展点

();

ession();

return list;

}

public int countProduct(int user_id,int p_id) throws HibernateException

{ //计算该商品购买的数量

User user = new DBUser();

Product product = new DBProduct();

Session session = tSession();

Transaction tx = ransaction();

Query query = Query("from DBUser as u where =:id");

eger("id",user_id);

int count = 0;

List list = ();

Iterator iterator = null;

if(!y()) //判断list集合类是否为空

{

user = (User)(0);

list = ducts(); //取出用户购买的所有商品实例

·447· iterator = or();

while(t())

{

product = (Product)();

if(() == p_id) //判断商品是否为指定的商品,如果是,即统计此商品的个数

count++;

}

}

();

ession();

return count;

}

public void buyProduct(User user,Product product) throws HibernateException

{ //把商品加入到购物车中

Session session = tSession();

Transaction tx = ransaction();

user = (User)(,new Integer(()));

ducts().add(product); //把此商品添加到用户实体类的Products集合中

(user); //调用session的update方法,来更新此用户信息

();

ession();

}

public void delProduct(User user,Product product) throws HibernateException

{ //把商品从购物车中删除

Session session = tSession();

Transaction tx = ransaction();

Product product1 = new DBProduct();

user = (User)(,new Integer(()));

List list = ducts();

Iterator iterator = or();

·448·

Eclipse从入门到精通

while(t())

{

product1 = (Product)();

if(() == ())//找出需要删除的商品

ducts().remove(product1); //把此一个商品从Product的集合类中除去

}

(user); //重新更新user

();

ession();

}

程序说明:

(1)countProduct()方法为获取到用户购买某一个商品的数量,因为在用户实体类中定义是List集合类型,允许存储重复对象,此方法就是统计某重复实例的个数。

(2)在buyProduct(User user,Product product)和delProduct(User user,Product product)两个方法当中,注意到这样一段代码:user = (User)(,new Integer(()))。如果没有这个代码,就会报出类似“此实体类的Session已经关闭或者不存在”错误。这是因为传递过来的User不是在这个Session中创建或者生成的,所以就不能取出用户实体类中的List集合中的商品实例(不存在,只能在Session中存在)。所以这里调用load()方法函数来重新装载实例。

26.2.5 创建Struts的Action和ActionForm类

在功能介绍中,读者已经了解,需要实现商品的购买和删除等操作,当然开发者可以针对每个操作创建一个Action和ActionForm类,但是那样的话,需要创建的Action和ActionForm太多,不易维护。

这里通过DispatchAction来创建一个Action类,可以将上面的所有方法集合在一起,节省开发Action类的时间,而且易于Action类文件的维护。

26.2.5.1.创建ShopCarForm类

此类部分代码如下:

……

public class ShopCarForm extends ValidatorActionForm{

/*********/

private static final long serialVersionUID = 1L;

private int p_Id = 0;

private String p_Name = null;

private float p_Price = 0;

private int p_Stocks = 0;

private String p_Discription = null;

private int p_Kind = 0;

……//各属性对应的set和get方法。

public ActionErrors validate(ActionMapping mapping,HttpServletRequest request){

return null;

}

}

代码说明:

 此处的数据验证方法validate暂时空实现。在配置文件需要指定validate=”true”。

第18章 常用插件扩展点

·449· 此类用于数据的封装,并交付给Action类进行处理。

 由于Action类继承了DispatchAction类,所以这里的ActionForm需要继承ValidatorActionForm类。

26.2.5.2.创建ShopCarAction类

此类实现了buyProduct()和delProduct()两个方法,部分代码如下:

public class ShopCarAction extends DispatchAction{

/*****加入购物车*****/

public ActionForward buyProduct(ActionMapping mapping,

ActionForm form,

HttpServletRequest request,

HttpServletResponse response) throws Exception

{

ShopCarForm actionForm = (ShopCarForm)form;

int p_Id = _Id(); //取出页面传递过来的商品id

HttpSession session = sion();

User user = (User)ribute(T_USER); //取出当前登录的用户

AbstractProduct aProduct = new SqlProduct();

List list = oduct(p_Id); //根据给定的商品id,获取出该商品对象

if(!y()) //判断List集合类是否为空

{

Object[] rows = (Object[])((0));

Product product = (Product)rows[0];

new SqlUser ().buyProduct(user,product); // 调用buyProduct()把商品加入购物车

}

return utForward(); //返回配置文件中input属性指定的页面

}

/*****从购物车中删除*****/

public ActionForward delProduct(ActionMapping mapping,

ActionForm form,

HttpServletRequest request,

HttpServletResponse response) throws Exception

{

ShopCarForm actionForm = (ShopCarForm)form;

int p_Id = _Id();

n(p_Id);

HttpSession session = sion();

User user = (User)ribute(T_USER);

AbstractProduct aProduct = new SqlProduct();

List list = oduct(p_Id);

if(!y())

{

Object[] rows = (Object[])((0));

Product product = (Product)rows[0];

new SqlUser().delProduct(user,product); //调用delProduct()把商品删除

}

return rward(_MYSHOPCAR);

}

·450·

}

Eclipse从入门到精通

程序说明:

(1)Struts是如何知道调用其中的方法来进行相应的操作了,在页面中传递过来了一个method变量(已经在配置文件中定义,parameter=”method”)。通过判断method属性值为“buyProduct”还是“delProduct”来进行相应的方法调用。

(2)_MYSHOPCAR,是调用了Constants类中的常量RETURN_MYSHOPCAR,这里常变量的值为“return_myShopCar”。需要在之前定义。

26.2.6 创建页面JSP文件

最后需要创建页面显示JSP文件:展示所有商品信息;显示出登录用户的购物车中的商品信息。

26.2.6.1 创建文件

此文件的详细代码如下:

<%@ page contentType="text/html;charset=GBK" %>

<%@ taglib uri="/tags/struts-bean" prefix="bean" %>

<%@ taglib uri="/tags/struts-html" prefix="html" %>

<%@ taglib uri="/tags/struts-logic" prefix="logic" %>

<%@ page import=".*" %>

<%@ page import=".*"%>

<%@ page import=".*"%>

我的购物车

欢迎 !

<%

int count=1;

Product product = new DBProduct();

User user = new DBUser();

第18章 常用插件扩展点

Set set = new HashSet();

AbstractProduct aProduct = new SqlProduct();

List list = oducts();

if(!y()) //判断List集合是否为空

{

count=1;

ListIterator iterator =erator();

while(t())

{

Object[] row = (Object[])();

product = (Product)row[0];

String kind_name = (String)row[1];

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

·451· n("

");

count++;

}

}

%>

产品展示

序号 产品名称 价格 库存量 产品描述 产品类别  
"+count+""+e()+""+ce()+""+cks()+""+cription()+""+kind_name+"

href='/login/?method=buyProduct&p_Id="+()+"'>加入购物车

返回首页 | 我的购物车

程序说明:

(1)注意一定要加上如下两段代码,不然会出现乱码:

<%@ page contentType="text/html;charset=GBK" %>

(2)还要注意charset属性全都是小写,千万不要写成大写,不然也会出现乱码,笔者就出现过类似的错误,结果就是花费了大量的时间找错误。

(3)一定要引入使用到的标签和类文件。

(4)在十四章的实例中,存在Session中的用户信息仅仅是用户名,而这里改成了用户对象User,所以这里的,必须指定property="userid",表示在页面上打印出用户名。

26.2.6.2 创建文件

显示出登录用户的购物车中所有商品信息的页面,代码如下:

<%@ page contentType="text/html;charset=GBK" %>

<%@ taglib uri="/tags/struts-bean" prefix="bean" %>

<%@ taglib uri="/tags/struts-html" prefix="html" %>

·452·

Eclipse从入门到精通

<%@ taglib uri="/tags/struts-logic" prefix="logic" %>

<%@ page import=".*" %>

<%@ page import=".*"%>

<%@ page import=".*"%>

所购物品

欢迎 !

<%

User session_user = (User)ribute("user");

if(session_user !=null)

{

int count=1;

Product product = new DBProduct();

User user = new DBUser();

AbstractUser aUser = new SqlUser ();

List list1 = Products(session_());

if(!y())

{

ListIterator iterator = erator();

while(t())

{

Object[] rows = (Object[])();

//user = (User)rows[0];

product = (Product)rows[1];

int num = roduct(session_(),());

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

n("

");

第18章 常用插件扩展点

·453· n("

");

count++;

}

}

}

%>

我的购物车

序号 产品名称 价格 产品描述 数量  
"+count+""+e()+""+ce()+""+cription()+""+num+"删除

返回首页 | 继续购物

代码说明:此页面功能和上一个页面功能类似,其中调用roduct(int userid,int p_id)方法来统计此商品的购买数量。

26.2.7 运行此Web应用

使用Lomboz启动tomcat服务器,在IE中输入地址localhost:8080/login显示实例效果。执行效果已经在第一小节中有所介绍。

26.3 Hibernate的自动生成工具

在编辑好*.映射文件之后,是可以使用ExportTask来自动生成数据库表的,这样可以大大简化创建表格的工作。具体实现方法如下:

(1)首先在之前创建的HibernateUtil类中添加如下两种方法:

/** 根据映射文件自动创建数据库表,同时把生成的sql语句输出到c:文件中 ***/

public static void createDbTable() throws HibernateException{

Configuration conf = new Configuration().configure(new File(""));

SchemaExport dbExport = new SchemaExport(conf);

putFile("d:");

(true,true);

}

/**

* 根据映射文件中新增的字段更新数据库表中的字段

* (1)表的原始数据不会被删除

* (2)根据XML映射文件中的字段来更新,如果表中出现同名字段,怎不改变

* (3)表中有字段在xml文件中没有定义,则也不删除

*/

public static void updateDbTable() throws HibernateException{

Configuration conf = new Configuration().configure(new File(""));

new SchemaUpdate(conf).execute(true,true);

}

程序说明:其中也可以不指定,即直接Configuration conf = new

Configuration().configure()),这时会自动查找WEB-INF/classes目录下的配置文件。前一种方法根据映射文件创建数据库表,后面方法根据映射文件中新增的字段来更新数据库中已经创建的表。

(2)创建一个调用类(包含public static void main(String[] args)主方法)来调用以

·454·

Eclipse从入门到精通

上创建的两个方法,从而自动创建出相应的数据库表,其中调用代码如下:

DbTable();

DbTable();

在Eclipse中运行这个主类,即可以在配置文件指定的数据库中创建出实体类相对应的数据库表。

注意:使用这个方法自动创建数据库表时,需要映射文件中的属性设置尽量详细,例如字段的类型、长度等等,不然的话,自动创建的数据库表选择默认值。

除了这种使用Java程序的方法之外还可以使用Ant来自动创建数据库表,其具体使用方法请参考相应资料。

26.4 本章小结

前两章具体讲解了struts和Hibernate技术,本章结合这两个技术重新实现了用户登录应用,并添加了购物车功能,展示了struts和Hibernate的完美结合:Strut所提供了框架支持(视图-控制-模型),使得整个Web系统结构清晰、便于管理和维护;Hibernate实现了数据层的持久化,使得数据层真正得到了面向对象。

之上所有章节已经比较全面地向读者介绍了JSP各方面的知识,由首先的纯JSP编写Web应用,到后来的JavaBean使用,以及JSP标签化的出现使得页面趋向统一。再到MVC框架的提出,而struts又是MVC框架实现的最好选择。Hibernate的使用使得尴尬的非面向对象数据层成为过去,开发者可以摆脱数据层的表示而专注业务逻辑的实现。


本文标签: 创建 商品 实体类