一、开发环境搭建

1. 前期准备

Java jdk1.6 ,Oralce数据库,plsql客户端,tomcat6.0,开发样例数据库脚本,unieap脚本,unieap工程,unieap workshop。

2. 引入UniEAP v4工程到workshop中

在菜单中选择“导入”,选择“现有项目到工作空间中“,如下图:


3. 创建组件

在工程framework上右键选择“新“,再选择“SC unieap组件”,填写ID:testSC,如下图所示:

然后再testSC上右键选择“新“,再选择“DC unieap组件”,填写ID:testDC,如下图所示:


4. 修改配置参数

然后需要配置数据库连接配置文件/patch/webroot/WEB-INF/conf/platform/core/EAPConfig.properties,并将里面的参数改为现在使用的数据库连接,如下图所示:


5. 发布/更新工程

当更新过代码或设置时,workshop会自动进行代码生成和更新,如果遇到没有更新的情况,可以手动进行更新。

首选在workshop菜单中的“项目”里将“自动构建”勾选上,然后点击“清理”,如下图所示:

还可以通过在framework上点击右键,选择“unieap工具”里的“一键发布”功能完成代码更新。如果遇到总是加载新代码失败的情况,可以采取以上两种方式进行代码更新后再尝试发布。

二、开发实践(初级)增删改查

首先以查询为例,介绍如何通过使用各个模型驱动开发一个功能,然后总体介绍增加、修改、删除功能开发过程。

1. 建立领域实体模型entity

在entity上点击右键,点击“新”新建entity模型,如下图:

填写数据源配置,点击“测试链接”测试链接是否连通,然后点击“下一步”。

点击“刷新”按钮,会看到数据库里所有的表对象,可以在上面“输入表或视图名前缀”录入框里直接录入表名,选择要建立模型的表,ID生成策略设置为uuid,点击“完成”。

 

完成之后,在entity里会生成相应的模型,同时,在src下设置的包内生成对应的pojo类,在conf下生成hibernate的.hbm.xml配置文件。注意,如果有改动,要先修改模型,再用模型生成对应的pojo类和配置文件,如果直接修改pojo类和配置文件不改模型,生成后会被覆盖。

2. 建立DAO模型

右键点击DAO模型,选择“新”建立DAO模型,如下图所示:

完成后,会在src下生成DAO的接口和实现类,如下图所示:

先在接口里定义查询方法:

然后在实现类里实现,编写hql语句查询结果:


3. 建立BO模型

右键点击BO模型,选择“新”新建BO模型,如下图所示:

点击“完成”后会自动在src下生成BO的接口和实现类,并生成相应的spring配置文件。

现在接口里定义方法,然后在实现类里实现:

在BO里定义DAO对象,设置get,set方法,框架会自动生成spring的配置文件进行依赖注入,不用我们再进行配置了。

4. 建立页面view模型

右键点击“view”,选择“新”建立view模型如下图所示:

建立模型后,会在view目录下生成相应的jsp与js文件。

然后点击view模型,进入“设计标签”,上面有很多页面控件可以选择,能够方便的进行前台表格或按钮开发与布局,几乎不用编写代码。下面的数据集标签里可以设置页面用到的数据集。具体如下图所示:

点击数据集上的“+”按钮增加数据集,首先建立查询列表的数据集,设置数据集如下图所示:

在标题上填写实际的名称,点击“完成”。

然后在设计标签中拖拽Grid或QueryGrid到界面上,会出现如下界面:

填写控件ID,选择控件类型为XGrid,选择类型如果有单选框选single,有多选框选multiple,没有则选none,数据集选择刚刚设置的testUser。将不想显示的行勾选掉,然后点击下一步,进入设置查询表单页面,如下图所示:

设置总列数和要显示的查询条件,例如勾选用户名和班级名,则以这两个条件为查询条件。

设置完后看到设计器里生成了一个带查询条件表单和查询结果列表的组件。如下图所示:

我们设置了2个查询条件,一个是用户名,一个是班级,我们为这个查询条件建立数据集:

数据集里包括2个查询条件所用的字段。

