用Java EE 5实现的网上书店实例
用Java EE 5实现的网上书店实例<!-- BEGIN WRAPPER TABLE, 2 COLUMN, MAIN/RIGHT --><!-- BEGIN CENTRAL COLUMN COMPONENTS --><!--startindex--><!-- ============ --><!-- MAIN CONTENT --><!-- ============ --><!-- BEGIN VCD4 BYLINE AND TOOLS -->
| 李力 ([email protected]) | 2007/10/23 |
本教程介绍了如何使用NetBeans IDE 以及GlassFish 构建一个典型的Java EE 5应用实例. 该实例模拟网上书店, 主要实现的是对订单的管理。用户可以购买图书, 并修改订单. 该实例覆盖了Java DB, JPA(Java Persistence API), EJB 3.0, JSF等技术应用. |
目录
第一部分:环境准备
第二部分:数据准备
第三部分:实现JPA层与EJB层
第四部分:实现Web层
网上商店说明
网上商店实现了商品浏览,用户可以进行订单查询,生成订单以及删除订单等操作。
教程使用环境
-
Java SE 5(或更高版本)
-
NetBeans IDE 5.5.1 中文版
-
NetBeans IDE 5.5.1 Visual Web Pack 中文版
-
Sun Java Application Server PE 9.0 Update Release 1(或更高版本)
配置Sun Java System Application Server
如果安装的 NetBeans IDE 与 Sun Java System Application Server 捆绑在一起,则表明已在 IDE 中注册了应用服务器,不需要对其进行配置。如果单独下载并安装了 Sun Java System Application Server,则必须为 IDE 配置可用的应用服务器。
配置单独安装的服务器:
-
安装 NetBeans IDE 和 Sun Java System Application Server 后,启动 IDE。
-
在“运行环境”窗口中,右键单击“服务器”节点,然后从弹出式菜单中选择“添加服务器”。
-
在“添加服务器实例”向导中,从“服务器”下拉列表中选择 "Sun Java System Application Server",然后单击“下一步”。
-
输入应用服务器的安装位置,然后单击“下一步”。
-
缺省应用服务器域 domain1 的缺省用户名和口令如下:
-
用户名:admin
-
口令:adminadmin
请注意,如果在此处指定一个口令,则系统会将其存储在用户目录中,这可能会产生安全隐患。如果未在此处指定口令,则会在需要时提示您输入口令值。
-
-
单击“完成”。
<!-- END CODE EXAMPLES BOX -->创建数据库
在这节中使用Sun Java System Application Server 捆绑的Derby数据库, 完成创建数据库,创建表,建立数据库连接池,建立数据库资源等。
创建Derby数据库
-
启动 NetBeans IDE后,如果尚未启动数据库服务器,请选择“工具”>“Java DB 数据库”>“启动 Java DB 服务器”。
-
选择“工具”>“Java DB 数据库”>“创建 Java DB 服务器”。
-
在“创建 Java DB 服务器”输入如下信息:
-
数据库名称:bookshop
-
用户名:book
-
口令: book
图一: 创建bookshop数据库
-
NetBeans IDE会自动在”运行环境”>”数据库”接点下建立bookshop的数据库连接。
图: bookshop数据库连接
-
如果 bookshop 数据库的 jdbc 节点标记显示为连接中断 ,并且无法展开该节点,则表明 IDE 未连接到该数据库。要连接 bookshop 数据库,请右键单击 bookshop 数据库的 jdbc 节点,。如果出现“连接”对话框,请输入
book
作为口令,选中“在此会话期间记住口令”,然后单击“确定”。 -
如果未出现bookshop的数据库连接, 在“运行环境”窗口中,右键单击“数据库”,然后从弹出式菜单中选择“新建连接”以打开“新建数据库连接”对话框。
-
从“名称”下拉列表中选择 "Java DB (Network)"。
-
在“数据库 URL”文本框中,键入 jdbc:derby://localhost:1527/bookshop。
-
将“用户名”设置为 book,将“口令”设置为 book,然后单击“确定”。
-
在建立连接后,请单击“确定”以关闭对话框。
图2: 新建bookshop数据库连接
<!-- END RESOURCE MATRIX --><!-- BEGIN EXAMPLES BOX --><!--<table border="0" cellpadding="2" cellspacing="0"> <tr> <td> <div class="headerpadding2"><b>Example used in this tutorial</b></div> </td> </tr> <tr valign="top"> <td> <div class="headerpadding2"> »<a href="inserts_updates_deletes/insert_update_delete_ex.zip">insert_update_delete_ex.zip (zip)</a> </div> </td> </tr></table>--><!-- END CODE EXAMPLES BOX -->创建表
到这一步, bookshop数据库是全新的,因此它是空的。现在,开始添加表和数据。NetBeans IDE可以使用表向导来逐个创建表, 这个教程里使用SQL脚本.
使用SQL脚本创建表
-
右键单击bookshop
数据库下的表节点,
然后从弹出式菜单中选择”执行命令”
。 -
在新打开的”SQL
点击”运行SQL”按钮, 运行成功的话,可以在bookshop 数据库连接的"表"节点,看到新生成三个表。命令1”
窗口中,
输入以下SQL。
createtable"BOOK"."CUSTOMER"
(
"CUSTOMER_ID"CHAR(12)notnullprimarykey,
"CUSTOMER_NAME"VARCHAR(30),
"EMAIL"VARCHAR(40)
);
insertintocustomervalues('ada','AdaLi','[email protected]');
insertintocustomervalues('joey','JoeyShen','[email protected]');
insertintocustomervalues('michael','MichaelLi','[email protected]');
createtable"BOOK"."PRODUCT"
(
"PRODUCT_ID"INTEGERnotnullprimarykey,
"PRODUCT_NAME"VARCHAR(100),
"PURCHASE_COST"DECIMAL(12,2)
);
insertintoproductvalues(1,'Java(TM)EE5Tutorial',34.64);
insertintoproductvalues(2,'JavaEE5DevelopmentusingGlassfishApplicationServer',32.50);
insertintoproductvalues(3,'EnterpriseJavaBeans3.0',31.49);
insertintoproductvalues(4,'SunCertifiedEnterpriseArchitectforJavaEEstudyGuide',32.99);
insertintoproductvalues(5,'JavaMEGameProgramming',49.99);
createtable"BOOK"."PURCHASE_ORDER"
(
"ORDER_NUM"INTEGERnotnullprimarykey,
"CUSTOMER_ID"CHAR(12)notnull,
"PRODUCT_ID"INTEGERnotnull,
"QUANTITY"SMALLINT
);
insertintoPURCHASE_ORDERvalues(1,'ada',1,1);
insertintoPURCHASE_ORDERvalues(2,'ada',5,1);
insertintoPURCHASE_ORDERvalues(3,'joey',2,2);
-
CUSTOMER
-
PRODUCT
-
PURCHASE_ORDER
-
右键单击表或列,然后从弹出式菜单中选择“查看数据”,可以查看表和列中的数据。
配置JDBC 连接池和JDBC资源
数据库连接池是服务器为特定的数据库提供的一组可重用的连接。请求数据库连接的应用程序将从该池中获取连接。当应用程序关闭某个连接后,该连接将会返回到连接池中。连接池属性可能随数据库供应商的不同而有所不同。一些公共属性包括数据库名称的 URL、用户名和口令等。
建立数据库连接池时,还将创建 JDBC 资源(也称为数据源)。JDBC 资源为应用程序提供了数据库连接。通常,应用程序所访问的每个数据库都至少有一个 JDBC 资源。一个数据库可以有多个 JDBC 资源。
下面介绍如何在Sun Java System Application上配置 JDBC 连接池和JDBC 资源
1.启动Sun Java System Application, 在NetBeans IDE的”运行环境”窗口中的”服务器”节点下, 右键单击”Sun Java System Application”, 选择”启动”
2.在浏览器地址窗口中,输入”http://localhost:4848”, 出现管理控制台登录界面. 缺省的管理员/密码: admin/adminadmin
配置 JDBC 连接池
接下来,将为bookshop数据库创建一个 JDBC 连接池,并定义数据库连接的特性。
-
在管理控制台的左窗格中,展开“资源”> "JDBC",然后选择“连接池”。
-
在“连接池”页中,单击“新建”以创建新的连接池。
-
在“创建连接池”向导的第一步, 输入和选择如下内容。
名称:bookshopPool
资源类型:javax.sql.XADataSource
数据库供应商:JavaDB
点击"下一步按钮"。 -
在“创建连接池”向导的第二步,找到属性部分,修改以下属性值。
DatabaseName: bookshop
User: book
Password: book
ServerName:localhost
PortNumber:1527
-
属性设置完成后,点击同一页面"ping"按钮,测试设置是否正确。如果正确,会显示"Ping 成功 "的信息. -
点击"完成"按钮,在Sun Java Application Server 中创建bookshopPool连接池.
配置 JDBC 资源
必须为bookshop创建一个 JDBC 资源,以便让部署后的应用程序能够通过它连接到bookshop数据库。
-
在管理控制台的左窗格中,展开“资源”> "JDBC",然后选择“JDBC 资源”。“资源”> "JDBC" >“JDBC 资源”页将在右窗格中打开。
-
单击“新建”。用于创建新 JDBC 资源的页将出现在右窗格中, 输入或选择如下内容。
JNDI名称:jdbc/bookshopDS
池名称:bookshopPool
-
点击"确定"按钮,在Sun Java Application Server 中创建JDBC 资源 jdbc/bookshopDS.
NetBeans IDE中可以直接创建JDBC 连接池和JDBC 资源
如果要将应用程序部署到 Sun Java System Application Server,则在 IDE 中使用“新建文件”向导可以轻松地建立数据库连接池和所需的数据源。通过在 IDE 中打开“新建文件”向导,选择“Sun 资源”类别,然后选择要创建的资源类型,可以为应用程序创建 JDBC 资源和连接池。使用“新建文件”向导可以执行以下操作:
当使用“新建文件”向导建立连接池时,IDE 将基于指定的连接生成所需的文件。在将应用程序部署到服务器时,会在 Sun Java System Application Server 中注册资源。
如果要将应用程序部署到 Sun Java System Application Server 以外的服务器,则需要通过编辑资源的源文件来建立资源。
创建企业项目
-
NetBeans IDE中,选择“文件”>“新建项目”(Ctrl-Shift-N)。从 "企业" 类别中选择“企业应用程序”,然后单击“下一步”。
-
将项目命名为 BookshopApp,将服务器设置为 "Sun Java System Application Server",将 Java EE 版本设置为 "Java EE 5",然后单击“完成”。
-
在NetBeans IDE的"项目"窗口中,会出现三个项目
BookshopAppBookshopApp-ejb
BookshopApp-war
持久层
Java EE 5 平台引入了新的 Java 持久性 API(它是作为 JSR-220 的一部分开发的)。Java 持久性 API 不但可以在 EJB 组件外部使用(例如,在 Web 应用程序和应用程序客户端中使用),而且还可以在 Java EE 平台之外的 Java SE 应用程序中使用。
Java 持久性 API 具有以下主要功能:
-
实体是 POJO。与使用容器管理持久性 (Container-Managed Persistence, CMP) 的 EJB 组件不同,使用新 API 的实体对象不再是组件,并且它们不再需要位于 EJB 模块中。
-
标准化的对象关系映射。新规范将对对象关系映射的处理方式进行标准化,从而使开发者不再需要了解特定于供应商的策略。Java 持久性 API 使用标注来指定对象关系映射信息,但它仍支持 XML 描述符。
-
命名查询。现在命名查询是用元数据表示的静态查询。查询可以是 Java 持久性 API 查询或本地查询。这样会使重用查询变得非常简单。
-
简单的打包规则。由于实体 Bean 是简单的 Java 技术类,因此几乎可以在 Java EE 应用程序中的任意位置将其打包。例如,实体 Bean 可以是 EJB
JAR
、应用程序客户端JAR
、WEB-INF/lib
、WEB-INF/classes
的一部分,甚至是企业应用程序归档 (Enterprise Application Archive, EAR) 文件中实用程序JAR
的一部分。通过这些简单的打包规则,您不再需要创建 EAR 文件以使用来自 Web 应用程序或应用程序客户端的实体 Bean。 -
分离的实体。由于实体 Bean 是 POJO,因此可以对它们执行序列化,通过网络将其发送到其他地址空间,并在不识别持久性的环境中使用它们。这样,您就不再需要使用数据传输对象 (Data Transfer Object, DTO)。
-
EntityManager API。现在,应用程序编程人员可以使用标准 EntityManager API 来执行涉及实体的
创建、读取、更新和删除
(Create Read Update Delete, CRUD) 操作。
IDE 提供了处理新 Java 持久性 API 的工具。您可以通过数据库自动生成实体类,或手动对实体类进行编码。IDE 还提供了用于创建和维护持久性单元的模板和图形编辑器。
创建持久性单元
持久性单元目的在于通知容器哪些实体类需要由实体管理器进行管理,以及这些实体需要使用哪些数据源信息。
-
在“项目”窗口中右键单击 "BookshopApp-ejb" 项目节点,然后选择“新建”>“文件/文件夹”以打开“新建文件”向导。
-
从“持久性”类别中,选择“持久性单元”,然后单击“下一步”, 配置信息如
持久性单元名称:BookshopApp-ejbPU
持久性提供程序: TopLink(缺省)
数据源: jdbc/bookshopDS
使用 使用 Java 事务 API : 是
表生成策略: 无
-
单击“完成”, 最后生成BookshopApp-ejb项目下生成persistence.xml, 这个文件中定义了持久性单元的属性。
创建实体类
实体类用于表示要创建的关系数据库中的表。下面为bookshop数据库中的三张表创建实体类,实体类包括命名的查询标注、表示列的字段以及表示外键的关系。
-
右键单击 "BookshopApp-ejb" 项目节点,然后选择“新建”>“文件/文件夹”。
-
从“持久性”类别中,选择“通过数据库生成实体类”,然后单击“下一步”。
-
下一个窗口中, “数据源”选择”jdbc/bookshopDS”, 点击”全部添加”按钮, 将”可用表”中的三张表(CUSTOMER, PRODUCT, PURCHASE_ORDER)添加到”选定表”中, 点击”下一步”按钮。
-
下一个窗口中,输入包名“bookshop.entities”,点击完成。
生成的Product实体类的部分代码如下: