UniEAP V4 开发实践说明文档
一、开发环境搭建
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;--选择的列表对象的list的1个元素
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个所以直接get(1)
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 参考学习资料
- UniEAP_V4_Usage.doc :优先阅读的用户手册
- UniEAP Platform V4.4 FAQ.pdf
- UniEAP V4 用户手册.pdf
- UniEAP V4 Advance Form打印.pdf
- 数据展示类表格控件开发教程.pdf
- 文件上传和下载最佳实践.pdf
- 页面穿透应用指南.pdf
- 一键发布WebService.pdf
- 自动分页查询及Grid导出使用说明.pdf