接下来我们开始编写前台脚本:

首先点击“过程调用”标签,在“请求方法定义”中点击【增加】按钮,增加一个新方法,为方法命名为getAllUsers,用于获取后台查询的数据。

然后在“依赖BO”中点击【增加】按钮,选择以来的BO,也就是我们上面所开发的BO。

然后在“自动调用BO方法”中点击【选择】按钮,选出我们刚刚开发的方法testBO.getAllUsers。

因为有需要传递查询条件参数,所以在左面参数列表里加入参数,如下图所示:

接下来开发getAllUsers方法调用成功后的回调函数,点击成功回调的“编辑”:

在脚本中编写成功回调后将数据放入列表的脚本:

最后编写查询按钮绑定的点击事件,在事件里调用getAllUsers方法。点击查询按钮上的小箭头在事件里选择“编辑onClick事件”,进入事件脚本编辑:

然后编写调用语句:

这样我们整个查询功能就开发完了,运行效果如下图所示:


5. 新增、修改、删除实现
5.1新增实现

首先要配置一个数据集,用于新增使用:

然后在页面里加入新增的form表单:

选择表单所用的数据集

然后添加新增按钮,完成后界面如下图所示:

接下来进行BO和DAO中的方法编写,在BO与DAO里分别定义新增方法:

BO内实现:

DAO内实现:

然后在前台过程调用中创建调用方法saveUser,如下图所示:

选择依赖BO,并选择调用BO的方法,并定义方法的参数,如下图所示:

然后编写成功回调函数,在新增成功后,将新增的数据插入到查询列表的第一行中,如下图所示:

最后,在【新增】按钮里的onclick事件中调用saveUser方法:

这样,新增功能就完成了。

5.2删除实现

删除列表中选中行数据。

首先在BO和DAO创建删除方法:

在前台过程调用中创建deleteUser方法,并设置关联BO的方法与参数:

编辑成功回调函数:

在【删除】按钮的onclick事件中调用deleteUser方法:


5.2修改实现

修改列表中选中行的数据信息。

首先创建BO与DAO中的修改方法:

然后创建修改弹窗框控件:

新建更新弹出页面view模型:

然后在XDialog中设置页面引用为新建的updatetestSampleDemo.view:

编辑页面完成操作后的onComplete事件,更新列表中选中行的信息:

接下来在修改按钮的onclick事件中调用XDialog弹出修改页面:

打开updatetestSampleDemo.view,

首先创建数据集:

在界面加入form控件和修改按钮:

绑定form的数据集。

设置过程调用方法updateUser调用BO中的修改方法:

编写成功回调函数:

在修改按钮的onclick事件中调用updateUser方法:

这样,修改功能就完成了。

有时会用到超链接打开修改页面,下面介绍一下使用超链接形式进行修改:

点击姓名上单位 超链接,进入修改页面,首先点击表头中的姓名,选择formatter事件进行编辑:

在formatter事件里编写以下代码:

return "<a href=\"#\" onclick=\"javascript:testSampleDemo.clickOrderNumber('" + inRowIndex + "')\">" + inValue + "</a>";

然后在公共方法中增加clickOrderNumber方法:

超链接调用该方法会将行号作为inRowIndex参数传递过来,然后获取这一行的数据,和上面一样调用dialog控件弹出修改页面。

三、开发实践(中级)存储过程调用

存储过程是实现系统业务逻辑的重要手段,下面内容主要介绍如何使用框架调用存储过程实现想要处理的业务功能。

业务场景是:在用户列表上勾选多个用户,将勾选的用户中,姓名等于下面填写的姓名的用户的年龄改为填写的年龄。

首先做一个查询功能,查询所有用户信息,这个功能和上面介绍的查询功能类似,在这里就不介绍了。

然后编写前台过程调用方法:

调用后台BO中的saveProcedures方法。然后编辑成功回调函数:

接下来在【调用存储】按钮的onclick事件中调用saveProcedures方法:

最后,是最重要的如何在后台调用存储过程,

在BO中创建调用存储方法:

在DAO中创建调用存储方法,请参照注释内容学习每个步骤和语法:

