扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
Workshop10.1是BEA公司新推出的JavaEE应用开发工具,提供了目前流行的开发技术和框架的可视化开发支持,包括Struts、Beehive、Hibernate、JSF、Beehive、JPA、Spring等,而且加入了AppXRay特性,它能够分析JSP页面、Java源代码、资源绑定和Web配置文件中可能存在的引用以及这种引用的正确性。本文是《全方位体验Workshop10.1》的第二部分,主要介绍如何利用Workshop10.1提供的特性快速的在Web应用中引入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项目开发的支持非常优秀,除了Beehive中控件的开发目前还无法达到非常好的可视化支持之外,其他的部分如页面流中的Action、页面调转、数据在JSP和Action之间的传递、JSP页面设计等都能够提供非常好的可视化开发界面,而且得益于Workshop10.1中提供的AppXRay技术,我们可以轻松的了解、管理企业Web应用中所有的部件以及部件之间的关系。
在本文中,我们使用Workshop10.1开发工具完成数据库表记录的增加、删除、修改、查询、分页显示动作。
数据库的操作将使用Beehive中的控件技术完成,页面显示使用Beehive中提供的netui标签库,页面导航和调转将使用Beehive中的页面流技术。
下面我们将详细的描述使用Workshop10.1开发工具开发Beehive应用的详细步骤:
其他配置均使用默认配置,所以直接单击Finish按钮结束项目配置。
默认配置下该Web项目已经集成的框架包括:
Beehive Controls
Beehive NETUI
JSTL
Struts
XMLBeans
通过Servers视图启动WebLogic Server,由于开发过程中需要调试代码,所以我们选择使用Debug方式启动Server。
在面向对象的开发中,开发者选择使用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”
然后我们通过下面的步骤创建访问MySQL数据库中“demo_user”表的Beehive控件:
// 完成记录的插入
@JdbcControl.SQL(statement = "INSERT INTO DEMO_USER(UNAME,UPASSWORD,UADDRESS,UTELEPHONE)
VALUES({user.uname},{user.upassword},{user.uaddress},{user.utelephone})")
public void persistDemoUser(DemoUser user); // 完成记录的更新
@JdbcControl.SQL(statement = "UPDATE DEMO_USER SET UNAME={user.uname},UPASSWORD={user.upassword},
UADDRESS={user.uaddress},UTELEPHONE={user.utelephone} WHERE UID = {user.uid}")
public void mergeDemoUser(DemoUser user);
// 完成记录的删除
@JdbcControl.SQL(statement = "DELETE FROM DEMO_USER WHERE UID = {uid}")
public void removeDemoUser(Integer uid); // 根据编号查找合适的一条记录
@JdbcControl.SQL(statement = "SELECT * FROM DEMO_USER WHERE UID = {uid}")
public DemoUser findDemoUserById(Integer uid); // 根据名称模糊查找符合条件的多条记录
@JdbcControl.SQL(statement = "SELECT * FROM DEMO_USER WHERE UNAME LIKE {uname}")
public DemoUser[] findDemoUserByName(String uname);
至此,我们就完成了访问数据库的Beehive控件的开发,关于控件开发的更多内容,请参考Beehive项目的帮助文档。
在Project Explorer视图中,展开Beehive项目的WebContent节点,通过右键菜单连续的创建5个JSP文件,不需要填充JSP文件的内容,我们将在稍后的环节介绍如何填充这些JSP文件的内容:
在Project Explorer视图中,展开Beehive项目的Java Sourcesàsrcàdefault package,在Controller.java节点上双击
单击工具右上角的图标,切换到Page Flow透视图。
如果该图标不存在,可以单击右上角的,然后选择Other…,
在弹出框中选择:
在Page Flow Explorer视图中,在展开rootàactions节点,在该节点上单击右键,选择New Action…
在弹出的配置框中,选择或者输入如下信息:
单击Finish按钮。
重复上面的动作,只是在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页面填充内容,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标签和相关内容。
userQueryInput.jsp中显示用户输入查询条件的Form,因此和上面的步骤基本一致。
打开userQueryInput.jsp页面,重复上面的动作,只是Form中使用的Action变成了findDemoUserByName。
和上面的步骤基本一致,将Form图标拖到userUpdateInput.jsp的设计区,将Form的Action设置为mergeDemoUser。
其他都使用默认配置即可。
在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的设计区将出现下面的内容:
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提供的可视化向导填写相应的配置信息即可,大大的提高了开发效率和源代码的质量。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者