![]() |
|
首页│注册│帮助 | |||
相关问题
| • | 颠峰对决:Google pk Apache, |
| • | 在Slaris10系统下编译安装apac |
| • | Apache2+php4.3.6+MySQL4.0.20 |
| • | 如何保护Linux系统下的Apache网 |
| • | Beehive应用开发详解 |
| • | Apache CXF 在 WebLogic 9.2 上 |
| • | 利用Apache实现weblogic集群配 |
| • | 开源SCA实现Apache Tuscany走向 |
待解决
Beehive简介
Beehive是Apache提供的开源项目,Beehive中提供了一种MVC框架NETUI,同时提供了一种访问企业资源的简单框架:控件(Controls)。
1. NETUI
NETUI是基于 Struts 的一种 MVC 框架,使用 JSR-175 解决了 Struts 配置文件的自动更新,也使 Struts 开发更容易用 IDE 工具实现,同时提供了一些更易于使用的特性:
1.1 状态管理
一个 JPF 中的所有页面和处理动作都被看成是一个会话, JPF 中声明的变量在各个页面均可访问,包括 JavaBean。
[注] 当用户离开页面流时,会话状态中存储的数据将自动释放以便更有效地使用会话数据。所以多个 JPF 之间是不能共享会话数据的。
1.2 丰富的数据绑定功能
NETUI中提供了一组标签库来实现数据和 JSP 页面的显示标记之间的绑定,让显示界面编程更加容易。
1.3 集中的异常处理
可以在一个 JPF 中处理异常,也可以在 Globel.app跨越一组页面流处理异常信息。很显然,我们可以很容易为整个应用程序集中的进行异常处理,让程序更具灵活性 —— 比如常见的登录超时信息、权限信息等,传统的方式你应该在每个页面进行判断,现在你可以在入口处进行判断就可以了。
2. 控件(Controls)
创建轻量级 J2EE 组件的一种框架,您可以不用编写大量代码就完成以下常见工作:
2.1 用于创建访问资源如数据库、EJB、本地文件、 Web 服务等资源的组件。
2.2 用于封装企业可重用的业务逻辑等。
Workshop10.1中对Beehive的支持
Workshop10.1中对Beehive项目开发的支持非常优秀,除了Beehive中控件的开发目前还无法达到非常好的可视化支持之外,其他的部分如页面流中的Action、页面调转、数据在JSP和Action之间的传递、JSP页面设计等都能够提供非常好的可视化开发界面,而且得益于Workshop10.1中提供的AppXRay技术,我们可以轻松的了解、管理企业Web应用中所有的部件以及部件之间的关系。
案例说明
在本文中,我们使用Workshop10.1开发工具完成数据库表记录的增加、删除、修改、查询、分页显示动作。
数据库的操作将使用Beehive中的控件技术完成,页面显示使用Beehive中提供的netui标签库,页面导航和调转将使用Beehive中的页面流技术。
开发步骤
下面我们将详细的描述使用Workshop10.1开发工具开发Beehive应用的详细步骤:
创建支持Beehive的Web项目
启动Workshop10.1工具,打开菜单FileàNew-->>Project…;
选择项目类型为Dynamic Web Project;
输入项目名称为BeehiveDemo
其他配置均使用默认配置,所以直接单击Finish按钮结束项目配置。
默认配置下该Web项目已经集成的框架包括:
Beehive Controls
Beehive NETUI
JSTL
Struts
XMLBeans
将BeehiveDemo项目发布到WebLogic Server上
在Servers视图中WebLogic Server上单击鼠标右键,选择Add and Remove Projects…;
选中左边列表中的BeehiveDemo,单击Add > 按钮;
单击Finish按钮。
启动WebLogic Server
通过Servers视图启动WebLogic Server,由于开发过程中需要调试代码,所以我们选择使用Debug方式启动Server。
开发POJO——DemoUser
在面向对象的开发中,开发者选择使用POJO来映射数据库中的表,我们同样使用DemoUser这个Java类来映射案例中的数据库表,DemoUser包括5个属性,他们分别对应数据库表的一个字段:
package com.levainservice.demo.beehive.beans; public class DemoUser implements java.io.Serializable { private Integer uid; // 对应“demo_user”表的编号字段 private String uname; // 对应“demo_user”表的名称字段 private String upassword; // 对应“demo_user”表的密码字段 private String uaddress; // 对应“demo_user”表的地址字段 private String utelephone; // 对应“demo_user”表的电话字段 … // 属性对应的getter和setter方法 }开发访问数据库的控件
默认情况下,Beehive的控件不要放在默认包下面,更好的方式是为Beehive控件创建自己的Java包,我们可用下面的步骤在BeehiveDemo项目中创建新的Java包”com.levainservice.demo.beehive.controls”
在Project Exporer视图中,展开BeehiveDemo项目的Java Sourcesàsrc节点,在该节点上单击鼠标右键,选择NewàPackage
在Java 包信息设置框中填入如下信息:
单击Finish创建新的Java包。
然后我们通过下面的步骤创建访问MySQL数据库中“demo_user”表的Beehive控件:
在新创建的Java包com.levainservice.demo.beehive.controls对应的节点上单击鼠标右键,选择NewàJDBC Control
输入控件名: UserControl;
单击Next,单击Data Source后面的Browse..按钮,选择jndi/mysql。
单击Finish,完成访问MySQL库中demo_user表的控件的基本配置
在打开的控件源代码视图中加入如下内容:
// 完成记录的插入 @JdbcControl.SQL(statement = \"INSERT INTO DEMO_USER(UNAME,UPASSWORD,UADDRESS,UTELEPHONE) VALUES(,,,)\") public void persistDemoUser(DemoUser user);
// 完成记录的更新 @JdbcControl.SQL(statement = \"UPDATE DEMO_USER SET UNAME=,UPASSWORD=,UADDRESS=,UTELEPHONE= WHERE UID = \") public void mergeDemoUser(DemoUser user); // 完成记录的删除 @JdbcControl.SQL(statement = \"DELETE FROM DEMO_USER WHERE UID = \") public void removeDemoUser(Integer uid);
// 根据编号查找合适的一条记录 @JdbcControl.SQL(statement = \"SELECT * FROM DEMO_USER WHERE UID = \") public DemoUser findDemoUserById(Integer uid);
// 根据名称模糊查找符合条件的多条记录 @JdbcControl.SQL(statement = \"SELECT * FROM DEMO_USER WHERE UNAME LIKE \") public DemoUser[] findDemoUserByName(String uname);
至此,我们就完成了访问数据库的Beehive控件的开发,关于控件开发的更多内容,请参考Beehive项目的帮助文档。
准备Web项目所需的JSP空页面
在Project Explorer视图中,展开Beehive项目的WebContent节点,通过右键菜单连续的创建5个JSP文件,不需要填充JSP文件的内容,我们将在稍后的环节介绍如何填充这些JSP文件的内容:
录入新用户信息的JSP页面: userInsertInput.jsp
输入查询条件的JSP页面:userQueryInput.jsp
查询结果显示JSP页面:userQueryResult.jsp
修改用户信息的JSP页面:userUpdateInput.jsp
操作成功的提示JSP页面:ok.jsp
开发页面流
切换到Page Flow透视图
打开Controller.java
在Project Explorer视图中,展开Beehive项目的Java Sourcesàsrcàdefault package,在Controller.java节点上双击
切换到PageFlow透视图
单击工具右上角的图标,切换到Page Flow透视图。
如果该图标不存在,可以单击右上角的,然后选择Other…,
在弹出框中选择:
可视化的开发页面流Actions
准备保存用户信息的Action
在Page Flow Explorer视图中,在展开rootàactions节点,在该节点上单击右键,选择New Action…
在弹出的配置框中,选择或者输入如下信息:
单击Finish按钮。
准备查找用户信息的Action,查找出来的信息将显示出来供用户修改
重复上面的动作,只是在Action配置页上选择或者输入如下信息:
准备保存被修改用户信息的Action
重复上面的动作,只是在Action配置页上选择或者输入如下信息:
准备删除用户信息的Action
重复上面的动作,只是在Action配置页上选择或者输入如下信息:
准备模糊查找用户信息的Action
重复上面的动作,只是在Action配置页上选择或者输入如下信息:
经过上述步骤后生成的Controller.java全部内容
1、 import javax.servlet.http.HttpSession;
2、 import org.apache.beehive.netui.pageflow.PageFlowController;
3、 import org.apache.beehive.netui.pageflow.annotations.Jpf;
4、 import org.apache.beehive.controls.api.bean.Control;
5、 import com.levainservice.demo.beehive.controls.UserControl;
6、 import org.apache.beehive.netui.pageflow.Forward;
7、 import org.apache.beehive.netui.util.type.TypeUtils;
8、 @Jpf.Controller(simpleActions = { @Jpf.SimpleAction(name = \"begin\", path = \"index.jsp\") })
9、 public class Controller extends PageFlowController {
10、 private static final long serialVersionUID = 1L;
11、 @Control
12、 private UserControl userControl;
13、 @Jpf.Action(forwards = { @Jpf.Forward(name = \"success\", path = \"ok.jsp\") })
14、 public Forward persistDemoUser(Controller.PersistDemoUserFormBean form) {
15、 Forward forward = new Forward(\"success\");
16、 com.levainservice.demo.beehive.beans.DemoUser user = form.getUser();
17、 userControl.persistDemoUser(user);
18、 return forward;
19、 }
20、 @Jpf.Action(forwards = { @Jpf.Forward(name = \"success\", path = \"userUpdateInput.jsp\") })
21、 public Forward findDemoUserById() {
22、 Forward forward = new Forward(\"success\");
23、 String param1 = getRequest().getParameter(\"uid\");
24、 java.lang.Integer uid = TypeUtils.convertToIntegerObject(param1);
25、 com.levainservice.demo.beehive.beans.DemoUser findDemoUserByIdResult = userControl
26、 .findDemoUserById(uid);
27、 FindDemoUserByIdFormBean outputForm = new FindDemoUserByIdFormBean();
28、 outputForm.setDemoUser(findDemoUserByIdResult);
29、 forward.addOutputForm(outputForm);
30、 return forward;
31、 }
32、 @Jpf.Action(forwards = { @Jpf.Forward(name = \"success\", path = \"ok.jsp\") })
33、 public Forward mergeDemoUser(Controller.FindDemoUserByIdFormBean form) {
34、 Forward forward = new Forward(\"success\");
35、 com.levainservice.demo.beehive.beans.DemoUser user = form.getDemoUser();
36、 userControl.mergeDemoUser(user);
37、 return forward;
38、 }
39、 @Jpf.Action(forwards = { @Jpf.Forward(name = \"success\", path = \"ok.jsp\") })
40、 public Forward removeDemoUser() {
41、 Forward forward = new Forward(\"success\");
42、 String param1 = getRequest().getParameter(\"uid\");
43、 java.lang.Integer uid = TypeUtils.convertToIntegerObject(param1);
44、 userControl.removeDemoUser(uid);
45、 return forward;
46、 }
47、 @Jpf.Action(forwards = { @Jpf.Forward(name = \"success\", path = \"userQueryResult.jsp\", actionOutputs = { @Jpf.ActionOutput(name = \"findDemoUserByNameResult\", type = com.levainservice.demo.beehive.beans.DemoUser[].class) }) })
48、 public Forward findDemoUserByName(Controller.PersistDemoUserFormBean form) {
49、 Forward forward = new Forward(\"success\");
50、 java.lang.String uname = \"%\" + form.getUser().getUname() + \"%\";
51、 com.levainservice.demo.beehive.beans.DemoUser[] findDemoUserByNameResult = userControl
52、 .findDemoUserByName(uname);
53、 forward.addActionOutput(\"findDemoUserByNameResult\",
54、 findDemoUserByNameResult);
55、 return forward;
56、 }
57、 @Jpf.Action(forwards = { @Jpf.Forward(name = \"success\", path = \"userQueryResult.jsp\", actionOutputs = { @Jpf.ActionOutput(name = \"findDemoUserByNameResult\",type= com.levainservice.demo.beehive.beans.DemoUser[].class) }) })
58、 public Forward findDemoUserByName1(FindDemoUserByName1FormBean form) {
59、 Forward forward = new Forward(\"success\");
60、 java.lang.String uname = form.getUname();
61、 com.levainservice.demo.beehive.beans.DemoUser[] findDemoUserByNameResult = userControl
62、 .findDemoUserByName(uname);
63、 forward.addActionOutput(\"findDemoUserByNameResult\",
64、 findDemoUserByNameResult);
65、 return forward;
66、 }
67、 /**
68、 * Callback that is invoked when this controller instance is created.
69、 */
70、 @Override
71、 protected void onCreate() {
72、 }
73、 /**
74、 * Callback that is invoked when this controller instance is destroyed.
75、 */
76、 @Override
77、 protected void onDestroy(HttpSession session) {
78、 }
79、 @Jpf.FormBean
80、 public static class PersistDemoUserFormBean implements java.io.Serializable {
81、 private static final long serialVersionUID = 1L;
82、 private com.levainservice.demo.beehive.beans.DemoUser user;
83、 public PersistDemoUserFormBean() {
84、 user = new com.levainservice.demo.beehive.beans.DemoUser();
85、 }
86、 public com.levainservice.demo.beehive.beans.DemoUser getUser() {
87、 return user;
88、 }
89、 public void setUser(com.levainservice.demo.beehive.beans.DemoUser user) {
90、 this.user = user;
91、 }
92、 }
93、 @Jpf.FormBean
94、 public static class FindDemoUserByIdFormBean implements
95、 java.io.Serializable {
96、 private static final long serialVersionUID = 1L;
97、 private com.levainservice.demo.beehive.beans.DemoUser demoUser;
98、 public FindDemoUserByIdFormBean() {
99、 demoUser = new com.levainservice.demo.beehive.beans.DemoUser();
100、 }
101、 public com.levainservice.demo.beehive.beans.DemoUser getDemoUser() {
102、 return demoUser;
103、 }
104、 public void setDemoUser(
105、 com.levainservice.demo.beehive.beans.DemoUser demoUser) {
106、 this.demoUser = demoUser;
107、 }
108、 }
109、 @Jpf.FormBean
110、 public static class FindDemoUserByName1FormBean implements java.io.Serializable {
111、 private static final long serialVersionUID = 1L;
112、 private java.lang.String uname;
113、 public FindDemoUserByName1FormBean() {
114、 }
115、 public java.lang.String getUname() {
116、 return uname;
117、 }
118、 public void setUname(java.lang.String uname) {
119、 this.uname = uname;
120、 }
121、 }
122、 }
可视化的开发JSP页面
在前面的步骤中我们仅仅准备了空的JSP页面,现在我们开始为这些JSP页面填充内容,Workshop10.1中提供了可视化的方式来开发这些JSP页面,开发者只需要跟着向导一步一步填写必要的配置信息即可,在必要的时候,还可以根据实际需要,对生成的JSP文件内容进行调整。
在进行下面的步骤之前,请将工作台切换到J2EE透视图。
填充录入新用户信息的JSP页面: userInsertInput.jsp
userInsertInput.jsp中需要给用户显示Form,以便用户可以输入用户的信息,在Beehive中,我们使用NETUI标签库中的Form标签显示Form,下面是Workshop10.1中可视化向JSP中填充Form标签的步骤:
用Workshop JSP Editor编辑器打开userInsertInput.jsp,在Workshpop Palette视图中展开NETUI,选择其中的Form项。
用鼠标将该图标拖拽到userInsertInput.jsp编辑器的设计区,然后松开鼠标,在弹出的对话框中的Action后面的下拉框中选择persistDemoUser;
单击Next,在弹出的属性选择框中不选择uid节点[因为ID是数据库自动生成的,不需要用户录入];
单击Next按钮,在弹出的属性顺序排列界面中根据需要调整属性显示的先后顺序。
单击Finish按钮结束Form的设置,可以看到userInsertInput.jsp的设计区出现如下内容。
对应的,userInsertInput.jsp的源代码区中也增加了相应的NETUI标签和相关内容。
填充输入查询条件的JSP页面:userQueryInput.jsp
userQueryInput.jsp中显示用户输入查询条件的Form,因此和上面的步骤基本一致。
打开userQueryInput.jsp页面,重复上面的动作,只是Form中使用的Action变成了findDemoUserByName。
填充修改用户信息的JSP页面:userUpdateInput.jsp
和上面的步骤基本一致,将Form图标拖到userUpdateInput.jsp的设计区,将Form的Action设置为mergeDemoUser。
其他都使用默认配置即可。
填充查询结果显示JSP页面:userQueryResult.jsp
在Beehive中,可以简单的分页显示数据的标签是netui-data:datagrid,在演示案例中,我们就选择netui-data:datagrid分页显示从数据库中查询出来的用户信息,下面是Workshop10.1中可视化向JSP中插入netui-data:datagrid标签的步骤:
用Workshop JSP Editor编辑器打开userQueryResult.jsp,在Workshop Palette中展开NETUI DataBinding,选择其中的DataGrid,拖动到userQueryResult.jsp的设计区,
在弹出的DataGrid设置框General标签上,单击DataSource后面的Browse…按钮,在弹出窗口中选择Page Variablesà
单击OK关闭选择框,单击Columns标签页,使用上面的按钮调整显示的列和列的顺序;
单击Pager标签页,设置分页显示的相关信息;
单击OK关闭DataGrid设置界面,在userQueryResult.jsp的设计区将出现下面的内容:
填充操作成功的提示JSP页面:ok.jsp
OK.jsp可以显示每一步操作的结果信息,这里我们简单的在里面填充”操作成功”的中文信息即可。
测试
现在我们可以测试基于Beehive开发的数据库表的增加、删除、修改、查询、分页显示的Web应用了,打开浏览器,输入http://localhost:7001/BeehiveDemo/userInsertInput.jsp可以访问用户增加的界面,输入http://localhost:7001/BeehiveDemo/userQueryInput.jsp可以访问用户查询、分页显示界面。
下面是应用中主要界面的截图,根据实际应用的要求,在JSP里面做了部分的修改,请参考随本文提供的源代码。
查询界面截图
用户信息修改界面
用户信息增加界面
总结
从本文中可以看到,Workshop10.1中为开源框架Beehive的可视化开发提供了非常好的支持,开发者除了Beehive控件部分需要编写部分Java代码之外,其他的大部分Java代码和JSP界面的源代码根本不需要自己动手编写,只需要根据Workshop10.1提供的可视化向导填写相应的配置信息即可,大大的提高了开发效率和源代码的质量。
提问者: 03-16 20:08
答复
路过,帮顶
回答者:玉米づ冰冻可乐 -
2007-05-12