下面介绍一下存储过程里的语法,请参照注释学习每个步骤和语法:

CREATE OR REPLACE PROCEDURE PRO_BIZ_SAVEUSER_ENTER_P(P_F_USER IN VARCHAR2, --包含更改年龄的用户

P_F_USERLIST IN VARCHAR2, --修改列表

P_RESULT OUT VARCHAR2 --返回值

) IS

/******************************************************

* 函数名 : PRO_BIZ_SAVEUSER_ENTER_P

* 建立日期 : 2013-10-31 11:00

* 作者 : liu.zhp

* 模块 : 保存用户信息

* 描述 : 将选中的名字等于填写名字的用户,年龄改为填写的年龄

* 返回值 : P_RESULT 返回值

*-------------------------------------------------------

* 修改历史

* 序号 日期 修改人 修改原因

* 1

* 2

********************************************************/

V_USER_JSON_LIST json_list;--保存填写的user对象的list

V_USERLIST_JSON_LIST json_list;--保存选择的列表对象的list

V_USER_JSON json;--保存填写的user对象的list中的1个元素

V_USERLIST_JSON json;--选择的列表对象的list1个元素

V_AGE VARCHAR2(32); --年龄变量

V_NAME VARCHAR2(32); --姓名变量

V_LIST_NAME VARCHAR2(32); --List中的姓名变量

BEGIN

--初始化传入数据

V_AGE := '0';

V_USER_JSON_LIST := json_list(P_F_USER);--此语法是获取对象list

V_USERLIST_JSON_LIST := json_list(P_F_USERLIST);--此语法是获取对象list

V_USER_JSON:= json(V_USER_JSON_LIST.get(1));--此语法是获取对象list中的第一个对象,

--因为填写姓名和年龄的user对象只有1个所以直接get1

V_AGE:=json_ext.get_string(V_USER_JSON, 'uAge');--此语法是获取只定属性的值

V_NAME:=json_ext.get_string(V_USER_JSON, 'uName');--此语法是获取只定属性的值

IF(V_USERLIST_JSON_LIST.COUNT() > 0) THEN --判断list中是否有元素

FOR I IN 1 .. V_USERLIST_JSON_LIST.COUNT() LOOP --循环list里的每一个元素

V_USERLIST_JSON:=json(V_USERLIST_JSON_LIST.get(I));--获取第i个对象

V_LIST_NAME:=json_ext.get_string(V_USERLIST_JSON, 'uName');--得到第i个对象的姓名

IF(V_LIST_NAME=V_NAME) THEN --如果姓名等于填写的年龄,将这个id的对象改为填写的年龄

UPDATE TEST_USER T

SET T.U_AGE=V_AGE

WHERE T.U_ID=json_ext.get_string(V_USERLIST_JSON, 'uId');

END IF;

END LOOP;

END IF;

COMMIT;

END PRO_BIZ_SAVEUSER_ENTER_P;

附录1 编码规范

***写注释是编写代码的重要规范,必须对自己编写的代码增加注释,以便于其他成员阅读和修改,请务必养成良好的习惯,利己利人。

组件命名规范:

首个单词小写,之后单词首字母大写,例如:

包命名规范:

com.neusoft.1级包名.2级包名…… 例如:

类命名规范:

接口定义:

每个单词首字母大写,如果是BO或DAO接口,加上BO/DAO,例如:

public interface TestBO {}

public interface TestDAO {}

实现类定义:

每个单词首字母大写,如果是BO或DAO的实现,加上BOImpl/DAOImpl,例如:

public class TestBOImpl implements TestBO {}

public class TestDAOImpl extends BaseHibernateDAO implements TestDAO {}

变量命名规范:

首个单词首字母小写,从第二个单词开始首字母大写,例如:

String jsonUserStr=jsonUser.toString();

方法命名规范:

首个单词首字母小写,从第二个单词开始首字母大写,例如:

public String saveProcedures(TestUser testUser,List<TestUser> testUserList){}

注释规范:

