科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道比较Java EE 5平台和J2EE 1.4平台

比较Java EE 5平台和J2EE 1.4平台

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

比较Java EE 5平台和J2EE 1.4平台

作者:cyber3 来源:赛迪网技术社区 2007年10月31日

关键字: 平台 J2EE1.4 JAVA EE 5

  • 评论
  • 分享微博
  • 分享邮件
在本文档中,将创建一个用于访问数据库的 Web 应用程序。在该 Web 应用程序中,将使用 IDE 从数据库生成实体类,然后创建一个 Servlet 来显示信息。 +{]\J/O +  
!.gcJ v,+  
预计持续时间:15 分钟 }Hy![nq  
Bbt A/Gq>  
先决条件 %@nN$zE~  
本文档假定您已具备了以下技术的一些基本知识或编程经验: Q7jjg s#0  
_L{#~B  
Java 编程 ,3~`Qc^Ep  
NetBeans IDE D#>N:=  
本教程所需的软件 /Jf1{:<,  
在学习本教程之前,您需要在计算机中安装以下软件: ^59dtd$  
8JSftn u  
NetBeans IDE 5.5(下载) ?k'zKV[c  
Java Standard Development Kit (JDK) 版本 5.0 或版本 6.0(下载) #}hzU q  
Sun Java System Application Server Platform Edition 9(下载) +][0OSknL8  
教程练习 ;20Q;  
为 IDE 配置应用服务器 HH p `;  
建立 Web 应用程序项目 X_Bs<(1\  
对 Web 应用程序进行编码 bEdU_(D*~  
运行项目 #~E439hF  
>9/fG6<V`  
为 IDE 配置应用服务器 0O~*l"  
在学习本教程之前,必须在 IDE 中注册 Sun Java System Application Server Platform Edition 9 的实例。在本练习中,我们将在 IDE 中注册 Sun Java System Application Server。 j'+P_\ce  
B}-,A{Z<  
从主菜单中,选择“工具”>“服务器管理器”。 /Nj1\m }  
单击“添加服务器”。选择 "Sun Java System Application Server",并为此实例指定一个名称,然后,单击“下一步”。 )vzBm>^sp  
指定应用服务器的安装目录(例如,C:\Sun\Appserver)。 s5%27)pMI  
将“注册本地缺省域”单选按钮保留为选中状态,然后选择一个域。 +j>{~/d(  
(可选)单击“下一步”,输入管理员用户名和口令。如果不希望在 IDE 用户目录中存储用户名和口令,可以将这些字段保留为空。IDE 将在每次需要此信息时提示您输入。 ,T@j*d<  
注意:缺省管理员口令是 adminadmin。 >/j)ko Z%  
单击“完成”。IDE 将注册该服务器,并在“运行环境”窗口的“服务器”节点下面列出该服务器。 i<dos#'Io  
小结 RVM-}`v  
在本练习中,我们已在 IDE 中注册了 Sun Java System Application Server。 X kCG{E,  
gGWEO  
建立 Web 应用程序项目 ZG$cAjd2y  
在 NetBeans IDE 5.0 快速入门中,我们创建了一个具有 EJB 模块和 Web 模块的完整企业应用程序。之所以这样做是因为:在 J2EE 1.4 平台中进行开发时,必须将实体 Bean 和会话 Bean 放置在 EJB 模块中。要从 Web 模块访问实体 Bean,我们必须添加查询代码。 w9=|[u1  
vVpAWI>nd  
而在 Java EE 5 平台上开发的示例中,不需要开发完整的企业应用程序,因为我们不需要 EJB 模块或会话 Bean。只需创建一个简单的 Web 应用程序,然后将实体类直接放置在该 Web 应用程序中即可。 ^n,au'=0.  
!txd _Q  
选择“文件”>“新建项目”(Ctrl-Shift-N)。从 "Web" 类别中,选择“Web 应用程序”。 4#shS  
将项目命名为 CustomerBook,将服务器设置为 Sun Java System Application Server,将 Java EE 版本设置为 Java EE 5,然后单击“完成”。 @/7Hp 1 1  
小结 4<~F=L)  
在本练习中,我们创建了一个包含实体类的 Java EE 5 Web 应用程序。 < 3A$hS;  
aJS/+(#`  
对 Web 应用程序进行编码 $ h_Cr+.?  
与在 J2EE 1.4 平台中创建 Web 应用程序相比,在 Java EE 5 平台中进行 Web 应用程序编码要更快、更容易。但是我们仍然需要进行一些基本的设置,如建立数据库连接,但是在创建连接池和数据源后,开发工作会变得更容易,这是因为在 Java EE 5 平台中进行开发时,容器可以完成更多的工作。 VCu6p]  
p~k,@&"<Ao  
由于容器具有持久性管理功能,因此,我们不需要编辑用来配置 CMP 映射或指定 finder 方法的部署描述符。实际上,我们在本示例中根本不需要任何部署描述符。在 Java EE 5 平台中,持久性不再局限于 EJB 组件。Java EE 5 引入了 Java 持久性 API,非 EJB 组件(如 Web 应用程序)也可以使用它。 z{A:?I  
 yr.a>3  
此外,使用 Java EE 5 技术时,您不再需要 J2EE 1.4 开发中所需的许多样板代码。由于简化了 EJB 开发,因此只需很少的接口,查询也变得更为简单了,并且通过标注方式,组件定义和资源注入变得简单而清晰。 TjTM~[eG  
!1&kfk"$  
管理持久性 m`;KjV<  
在 NetBeans IDE 5.0 快速入门中,我们创建了 CMP 实体 Bean 并在 ejb-jar.xml 中定义了部署描述符,用来管理持久性和对象关系映射。在 Java EE 5 平台中进行开发时,我们不再需要使用部署描述符为容器提供管理持久性的信息,只需创建持久性单元,指定要使用的数据源和实体管理器,然后让容器完成管理实体和持久性的工作即可。容器会在运行时发现实体 Bean。 x{S~:iSX  
+C9 Q':A  
持久性单元的创建可以通过在 persistence.xml 中定义来完成。如果项目或模块中不存在 persistence.xml,则需要创建该文件。可以通过“新建持久性单元”向导将持久性单元添加到项目中,该向导将有助于我们创建 persistence.xml 并定义持久性单元的属性。注意:也可以在“新建 - 实体类”向导中创建持久性单元。创建实体类时,如果不存在持久性单元,该向导将提示我们进行创建。 ,Lw0HB[  
>f2A]&E\  
选择“新建文件”(Ctrl-N) 打开“新建文件”向导。 <gC`?%  
从“持久性”类别中,选择“持久性单元”,然后单击“下一步”。 hc5!$v?g  
保留向导建议的持久性单元的缺省名称。 )H &N2J!wT  
使用“持久性提供程序”下拉列表中列出的 TopLink(缺省)。 *#:( krN  
缺省提供程序是 TopLink Essential.jar。TopLink Essential.jar 包含了 Java 持久性的库。并且实体管理器位于 TopLink Essential.jar 中。 9x_ t'  
wh?X~TkU  
使用“数据源”下拉列表中列出的缺省 jdbc/sample 数据源。 8m3"Sj=DX  
缺省数据源 jdbc/sample 用于连接到与 Sun Java System Application Server 捆绑在一起的 Java DB 数据库。 In*7Df,e  
wgtNb&.C5  
单击“完成”。 \ ,&\GbwU  
单击“完成”后,将为项目创建 persistence.xml,并在源代码编辑器中将其打开。通过单击源代码编辑器工具栏中的 "XML",可以查看 persistence.xml 的 XML 视图。此文件包含了 Java EE 5 容器管理应用程序的实体和持久性所需的所有信息。 ;ef0vkk=z  
LXx WY$\  
创建实体类 YdV e(x  
在 J2EE 1.4 平台中进行开发时,创建实体 Bean 后会将它们放置在 EJB 模块中,即使应用程序是简单的 Web 应用程序也是如此。每个实体 Bean 需要若干个接口,而且您必须在 ejb-jar.xml 中配置部署描述符以定义实体 Bean 以及每个实体 Bean 的接口、持久性和 finder 查询。 L7["h5^Z  
sm >W; $  
在 Java EE 5 中,我们可以使用简单的实体类,而且可以将实体类放置在 Java EE 5 应用程序中的任意位置,而不是创建实体 Bean 并将它们放置在 EJB 模块中。同时,为 Java EE 5 应用程序编写类要比在 J2EE 1.4 平台中编写类更容易,因为您可以使用标注来定义组件和注入资源。 ?q, T6S>C'  
8:-W~sWks  
现在我们将使用“新建 - 通过数据库生成实体类”向导来基于关系数据库创建实体类。 `@A9@NH  
gY|.,M40  
启动 Java DB 数据库,方法是:从主菜单中选择“工具”>“Java DB 数据库”>“启动 Java DB 服务器”。 Gh@;lj:  
选择“新建文件”(Ctrl-N) 打开“新建文件”向导。从“持久性”类别中,选择“通过数据库生成实体类”,然后单击“下一步”。 (vq%o?  
在“新建 - 通过数据库生成实体类”向导中,从“数据源”下拉列表中为数据库选择 jdbc/sample 数据源,并提供口令(如有必要),口令应为 "app"。选择数据源后,将在“可用表”窗格中显示可用表的列表。 +`!!wzf_=  
从“可用表”中选择 CUSTOMER 表,然后单击“添加”。 -l#Z'ikd  
单击“添加”后,还将添加与选定表关联的任何表。此外,在本示例中,我们还需添加 DISCOUNT_CODE 表。DISCOUNT_CODE 表以灰色显示,这是因为 CUSTOMER 表引用了该表,而且必须生成它的实体类,这样才能生成 Customer 实体类。通过在“选定的表”窗格中将鼠标悬停在表名上,可以查看灰色显示的表是如何与选定表关联的。 |/JDl!W  
?orSji  
单击“下一步”。 WBFjYY{  
向导将显示选定表及其任何关联表,以及将基于选定表创建的实体类。如果要修改将生成的类的名称,则可以在“类名”字段中键入名称。 9n_9w<]P  
Y&v=J,Jo,  
指定 ejb,将其作为生成类的包,然后单击“完成”。 jIak  
,)N- 5g  
Yey:=w  
单击“完成”后,IDE 将为 CUSTOMER 表和与 CUSTOMER 表关联的表生成实体类。如果在“项目”窗口中展开 ejb 源包,则可以看到 IDE 在 Web 应用程序项目的 ejb 包中创建了 Java 类 Customer.java 和 DiscountCode.java。 ,(_w,>O;2  
# _E?TP"  
您可以看到 IDE 只创建了两个类(为每个数据库表创建了一个类)。在“使用 NetBeans IDE 5.0 开发 J2EE 应用程序的快速入门指南”中使用“通过数据库生成 CMP 实体 Bean”时,IDE 会为每个表创建四个类。 *i <l  
T:Z`-0Vt  
如果您在源代码编辑器中查看 Customer.java,则会注意到已使用了 @Entity 标注将类声明为实体类。其他标注还提供了附加信息,如实体类及其属性映射的数据库表和列。 *l<#$gpNY  
2cE s:~yx  
您还会注意到,通常在实体 Bean 中找到的大部分样板代码都不见了。这是因为在 Java EE 5 中,实体类不再需要诸如 ejbRemove、setMessage、setSessionContext、ejbActivate 和 ejbPassivate 之类的方法。 y2[i^H?R  
) e')0Vyz  
对 Servlet 进行编码 KIKB~o(l/  
现在我们需要将 Servlet 添加到 Web 应用程序中。在 Java EE 5 中,我们不必将资源创建和查询代码添加到 Servlet 中,而是可以使用资源注入将这些工作交给容器来执行。可以使用标注将资源直接注入到 Servlet 中,并由容器来管理请求资源的创建和查询。在这种情况下,我们希望使用在持久性单元中指定的实体管理器。 mW.7[  F  
*e_^9oF  
在“项目”窗口中右键单击项目节点,然后选择“新建”> "Servlet"。 4D$QmF%H  
在“新建 Servlet”向导中,将 Servlet 命名为 CustomerDetails,并将 Servlet 放入名为 web 的包中。单击“完成”。单击“完成”后,将在源代码编辑器中打开 CustomerDetails.java。 e68% }v  
在源代码编辑器中打开的 CustomerDetails.java 上,单击鼠标右键,然后选择“持久性”>“使用实体管理器”,将 PersistenceContext 注入类中。IDE 将添加以下标注,该标注用于指定 Servlet 使用的持久性单元。请在类声明之上添加此标注。 7ed^+F,1m  
@PersistenceContext(name = "persistence/LogicalName", unitName = "CustomerBookPU") +zOnb}#-  
            Mm^jlM-I  
IDE 还将添加以下标注,用于注入管理事务边界的资源: iJ$}+  
z}-!a_)vnJ  
@Resource 2Wt<Y%k1  
private UserTransaction utx; U;)lN=B9  
IDE 将在 Servlet 中添加以下缺省代码: Fm8+9l}?  
z["e*N>  
public void persist(Object object) { []l4_m^  
    try { ,]l3m6u7  
      Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Ku -rMml  
      EntityManager em = (EntityManager) ctx.lookup("persistence/LogicalName"); `:fQUE<'  
      utx.begin(); ",p#i(z  
      // TODO: vM#V+;*  
      // em.persist(object);   utx.commit(); ]Z $=V_Fr  
    } catch(Exception e) { vWolv8#H  
      Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught", e); a n{"[  
      throw new RuntimeException(e); & es&1&V  
    } HzmFQFc/v$  
} Anve7%!6v  
此代码用于查询 @PersistenceContext 定义的持久性单元和实体管理器的实例。 Y,:AH^  
=l-O+yr  
在 CustomerDetails.java 中,将上面所显示的生成的查询代码修改为引用实体对象。完成后,经过修改的代码应如下所示(以粗体显示的代码表示已更改的行): F6LcXor0  
public Customer findByID(Integer customerNr) { cREb1'iL  
    Customer customer = null; $% rFmx/c)  
    try { E95yk5<  
        Context ctx = (Context) new InitialContext().lookup("java:comp/env"); }/uKO~  
        EntityManager em = (EntityManager) ctx.lookup("persistence/LogicalName"); #l?jmX!3`  
        utx.begin(); ~rIjf  
        customer = em.find(Customer.class, customerNr); _VJOr;)\C  
        utx.commit(); ]%z-'L"  
    } catch(Exception e) { xv^Y?fp,.  
        Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught", e); ]z<oxYvr  
        throw new RuntimeException(e); ,*uuaw   
    } g5Rg(@Ex  
    return customer; <aKRe+.w  
  } 'J83>6x7  
          O0gQi6  
取消注释 processRequest 方法中的代码并添加下面以粗体显示的代码: < 4=EzH  
  protected void processRequest(HttpServletRequest request, HttpServletResponse response) &^U*(2hL  
    throws ServletException, IOException { /9.:*5O  
    response.setContentType("text/html;charset=UTF-8"); !n 1Thjo  
    PrintWriter out = response.getWriter(); PF'%]6^a  
    out.println("<html>"); 9@&|ms  
    out.println("<head>"); _h1ah8/[  
    out.println("<title>Servlet CustomerDetails</title>"); FjM72qK4O  
    out.println("</head>"); ^}DR0AB%  
    out.println("<body>"); XFOi` WU  
    out.println("<h1>Search Customer Information</h1>"); =a Rx&  
    String customerNr = request.getParameter("customer_nr"); &8?%!=/ql  
    if((customerNr != null) && !(customerNr.equals(""))) { `3>wPa=  
v4f{q.2s  
        Customer customer = findByID(new Integer(customerNr)); 3<+L,!%8  
        if(customer != null){ gBJoi #*  
          out.println("Customer's info for nr. " + customerNr + ": " + customer.getName()); B<9Gx5SR  
        }else{ ;6BHTkfU  
          out.println("Customer not found."); $ZCNd X1  
        } 4%s^G(p  
    } ,)a]{7zQ7  
    out.println("<form>"); mT tXo[  
    out.println("Customer number: <input type='text' name='customer_nr' />"); >t.KoTB[Wm  
    out.println("<input type=submit value=Select />"); p_.1R^3Y  
    out.println("</form>"); Kqt)C!7- ?  
    out.println("</body>"); '@^'~b$c  
    out.println("</html>"); a2O}x&  
    out.close(); d0QKHo  
  } RX6_n  
            s[$s;u&EW  
按 Alt-Shift-F 组合键生成所有缺少的 import 语句。 ;f %  
.S3SRR1c-  
运行项目 V@QdF>C  
在“项目”窗口中,右键单击 "CustomerBook" 项目节点,然后选择“属性”。在“项目属性”对话框的“运行”窗格中,在“相对 URL”字段中键入 /CustomerDetails,然后单击“确定”。 R6@-I   
右键单击项目节点,然后选择“运行项目”。IDE 将启动应用服务器、生成项目,并在浏览器中打开 CustomerDetails 页。 c"p99NBbQ  
在“客户号码”字段中输入 ID 号(例如 "1"),然后单击“提交”。Servlet 将显示具有该 ID 号的客户名称。 $fx^b)Cf  
G\sif#b  
Ua@'<6L2W]  
小结 [U=4 Q  
在本练习中,您使用了 Java EE 5 技术来生成 CustomerBook 应用程序,然后部署了该项目并对 Web 应用程序进行了测试。
查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章