|
|
构建 J2EE 类图
启动 Rational Rose 然后从介绍性消息窗口选择 J2EE project。这不是必须的。在 Rational Rose 中直接查看 J2EE 平台的结构化包是非常有趣的。 打开屏幕左边部分的 Logical View。 在 Logical View 文件夹上单击鼠标右键,然后选择 New => Class diagram。将其命名为 HelloDiagram 或任何其它适当的名称。 一个代表新的类图的图标将会出现在屏幕左边的 Logical View 下。 双击 HelloDiagram 图标,其可见状态会显示在屏幕的右边。 图 1.
现在,我们有一个构建我们的可视化类图的工作区。让我们包括一个包以包含我们的类。因为应用程序很简单,我们将只使用一个包。 从 Rational Rose 的中间栏(其中有缺省的设计可能性)插入一个包。 将该包命名为 HelloPackage。请参阅下面的图 2。 图 2.
双击该包以输入其上下文,在这里我们将构建我们的 J2EE 类图。我们将需要一个 servlet(HelloServlet),一个代理(HelloProxy)和一个 EJB 无状态会话 bean(Hello)。 插入 HelloServlet。(请参阅上面的设计考虑事项。)从菜单栏选择 Tools => Java/J2EE => New Servlet。 如下所示输入名称 HelloServlet,选择扩展 HttpServlet 然后选择 doGet: 图 3.
插入代理 HelloProxy。它由一个普通类(不是由向导驱动)组成。从中间栏中选择对应于一个类的图标。向您的 J2EE 类图中添加一个类: 图 4.
将这个新类命名为 HelloProxy。现在我们有了自己的 servlet 和代理,它们将同我们的会话 bean 通信。 让我们添加无状态会话 bean。从菜单栏选择 Tools => Java/J2EE => New EJB。 将其命名为 Hello 并保留接口的缺省名称。选择 1.1 规范。对于这个示例事务管理并不重要。 图 5.
现在完成了我们的简单 J2EE 类图。我添加了单向关联,您可以拷贝该关联。这个图不是完美的 — 其目的只是显示一个简单的示例。 图 6.
设置 Rational Rose 以将代码生成到 VisualAge for Java 3.5
构建组件层次结构
在 Rational Rose 右侧的 Component View 文件夹上单击鼠标右键。选择 New => Package。将这个文件夹命名为 HelloPackage。 从您在 Component View 中刚创建的 HelloPackage 文件夹中,单击鼠标右键,然后选择 New => Component。对于 Logical View 中的每个类,从 Component View 为其在包 HelloPackage 中创建一个组件,对这些组件使用与类相同的名称。结果应该如同下面的图 7 中所示。 图 7.
现在,您必须通过指定编程语言的类型以及与 Logical View 中适当类的关联来设置这些组件的规范。 对这五个组件的每一个: 在 Component View 中的组件上单击鼠标右键,然后选择 Open standard specification。 在 General 选项卡中,从下拉菜单选择 Java 以选择组件的语言。 在选择了 Java 语言之后,必须从 Logical View 中选择对应的选项。选择 Realizes 选项卡。您现在可以看到我们较早所创建的五个类了。从这五个类中,找到与您正在设置的组件名称相同的类。在那个类上单击鼠标右键然后选择 Assign。
图 8.
您已经为组件设置了规范,因此从该规范将 Java 代码生成到 IBM VisualAge for Java 就成为可能。单击 OK 然后为其它四个组件重复该过程。 要尝试 Rational Rose 2001 中的“酷”特性,请执行下列步骤: 在 Logical View 中双击 HelloDiagram 然后删除右边的所有可视化类。重要:不要从左边的 Logical View 中删除它们。右边现在应该重新变得完全空白。 从左边拖动并释放类(还是从 Logical View)。所有关联都应该是没有修改过的,并且您应该能够看到您不同的 J2EE 类的显示是非常"酷"的。
图 9.
您已经完成了组件的构建。现在,我们必须设置最后的细节。
设置
从主菜单选择 Tools => Java/J2EE => Project specification。 选择 Code Generation 选项卡然后从下拉菜单选择 IBM VisualAge for Java 作为 IDE。 从 J2EE 选项卡,对于 Servlet 选择 2.2 版本而对于 EJB 选择 1.1 版本。在这一点上也可以作其它选择,但我们还是让它保持简单。 将 Java 代码生成到 VisualAge for Java
启动 IBM VisualAge for Java IDE 并启动 Workbench。 创建一个称为 Hello 的项目。 在该项目的文件夹上单击鼠标右键并选择 Tools,然后选择 Rational Rose VisualAge for Java link Plugin Toggle。这一功能部件是由您安装在 VisualAge for Java 3.5 上的插件安装的,而它建立同 Rational Rose 的通信。几秒钟之后,一个消息框将通知您链接已经启动。 如果您的 IBM VisualAge for Java IDE 中没有这个功能部件,那么您必须安装该插件。(请参阅上面的内容。) 图 10.
转回到 Rational Rose IDE,在 Logical View 中双击 HelloDiagram。现在,您应该能在右边看到包 HelloPackage。 从右边选择 HelloPackage 然后从主菜单选择 Tools => Java/J2EE => Generate Code。 图 11.
出现一个可视化窗格让您选择想要在其中生成您的 Java 代码的 VisualAge for Java 项目。请使用 Hello 项目。 在 Rational Rose 消息窗格中,选择另外一个项目,单击 Browse,您应该能够从您的 VisualAge 工作区中所有项目进行选择。出现的窗口来自 VisualAge for Java。 选择名为 Hello 的新 VisualAge for Java 项目。 图 12.
单击 OK。代码生成到了 VisualAge for Java。 出现一个表示代码生成成功完成的消息框。单击 OK。 打开 VisualAge for Java IDE,您将会在 Hello 项目和 Java 包 HelloPackage 中发现您的 Java 代码。 您已经完成了到 VisualAge for Java 的代码生成,Java 代码应该在 VisualAge for Java 资源库中。
在 VisualAge for Java 3.5 中设置开发环境
打开 VisualAge for Java IDE 然后单击 EJB 选项卡以转至 EJB 开发环境。 在 EJB 开发环境的第二个菜单栏中单击 Add EJB group 创建一个新 EJBGroup。将其命名为 HelloGroup 然后选择 Hello 项目。 由于已经创建了一个新 EJB 组,您可以添加从 Rational Rose 导入的 HelloEJB。在 EJB 开发环境的左上方窗口中,单击鼠标右键然后选择 Add => Enterprise bean。出现一个如下面图 13 中所示的面板。 图 13.
选择单选按钮 Use an existing bean class。我们将使用从 Rational Rose 中导入的 HelloEJB。单击 Browse 以从 HelloPackage 中选择 HelloEJB bean 类。 图 14.
双击 HelloEJB 类。 单击 Next 以指定 home 接口和远程接口名称,以便它们与您在 Rational Rose 中选择的名称相匹配。 对于远程接口类,请使用名称 Hello,对于 home 接口,请使用 HelloHome。单击 Finish。 图 15.
结束语
这就好了!我们从 Rational Rose 创建了一个 J2EE 模型并将它的 Java 代码生成到 VisualAge for Java IDE。然后,我们在 VisualAge for Java 中修改最终设置以便开发和测试我们的 J2EE 应用程序。当然,这只是一个简单的应用程序,但是做一些修改之后,您就可以使用一些 GOF 设计模式或 bean 管理的实体 bean 来创建应用程序。下面是完成我们的“Hello world”应用程序的 Java 代码。您可以将代码直接复制到 VisualAge for Java 中。有关 WebSphere Test Environment 的更多信息,请阅读这些 IBM 红皮书。
样本 Java 代码
package HelloPackage; import java.rmi.RemoteException; import javax.ejb.*; public interface Hello extends javax.ejb.EJBObject{ java.lang.String sayHello() throws java.rmi.RemoteException; } package HelloPackage; import java.rmi.RemoteException; import javax.ejb.*; import java.io.*; Public class HelloEJB implements javax.ejb.SessionBean { public HelloEJB () { } public void ejbCreate () { } public void ejbRemove () { } public void ejbActivate () { } public void ejbPassivate () { } public void setSessionContext (javax.ejb.SessionContext sc) { } private String readFile(String file) { //Reads only the first line. try { Reader lecteur = new FileReader(file); BufferedReader temp = new BufferedReader(lecteur); return temp.readLine(); } catch (Exception e) { return "Hello anyway ! ";} } public String sayHello() throws RemoteException { return readFile("D:/data.txt"); } } package HelloPackage; import java.rmi.RemoteException; import javax.ejb.*; public interface HelloHome extends javax.ejb.EJBHome { public Hello create() throws java.rmi.RemoteException, javax.ejb.CreateException; } package HelloPackage; import javax.naming.*; import javax.naming.InitialContext.*; import javax.rmi.PortableRemoteObject; public class HelloProxy { private Hello theHello; private HelloHome theHelloHome; public HelloProxy() { } private InitialContext initContext = null; private String jndiName = "HelloPackage/Hello"; private java.util.Hashtable properties; private void connect() { //get initial context this.properties = new java.util.Hashtable(2); properties.put(javax.naming.Context.PROVIDER_URL, "iiop://localhost:901/"); properties.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "com.ibm.ejs.ns.jndi.CNInitialContextFactory"); try { initContext = new InitialContext(properties); //get the home... Object o = initContext.lookup(this.jndiName); theHelloHome = (HelloHome)PortableRemoteObject.narrow(o, HelloHome.class); //get the remote interface... theHello = theHelloHome.create(); } catch (Exception e) {} } public String exec() { try { connect(); return theHello.sayHello(); } catch (Exception e) { return "Houston we have a problem !"; } } } package HelloPackage; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends javax.servlet.http.HttpServlet { public HelloProxy theHelloProxy; public HelloServlet() { } public void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { theHelloProxy = new HelloProxy(); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.print("<html><body>" + theHelloProxy.exec() + request.getParameter("nom") + "</body></html>"); out.flush(); out.close(); } } 由于不会传图片,请见量 |
|