所有类的开头都需要写注释,说明类的作用;方法前需要些注释,说明方法功能,参数,返回值;业务逻辑每行最好都有注释,便于其他成员修改时理解代码含义,具体例子如下:

在类定义里写以下注释:

/**

* brief description

* <p>Date : 2013-12-26</p>

* <p>Module : SITA报文发送接收接口</p>

* <p>Description: BO实现</p>

* <p>Remark : 备注</p>

* 版权声明 :

* 本代码版权归东软集团(大连)有限公司所有,禁止任何未授权的传播和使用

* @author zhangxingwang@neusoft.com

* @version 1.0

* <p>------------------------------------------------------------</p>

* <p> 修改历史</p>

* <p> 序号 日期 修改人 修改原因</p>

* <p> 1 </p>

*/

public class SitaCommonBOImpl extends BaseServiceImpl implements ISitaCommonBO {

在方法前写以下注释:

/**

* 方法简要描述信息.

* <p> 描述 : 根据航班号、航班日期、状态,查询报文发送信息公共方法</p>

* <p> 备注 : 其他对方法的说明信息</p>

* @param paramMap

* @return

* @throws ServiceException

*/

public List getPacketInfo(Map paramMap,String sql) throws ServiceException {

业务逻辑中写以下注释:

// 存储过程名称由存储过程在数据库中的“包名.存储过程名”定义,即以下调用PKG_TEST_FEEAUDIT包中的prc_a_commAuditing存储过程

String procedurename = "PRO_BIZ_SAVEUSER_ENTER_P";

int i = 0;

// ProcPara为V4为存储过程提供的参数对象

// 创建格式为:new ProcPara(序号,参数为输入或输出<分别对应: ProcPara.IN 和ProcPara.OUT>,输入的参数值<当该参数为输出时不需要该属性>,参数类型<一般由java.sql.Types定义>)

ProcPara[] paras = new ProcPara[] {

存储过程中写以下注释:

CREATE OR REPLACE PROCEDURE PRO_BIZ_SAVEUSER_ENTER_P(P_F_USER IN VARCHAR2, --包含更改年龄的用户

P_F_USERLIST IN VARCHAR2, --修改列表

P_RESULT OUT VARCHAR2 --返回值

) IS

/******************************************************

* 函数名 : PRO_BIZ_SAVEUSER_ENTER_P

* 建立日期 : 2013-10-31 11:00

* 作者 : liu.zhp

* 模块 : 保存用户信息

* 描述 : 将选中的用户年龄改为填写的年龄

* 返回值 : P_RESULT 返回值

*-------------------------------------------------------

* 修改历史

* 序号 日期 修改人 修改原因

* 1

* 2

********************************************************/

附录2 参考学习资料

1. UniEAP_V4_Usage.doc :优先阅读的用户手册

2. UniEAP Platform V4.4 FAQ.pdf

3. UniEAP V4 用户手册.pdf

4. UniEAP V4 Advance Form打印.pdf

5. 数据展示类表格控件开发教程.pdf

6. 文件上传和下载最佳实践.pdf

7. 页面穿透应用指南.pdf

8. 一键发布WebService.pdf

9. 自动分页查询及Grid导出使用说明.pdf

UniEAP V4 开发实践说明文档的更多相关文章

  1. 驰骋工作流引擎-底层开发API 说明文档

    驰骋工作引擎-底层开发API 登录与门户API 首先要进行代码集成与组织机构的集成 其次在自己的系统登录界面,登录成功后要执行ccbpm的框架登录. 所谓的登录就是调用ccbpm的登录接口,如左边的代 ...

  2. Highcharts选项配置详细说明文档(zz)

    http://www.helloweba.com/view-blog-156.html Highcharts提供大量的选项配置参数,您可以轻松定制符合用户要求的图表,目前官网只提供英文版的开发配置说明 ...

  3. Highcharts选项配置详细说明文档

    Highcharts提供大量的选项配置参数,您可以轻松定制符合用户要求的图表,目前官网只提供英文版的开发配置说明文档,而中文版的文档网上甚少,且零散不全.这里,我把Highcharts常用的最核心的参 ...

  4. UniEAP V4 WorkShop用户手册

    版权声明<UniEAP V4 WorkShop用户手册>的版权归东软集团(大连)有限公司所有.未经东软集团(大连)有限公司的书面准许,不得将本手册的任何部分以任何形式.采用任何手段(电子的 ...

  5. Android开发:最详细的 NavigationDrawer 开发实践总结

    最详细的 NavigationDrawer 开发实践总结 继前面写的两篇文章之后(有问题欢迎反馈哦): Android开发:Translucent System Bar 的最佳实践 Android开发 ...

  6. Angular开发实践(一):环境准备及框架搭建

    引言 在工作中引入Angular框架将近一年了,在这一年中不断的踩坑和填坑,当然也学习和积累了很多的知识,包括MVVM框架.前后端分离.前端工程化.SPA优化等等.因此想通过Angular开发实践这系 ...

  7. iOS开发实践-OOM治理

    概览 说起iOS的OOM问题大家第一想到的应该更多的是内存泄漏(Memory Leak),因为无论是从早期的MRC还是2011年Apple推出的ARC内存泄漏问题一直是iOS开发者比较重视的问题,比如 ...

  8. vue 2.0 开发实践总结之疑难篇

    续上一篇文章:vue2.0 开发实践总结之入门篇 ,如果没有看过的可以移步看一下. 本篇文章目录如下: 1.  vue 组件的说明和使用 2.  vuex在实际开发中的使用 3.  开发实践总结 1. ...

  9. SWFUpload 2.5.0版 官方说明文档 中文翻译版

    原文地址:http://www.cnblogs.com/youring2/archive/2012/07/13/2590010.html#setFileUploadLimit SWFUpload v2 ...

随机推荐

  1. jumpserver部署0.3版本 =====( ̄▽ ̄*)b

    jumpserver概述 跳板机概述: 跳板机就是一台服务器,开发或运维人员在维护过程中首先要统一登录到这台服务器,然后再登录到目标设备进行维护和操作: 跳板机缺点:没有实现对运维人员操作行为的控制和 ...

  2. poj2182 Lost Cows[BIT二分]

    blog题解鸽了许久了..本来说好的切一题写一个题解的说 一个$1 \sim n$数列,已知每个数前面比他小的数个数,试确定该序列. 相当的一道水题.可以发现数列最后一个数是首先可以确定下来的.然后把 ...

  3. css,scss解决样式:表格的重叠边框

    初始效果: 解决方法: 给带有边框的元素设置如下样式margin:0 0 -borderwidth -borderwidth 这里的borderwidth即为边框的宽度,按照上图所示,则添加样式 ma ...

  4. 大视频上传T级别解决方案

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  5. c语言 - 关键字const的作用

    const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的. 1.const char * p1;              //表示p1指向了的字符串不可更改 2.char const ...

  6. Nowcoder 挑战赛23 B 游戏 ( NIM博弈、SG函数打表 )

    题目链接 题意 : 中文题.点链接 分析 : 前置技能是 SG 函数.NIM博弈变形 每次可取石子是约数的情况下.那么就要打出 SG 函数 才可以去通过异或操作判断一个局面的胜负 打 SG 函数的时候 ...

  7. 1502: [NOI2005]月下柠檬树

    一堆圆台平行光的投影 在草稿纸上画一下,发现对于一个圆,它投影完还是一个半径不变的圆. 定义树的轴在投影平面上经过的点为原点,定一个正方向,建立平面直角坐标系, 能发现,对于一个半径为\(r\),高度 ...

  8. HTML DOM的学习

    请看下面的 HTML 片段: <html> <head> <title>DOM 教程</title> </head> <body> ...

  9. php的while函数

    PHP while 循环 PHP Switch PHP For 循环 PHP while 循环在指定条件为 true 时执行代码块. PHP 循环 在您编写代码时,经常需要反复运行同一代码块.我们可以 ...

  10. php的switch函数

    PHP Switch 语句 PHP If...Else PHP While 循环 switch 语句用于基于不同条件执行不同动作. Switch 语句 如果您希望有选择地执行若干代码块之一,请使用 S ...