01 取变量赋值
01.1正确的赋值(数组下标从1开始)
左值 右值 右值类别
oOrg/orgid oaOmEmporg[1]/omOrganization/orgid 变量
01.2错误的赋值
左值 右值 右值类别
sTemp (空,不写任何东西) 常量
01.2正确的赋值
左值 右值 右值类别
sTemp "" 表达式
02 取表达式赋值
02.1字符串传化为int的表达式
左值 右值 右值类别
iOrgid oOmEmployee.getInt("orgid") 表达式
02.2字符串赋值的表达式
左值 右值 右值类别
sSeq 9999.1 常量
oOrg/orgseq sSeq+oOrg.get("orgid")+"." 表达式
02.3表达式赋值
左值 右值 右值类别
iOrglevel getInt("orglevel")+1 表达式
sOrgseq to.getString("orgseq")+oOrg.getString("orgid")+"." 表达式
03 遍历对象/赋值
左值 右值 右值类别
ctAcIdentity/_expr[1]/acOperator.operatorid ... ...
f:ctOrg/_expr[1]/omOrganization.orgid ... ...
ctPosi/_expr[10]/omOrganization.orgid ... ...
04 查找第一级机构的注意点
oOrg/omOrganization=null(表达式) ---无效,它会将所有数据查询出来(带自关联)
oOrg/omOrganization/orgid=null(表达式) ---无效,它会将所有数据查询出来(带自关联)
oOrg/orglevel=1(常量) ---正确
05 取Session值
05.1从页面流中取(尤其在集群环境中,必须这样使用)
s:userObject/attributes/empid
<h:hidden name="oEmp/empid" property="userObject/attributes/empid" scope="s"/>
<h:text property="empid" scope="s"/>
<h:text property="operatorid" scope="s"/>
<h:text property="userObject/userId" scope="s"/>
05.2从MUO中取(禁止在集群环境中使用)
m:empid
06 养成定义变量类型的习惯
逻辑构件中,使用不定义的变量是,默认该变量的类型为java.util.HashMap, 故应先定义变量类型的习惯
07 使用联合主键的注意点
联合主键(not null),在expandEntity时,必须所有的KEY列都赋值,否则系统不报错、结果也不对
08 处理BUG的一种方式
例如: 更新职工机构关系
用updateEntityByTemplate报
[FlowName=com.primeton.abframe.organization.OrgManager.test.biz][activity name=更新职工机构关系][activity id=invokePojo1][exception=com.primeton.das.entity.impl.hibernate.QueryException: could not resolve property: omEmployee1.omOrganization.orgid of: com.primeton.abframe.abfdataset.OmEmporg]
[eos-default][2008-08-16 10:59:01,687][ERROR][com.primeton.ext.engine.core.processor.AbstractBizProcessor][Line:217]
java.lang.reflect.InvocationTargetException
最后用deleteEntity+insertEntity代替
体会: 该BUG在后续版本中已改, 但时刻记住采用逆向思维的工作方式
09 [问题]:项目abframe缺少必要的源文件"com.primetom.eos.test/src"
[解决]:在透视图“资源”导航器中,找到.classpath文件, 将包含com.primetom.eos.test/src的行去掉
10 [问题]:提示 工程[abframe]对应的Web应用eos-default非法,请检查你的Web Server配置
[解决]:点选工程(abframe)-->右键-->属性-->EOS项目属性-->检查、修改各项配置
11 [问题]:Studio运行速度慢
11.1更改eclipse目录下eclipse.ini的参数
-vmargs
-Xms64m -->-Xms256m
-Xmx512m -->-Xmx768m
-XX:PermSize=64M
-XX:MaxPermSize=128M
-XX:+UseParallelGC
11.2Studio-->自动构建-->去掉勾选. 实时编译会影响开发效率, 故先禁止自动构建, 等到调式时手工触发进行构建.
12 将左外连接的ORACLE语句 改成标准SQL/92语法的语句
[ORACLE语句]
select rf.*,f.funcname,a.appname,fg.funcgroupname,pr.partytype,pr.partyid
from ac_rolefunc rf,ac_function f,ac_application a,ac_funcgroup fg,om_partyrole pr
where rf.funccode=f.funccode(+) and rf.appid=a.appid(+) and rf.funcgroupid=fg.funcgroupid(+) and rf.roleid=pr.roleid
[SQL/92标准]
select rf.*,f.funcname,a.appname,fg.funcgroupname,pr.partytype,pr.partyid
from ac_rolefunc rf left outer join ac_function f
on rf.funccode=f.funccode
left outer join ac_application a
on rf.appid=a.appid
left outer join ac_funcgroup fg
on rf.funcgroupid=fg.funcgroupid
inner join om_partyrole pr
on rf.roleid=pr.roleid
13 命名SQL和逻辑流构件Criteria中的IN的使用的区别
13.1对命名SQL中的IN传递变量
<parameter javaType="String" jdbcType="VARCHAR" property="mngrole"/>
...
<select id="..." parameterClass="commonj.sdo.DataObject" resultMap="resultMap2">
select ...
from ac_role r
where r.roleid in($mngrole$)
</select>
...
则,在逻辑流中,变量mngrole的值应格式化成'1','2','3'
注意:不能写成('1','2','3')或“'1','2','3'” 等其它方式
13.2updateEntityByCriteriaEntity等(包含Criteria的构件)中的IN操作
变量mngrole的值应格式化成1,2,3
注意:不能写成'1','2','3'等其它方式
14 Datacell的行列的操作(行号,列号都从0开始)
/**
* 根据行索引和列索引获得单元格的方法.cellIndex也可以写单元格的name名称.
* @param {Object} rowIndex
* @param {Object} cellIndex
*/
var dchavenot = $id("dcHavenot");
dchavenot.afterRefresh = function(){
var len = dchavenot.getPageRowCount(); //getTotalRowCount
for (var r=0; r<len; r++){
var cell4 = dchavenot.getCell(r,3); //行号,列号都从0开始, 但列也可写单元格的name名称
dchavenot.setCellValue(cell4, $name("sPartytype").value);
var cell5 = dchavenot.getCell(r,4);
dchavenot.setCellValue(cell5, $name("iPartyid").value);
}
}
15 Datacell中增加定制按钮
<r:toolbar tools="nav,pagesize,custom" location="top" />
......
//写js
//增加"直接授予的权限"Datacell定制BUTTON
$id("dcOperfunc").setCustomTool("<input type='button' value='新增' οnclick='addRec();'>");
......
function addRec() {
......
}
16 Datacell中插入一行并赋值
//获得人员机构当前活动行,把lookUp返回值设置到datacell的单元格中
function returnFuncOrg(arg){
var lookup = $id("lookupID");
lookup.value = arg[1];
lookup.displayValue = arg[1];
var row = dcemporg.getActiveRow();
var entity = dcemporg.getEntity(row);
entity.setProperty("omOrganization/orgid",arg[0]);
entity.setProperty("omOrganization/orgname",arg[1]);
entity.setProperty("omOrganization/orgtype", arg[2]);
entity.setProperty("omOrganization/status", arg[3]);
entity.setProperty("omEmployee/empid",$name("oEmp/empid").value );
entity.setProperty("ismain", "n");
dcemporg.refreshRow(row);
}
17 Datacell中对当前行赋初始值
17.1例1
dcempposi.afterAdd = function(row) {
var entity=dcempposi.getEntity(row);
entity.setProperty("omEmployee/empid",$name("oEmp/empid").value );
dcempposi.refreshRow(row);
return true;
}
17.2例2
var myBizDictCell=$id("bizDictCell");
myBizDictCell.afterAdd=afterAddBizDict;
function afterAddBizDict(row){
var entity=myBizDictCell.getEntity(row);
entity.setProperty('dicttypeid',myBizTypeCell.getEntity(myBizTypeCell.activeRow).getProperty("dicttypeid"));
myBizDictCell.refreshRow(row);
return true;
}
18 Datacell的列只能显示逻辑流对象的前2级(层)的属性,要显示第3级及以后的属性,可通过fillCodeDesc构件将其转化到第1级。
下例中,queryOperfunc.biz的查询结果oaOperfunc[]/acFunction/acFuncgroup/acApplication/appname在页面中显示不出来,
只能在逻辑流中用fillCodeDesc构件将oaOperfunc[]/acFunction/acFuncgroup/acApplication/appname转化成oaOperfunc[]/appname,
然后才能显示出。
<r:datacell id="dcOperfunc" rowStyleClass="rowclass2"
rowEvenStyleClass="rowclass1" showIndex="false"
queryAction="org.gocom.abframe.organization.employee.EmpManager.queryOperfunc.biz"
paramFormId="qfOperfunc" xpath="oaOperfunc" width="100%" height="50"
pageSize="10" pageSizeList="10,20,30" submitAction="">
<r:toolbar tools="nav,custom,info" location="botton" />
<r:field fieldName="acFunction/funcname" label="<%=pnOperfunc_acFunction_funcname%>" />
<r:field fieldName="funcgroupname" label="<%=pnOperfunc_funcgroupname%>" />
<r:field fieldName="appname" label="<%=pnOperfunc_appname%>" />
<r:field fieldName="authtype" label="<%=pnOperfunc_authtype%>" allowModify="false">
<d:select dictTypeId="ABF_YESORNO" />
</r:field>
<r:field fieldName="startdate" label="<%=pnOperfunc_startdate%>" />
<r:field fieldName="enddate" label="<%=pnOperfunc_enddate%>" />
</r:datacell>
19 Datacell页面接收传入参数的问题
19.1以下方法不能用
<h:hidden name="oEmp/empid" property="iEmpid"/>
19.2以下方法能用
<input type="hidden" name="oEmp/empid" value='<b:write property="iEmpid" propertyType="parameter"/>'/>
20 取Datacell的总行数
var len = $id("dcHave").table.tBodies[0].rows.length;
21 取缺省生效日期,失效日期,作为Datacell中的缺省值
/*****
<%
String sToday;
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd");
java.util.Date dt = new java.util.Date();
sToday = formatter.format(dt);
%>
******/
//取缺省生效日期(当天),失效日期(下个月),格式yyyy-mm-dd
var dt,day1="",day2="";
dt = new Date();
day1 += dt.getFullYear()+"-";
day2 += (dt.getFullYear()+1)+"-";
if ((dt.getMonth() + 1)<10) {
day1 += "0"+(dt.getMonth() + 1)+"-";
day2 += "0"+(dt.getMonth() + 1)+"-";
}else{
day1 += (dt.getMonth() + 1)+"-";
day2 += (dt.getMonth() + 1)+"-";
}
if (dt.getDate()<10 ){
day1 += "0"+dt.getDate();
day2 += "0"+dt.getDate();
}else{
day1 += dt.getDate();
day2 += dt.getDate();
}
22 动态树的初始化
function getInitParam()
{
//alert($name("sOrgname").value);
$id("orgTree").getRootNode().setText($name("sOrgname").value);
return "<oParentOrg><orgid>"+$name("iOrgid").value+"</orgid></oParentOrg>" ;
}
23 取静态树的选中节点并返回(lookup方式调用)
场景:一棵静态树,多根节点treeNode的xpath="oaOrg",子节点xpath="oaOrgsub"。要求将选中的所有节点的orgid用逗号连接,将选中的所有节点的orgname用逗号连接,返回两连接串。
页面:http://127.0.0.1:8080/eos-default/organization/org/mngorg_assign.jsp
JS代码:
<input type="button" value="返回" οnclick="javascript:rtnSelectVal();">
.......
function rtnSelectVal() {
var treeObj = $id("mngorgTree");
var orgChecked=treeObj.getCheckedList("org");
var orgsubChecked= treeObj.getCheckedList("orgsub");
//alert(orgsubChecked.list[0].getProperty("orgid"));
//alert(orgsubChecked.getLength());
var sorgid="";
var sorgname="";
var len =-1;
len = orgChecked.getLength();
for( var i = 0 ; i < len; i++ ) {
sorgid+=orgChecked.list[i].getProperty("orgid")+",";
sorgname+=orgChecked.list[i].getProperty("orgname")+",";
}
len = orgsubChecked.getLength();
for( var i = 0 ; i < len; i++ ) {
sorgid+=orgsubChecked.list[i].getProperty("orgid")+",";
sorgname+=orgsubChecked.list[i].getProperty("orgname")+",";
}
sorgid = sorgid.substr(0, (sorgid.length-1));
sorgname = sorgname.substr(0, (sorgname.length-1));
alert(sorgid);
alert(sorgname);
returnValue = [ sorgid,sorgname ];
window.close();
}
24 刷新树节点
24.1在调用节点处刷新(如:右键新增下级机构)
function addSubOrg(node){
sUrl=contextPath+"/organization/org/org_add.jsp";
var argument = node.getProperty("orgid")+"-"+node.getProperty("orglevel")+"-"+node.getProperty("orgseq");
showModalCenter(sUrl,argument,callBack,570,400,"<b:message key='orgSubMaintain_l_menu_addSubOrg'/>");
node.reloadChild();
}
24.2在被调用页面返回时触发刷新动作(如:在界面右边的Tab页下点弹出式新增机构,新增成功后要返回主页面,同时刷新左边的树节点)
function addRec2() {
var sUrl=contextPath+"/organization/org/org_add.jsp?pid="+$name("iOrgid").value;
var argument = $name("iOrgid").value+"-"+$name("iOrglevel").value+"-"+$name("sOrgseq").value ;
showModalCenter(sUrl,argument,callBack,600,400,"<%=addOrg %>");
}
function callBack(returnValue) {
parent.parent.orgTree.getSelectNode().reloadChild();
window.location.href=window.location.href+"&";
}
25 用ComboSelect,并实现页面的初始化(过滤)
<td class="form_label">
上级机构
</td>
<td colspan="1">
<%--
<h:text property="oOrg/omOrganization/orgid" readonly="true"/>
--%>
<r:comboSelect id="countryList" name="oOrg/omOrganization/orgid" disabled="true"
queryAction="com.primeton.abframe.organization.organization.OrgManager.queryOrgidname.biz"
textField="orgname" valueField="orgid" xpath="oaOrgidname" width="100" initParamFunc="initComboSelectParam"
/>
</td>
............................
function initComboSelectParam(){
return "<oOrgidname><orgid>"+$name("iParentorgid").value+"</orgid></oOrgidname>" ;
}
//http://127.0.0.1:8080/eos-default/organization/org/org_add.jsp
26 弹出式窗口实现新增操作
26.1从查询结果页面中发起:
http://127.0.0.1:8080/eos-default/organization/emp/emp_query_result.jsp
主要调用信息:
<%
String contextPath = request.getContextPath();
%>
......
function addRec2() {
var sUrl="<%=contextPath%>"+"/organization/emp/empopr_add.jsp";
showModalCenter(sUrl,null,callBack,800,600,"新增人员信息");
}
function callBack(returnValue) {
window.location.href=window.location.href+"&"; //保存原有tab输入参数
}
26.2新增的弹出页面
http://127.0.0.1:8080/eos-default/organization/emp/empopr_add.jsp
处理逻辑:用ajax方式调用,并用window.close()关闭
26.3优点:不用多增加一个子页面流
27 弹出式窗口实现修改操作
27.1从查询结果页面中发起:
http://127.0.0.1:8080/eos-default/organization/emp/emp_query_result.jsp
主要调用信息:
function mdfRec2() {
var g= $id('group1');
if(g.getSelectLength()==1){
var parm="iOrgid="+g.getSelectParams("oaOrgEmpQry/inorgid")+"&iEmpid="+g.getSelectParams("oaOrgEmpQry/empid")+"&lOperatorid="+g.getSelectParams("oaOrgEmpQry/operatorid");
var sUrl="com.primeton.abframe.organization.employee.empOprAndOtherModify.flow?"+parm;
showModal(sUrl,null,callBack,700,600,200,50,"修改人员信息");
}else{
alert("请选择一行记录!");
return;
}
}
function callBack(returnValue) {
window.location.href=window.location.href+"&";
}
27.2修改的弹出页面
http://127.0.0.1:8080/eos-default/organization/emp/empopr_add.jsp
处理信息:
<input type="button" value="保存" οnclick="javascript:mdfEmpOpr();window.close();">
.......
function mdfEmpOpr(){
var frm = $name("dataform1");
frm.submit();
}
处理逻辑:页面流方式
27.3优点/缺点:必须增加一个子页面流,主要是完成修改前的查询
28 showModalCenter中传递字符串
var sUrl="<%=contextPath%>"+"/organization/emp/emp_power_rightkey_maintain.jsp";
var argument = node;
//var argument = node.getProperty("empid")+"-"+node.getProperty("operatorid")+"-"+node.getProperty("orgid")+"-"+node.getProperty("position");
showModalCenter(sUrl,argument,callBack,570,450,"维护人员权限");
29 showModalCenter中传递对象
function maintainPowerEmp2(node){
var sUrl=contextPath+"/organization/emp/emp_power_rightkey_maintain.jsp";
var argument = node; //传递树节点对象
showModalCenter(sUrl,argument,callBack,570,450,"<b:message key='orgSubMaintain_l_menu_maintainPowerEmp2'/>");
}
function callBack(returnValue) {
window.location.href=window.location.href+"&";
}
30 取主调页面传过来的参数
在被调页面中的处理如下,
function init(){
//取得主页面传过来的参数
var argument = window["dialogArguments"];
var pos = argument.indexOf("-");
alert(argument.substr(0, pos-1));
$name('oEmpposi/omPosition/positionid').value= argument.substr(0, pos);
alert(argument.substr(pos+1));
$name('oEmporg/omOrganization/orgid').value= argument.substr(pos+1);
}
31 页面流中传递汉字变成乱码的问题
改D:\eos6la2\apache-tomcat-5.5.20\conf\server.xml文件,加URIEncoding="GBK", 或加URIEncoding="UTF-8"。如下示,
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="5" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>
32 调试(尤其是对命名SQL调试)时,随时跟踪SQL日志
SQL日志存放位置D:\eos6la2\eosserver\working\eos-default\logs\eos-engine.log
33 Ajax调用的写法
var ajax = new Ajax("com.primeton.abframe.organization.organization.OrgManager.removeOrg.biz");
ajax.addParam("oRmvOrg/orgid", node.getProperty("orgid") );
ajax.addParam("oRmvOrg/orgseq", node.getProperty("orgseq") );
ajax.submit();
var rtnNode = ajax.getResponseXMLDom();
if( rtnNode ) {
if( ajax.getValue("root/data/iRtn") == 0 )
alert( "操作成功!" );
else {
alert( "操作失败!" );
}
} else {
alert("操作失败!");
}
34 弹出页面选择并返回值的实现(如: 选择上级岗位)
position_add.jsp
........
<td class="form_label">
上级岗位
</td>
<td colspan="1">
<w:lookup property="parentPosName" name="parentPosID" readonly="true" displayProperty="parentPosName" dialogTitle="选择上级岗位" width="370" height="550" lookupUrl="/organization/position/position_tree.jsp" onReturnFunc="lookupRetFun"></w:lookup>
</td>
.........
......
function lookupRetFun( arg ) {
return true;
}
35 截字符串
String s=".0.1.3.511."; //最后返回".0.1.3."
int i=s.lastIndexOf('.'); //=10
s=s.substring(0, s.lastIndexOf('.'));
s=s.substring(0, s.lastIndexOf('.')+1);
36 简单页面校验的写法
<h:text property="acmenu/menuname" validateAttr="allowNull=false;maxLength=40"/>
<h:text property="acmenu/displayorder" validateAttr="type=number;minValue=-32768;maxValue=32767" />
37 保存后,关闭本页面(弹出窗口)的处理方式
<l:equal property="iRtn" targetValue="0" compareType="number" scope="request" >
<script>
//window['returnValue'] = $id("function_code").value;
alert("保存成功!");
window.close();
</script>
</l:equal>
<l:lessThan property="iRtn" targetValue="0" compareType="number" scope="request">
<script>
alert("保存失败!");
</script>
</l:lessThan
01.1正确的赋值(数组下标从1开始)
左值 右值 右值类别
oOrg/orgid oaOmEmporg[1]/omOrganization/orgid 变量
01.2错误的赋值
左值 右值 右值类别
sTemp (空,不写任何东西) 常量
01.2正确的赋值
左值 右值 右值类别
sTemp "" 表达式
02 取表达式赋值
02.1字符串传化为int的表达式
左值 右值 右值类别
iOrgid oOmEmployee.getInt("orgid") 表达式
02.2字符串赋值的表达式
左值 右值 右值类别
sSeq 9999.1 常量
oOrg/orgseq sSeq+oOrg.get("orgid")+"." 表达式
02.3表达式赋值
左值 右值 右值类别
iOrglevel getInt("orglevel")+1 表达式
sOrgseq to.getString("orgseq")+oOrg.getString("orgid")+"." 表达式
03 遍历对象/赋值
左值 右值 右值类别
ctAcIdentity/_expr[1]/acOperator.operatorid ... ...
f:ctOrg/_expr[1]/omOrganization.orgid ... ...
ctPosi/_expr[10]/omOrganization.orgid ... ...
04 查找第一级机构的注意点
oOrg/omOrganization=null(表达式) ---无效,它会将所有数据查询出来(带自关联)
oOrg/omOrganization/orgid=null(表达式) ---无效,它会将所有数据查询出来(带自关联)
oOrg/orglevel=1(常量) ---正确
05 取Session值
05.1从页面流中取(尤其在集群环境中,必须这样使用)
s:userObject/attributes/empid
<h:hidden name="oEmp/empid" property="userObject/attributes/empid" scope="s"/>
<h:text property="empid" scope="s"/>
<h:text property="operatorid" scope="s"/>
<h:text property="userObject/userId" scope="s"/>
05.2从MUO中取(禁止在集群环境中使用)
m:empid
06 养成定义变量类型的习惯
逻辑构件中,使用不定义的变量是,默认该变量的类型为java.util.HashMap, 故应先定义变量类型的习惯
07 使用联合主键的注意点
联合主键(not null),在expandEntity时,必须所有的KEY列都赋值,否则系统不报错、结果也不对
08 处理BUG的一种方式
例如: 更新职工机构关系
用updateEntityByTemplate报
[FlowName=com.primeton.abframe.organization.OrgManager.test.biz][activity name=更新职工机构关系][activity id=invokePojo1][exception=com.primeton.das.entity.impl.hibernate.QueryException: could not resolve property: omEmployee1.omOrganization.orgid of: com.primeton.abframe.abfdataset.OmEmporg]
[eos-default][2008-08-16 10:59:01,687][ERROR][com.primeton.ext.engine.core.processor.AbstractBizProcessor][Line:217]
java.lang.reflect.InvocationTargetException
最后用deleteEntity+insertEntity代替
体会: 该BUG在后续版本中已改, 但时刻记住采用逆向思维的工作方式
09 [问题]:项目abframe缺少必要的源文件"com.primetom.eos.test/src"
[解决]:在透视图“资源”导航器中,找到.classpath文件, 将包含com.primetom.eos.test/src的行去掉
10 [问题]:提示 工程[abframe]对应的Web应用eos-default非法,请检查你的Web Server配置
[解决]:点选工程(abframe)-->右键-->属性-->EOS项目属性-->检查、修改各项配置
11 [问题]:Studio运行速度慢
11.1更改eclipse目录下eclipse.ini的参数
-vmargs
-Xms64m -->-Xms256m
-Xmx512m -->-Xmx768m
-XX:PermSize=64M
-XX:MaxPermSize=128M
-XX:+UseParallelGC
11.2Studio-->自动构建-->去掉勾选. 实时编译会影响开发效率, 故先禁止自动构建, 等到调式时手工触发进行构建.
12 将左外连接的ORACLE语句 改成标准SQL/92语法的语句
[ORACLE语句]
select rf.*,f.funcname,a.appname,fg.funcgroupname,pr.partytype,pr.partyid
from ac_rolefunc rf,ac_function f,ac_application a,ac_funcgroup fg,om_partyrole pr
where rf.funccode=f.funccode(+) and rf.appid=a.appid(+) and rf.funcgroupid=fg.funcgroupid(+) and rf.roleid=pr.roleid
[SQL/92标准]
select rf.*,f.funcname,a.appname,fg.funcgroupname,pr.partytype,pr.partyid
from ac_rolefunc rf left outer join ac_function f
on rf.funccode=f.funccode
left outer join ac_application a
on rf.appid=a.appid
left outer join ac_funcgroup fg
on rf.funcgroupid=fg.funcgroupid
inner join om_partyrole pr
on rf.roleid=pr.roleid
13 命名SQL和逻辑流构件Criteria中的IN的使用的区别
13.1对命名SQL中的IN传递变量
<parameter javaType="String" jdbcType="VARCHAR" property="mngrole"/>
...
<select id="..." parameterClass="commonj.sdo.DataObject" resultMap="resultMap2">
select ...
from ac_role r
where r.roleid in($mngrole$)
</select>
...
则,在逻辑流中,变量mngrole的值应格式化成'1','2','3'
注意:不能写成('1','2','3')或“'1','2','3'” 等其它方式
13.2updateEntityByCriteriaEntity等(包含Criteria的构件)中的IN操作
变量mngrole的值应格式化成1,2,3
注意:不能写成'1','2','3'等其它方式
14 Datacell的行列的操作(行号,列号都从0开始)
/**
* 根据行索引和列索引获得单元格的方法.cellIndex也可以写单元格的name名称.
* @param {Object} rowIndex
* @param {Object} cellIndex
*/
var dchavenot = $id("dcHavenot");
dchavenot.afterRefresh = function(){
var len = dchavenot.getPageRowCount(); //getTotalRowCount
for (var r=0; r<len; r++){
var cell4 = dchavenot.getCell(r,3); //行号,列号都从0开始, 但列也可写单元格的name名称
dchavenot.setCellValue(cell4, $name("sPartytype").value);
var cell5 = dchavenot.getCell(r,4);
dchavenot.setCellValue(cell5, $name("iPartyid").value);
}
}
15 Datacell中增加定制按钮
<r:toolbar tools="nav,pagesize,custom" location="top" />
......
//写js
//增加"直接授予的权限"Datacell定制BUTTON
$id("dcOperfunc").setCustomTool("<input type='button' value='新增' οnclick='addRec();'>");
......
function addRec() {
......
}
16 Datacell中插入一行并赋值
//获得人员机构当前活动行,把lookUp返回值设置到datacell的单元格中
function returnFuncOrg(arg){
var lookup = $id("lookupID");
lookup.value = arg[1];
lookup.displayValue = arg[1];
var row = dcemporg.getActiveRow();
var entity = dcemporg.getEntity(row);
entity.setProperty("omOrganization/orgid",arg[0]);
entity.setProperty("omOrganization/orgname",arg[1]);
entity.setProperty("omOrganization/orgtype", arg[2]);
entity.setProperty("omOrganization/status", arg[3]);
entity.setProperty("omEmployee/empid",$name("oEmp/empid").value );
entity.setProperty("ismain", "n");
dcemporg.refreshRow(row);
}
17 Datacell中对当前行赋初始值
17.1例1
dcempposi.afterAdd = function(row) {
var entity=dcempposi.getEntity(row);
entity.setProperty("omEmployee/empid",$name("oEmp/empid").value );
dcempposi.refreshRow(row);
return true;
}
17.2例2
var myBizDictCell=$id("bizDictCell");
myBizDictCell.afterAdd=afterAddBizDict;
function afterAddBizDict(row){
var entity=myBizDictCell.getEntity(row);
entity.setProperty('dicttypeid',myBizTypeCell.getEntity(myBizTypeCell.activeRow).getProperty("dicttypeid"));
myBizDictCell.refreshRow(row);
return true;
}
18 Datacell的列只能显示逻辑流对象的前2级(层)的属性,要显示第3级及以后的属性,可通过fillCodeDesc构件将其转化到第1级。
下例中,queryOperfunc.biz的查询结果oaOperfunc[]/acFunction/acFuncgroup/acApplication/appname在页面中显示不出来,
只能在逻辑流中用fillCodeDesc构件将oaOperfunc[]/acFunction/acFuncgroup/acApplication/appname转化成oaOperfunc[]/appname,
然后才能显示出。
<r:datacell id="dcOperfunc" rowStyleClass="rowclass2"
rowEvenStyleClass="rowclass1" showIndex="false"
queryAction="org.gocom.abframe.organization.employee.EmpManager.queryOperfunc.biz"
paramFormId="qfOperfunc" xpath="oaOperfunc" width="100%" height="50"
pageSize="10" pageSizeList="10,20,30" submitAction="">
<r:toolbar tools="nav,custom,info" location="botton" />
<r:field fieldName="acFunction/funcname" label="<%=pnOperfunc_acFunction_funcname%>" />
<r:field fieldName="funcgroupname" label="<%=pnOperfunc_funcgroupname%>" />
<r:field fieldName="appname" label="<%=pnOperfunc_appname%>" />
<r:field fieldName="authtype" label="<%=pnOperfunc_authtype%>" allowModify="false">
<d:select dictTypeId="ABF_YESORNO" />
</r:field>
<r:field fieldName="startdate" label="<%=pnOperfunc_startdate%>" />
<r:field fieldName="enddate" label="<%=pnOperfunc_enddate%>" />
</r:datacell>
19 Datacell页面接收传入参数的问题
19.1以下方法不能用
<h:hidden name="oEmp/empid" property="iEmpid"/>
19.2以下方法能用
<input type="hidden" name="oEmp/empid" value='<b:write property="iEmpid" propertyType="parameter"/>'/>
20 取Datacell的总行数
var len = $id("dcHave").table.tBodies[0].rows.length;
21 取缺省生效日期,失效日期,作为Datacell中的缺省值
/*****
<%
String sToday;
java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd");
java.util.Date dt = new java.util.Date();
sToday = formatter.format(dt);
%>
******/
//取缺省生效日期(当天),失效日期(下个月),格式yyyy-mm-dd
var dt,day1="",day2="";
dt = new Date();
day1 += dt.getFullYear()+"-";
day2 += (dt.getFullYear()+1)+"-";
if ((dt.getMonth() + 1)<10) {
day1 += "0"+(dt.getMonth() + 1)+"-";
day2 += "0"+(dt.getMonth() + 1)+"-";
}else{
day1 += (dt.getMonth() + 1)+"-";
day2 += (dt.getMonth() + 1)+"-";
}
if (dt.getDate()<10 ){
day1 += "0"+dt.getDate();
day2 += "0"+dt.getDate();
}else{
day1 += dt.getDate();
day2 += dt.getDate();
}
22 动态树的初始化
function getInitParam()
{
//alert($name("sOrgname").value);
$id("orgTree").getRootNode().setText($name("sOrgname").value);
return "<oParentOrg><orgid>"+$name("iOrgid").value+"</orgid></oParentOrg>" ;
}
23 取静态树的选中节点并返回(lookup方式调用)
场景:一棵静态树,多根节点treeNode的xpath="oaOrg",子节点xpath="oaOrgsub"。要求将选中的所有节点的orgid用逗号连接,将选中的所有节点的orgname用逗号连接,返回两连接串。
页面:http://127.0.0.1:8080/eos-default/organization/org/mngorg_assign.jsp
JS代码:
<input type="button" value="返回" οnclick="javascript:rtnSelectVal();">
.......
function rtnSelectVal() {
var treeObj = $id("mngorgTree");
var orgChecked=treeObj.getCheckedList("org");
var orgsubChecked= treeObj.getCheckedList("orgsub");
//alert(orgsubChecked.list[0].getProperty("orgid"));
//alert(orgsubChecked.getLength());
var sorgid="";
var sorgname="";
var len =-1;
len = orgChecked.getLength();
for( var i = 0 ; i < len; i++ ) {
sorgid+=orgChecked.list[i].getProperty("orgid")+",";
sorgname+=orgChecked.list[i].getProperty("orgname")+",";
}
len = orgsubChecked.getLength();
for( var i = 0 ; i < len; i++ ) {
sorgid+=orgsubChecked.list[i].getProperty("orgid")+",";
sorgname+=orgsubChecked.list[i].getProperty("orgname")+",";
}
sorgid = sorgid.substr(0, (sorgid.length-1));
sorgname = sorgname.substr(0, (sorgname.length-1));
alert(sorgid);
alert(sorgname);
returnValue = [ sorgid,sorgname ];
window.close();
}
24 刷新树节点
24.1在调用节点处刷新(如:右键新增下级机构)
function addSubOrg(node){
sUrl=contextPath+"/organization/org/org_add.jsp";
var argument = node.getProperty("orgid")+"-"+node.getProperty("orglevel")+"-"+node.getProperty("orgseq");
showModalCenter(sUrl,argument,callBack,570,400,"<b:message key='orgSubMaintain_l_menu_addSubOrg'/>");
node.reloadChild();
}
24.2在被调用页面返回时触发刷新动作(如:在界面右边的Tab页下点弹出式新增机构,新增成功后要返回主页面,同时刷新左边的树节点)
function addRec2() {
var sUrl=contextPath+"/organization/org/org_add.jsp?pid="+$name("iOrgid").value;
var argument = $name("iOrgid").value+"-"+$name("iOrglevel").value+"-"+$name("sOrgseq").value ;
showModalCenter(sUrl,argument,callBack,600,400,"<%=addOrg %>");
}
function callBack(returnValue) {
parent.parent.orgTree.getSelectNode().reloadChild();
window.location.href=window.location.href+"&";
}
25 用ComboSelect,并实现页面的初始化(过滤)
<td class="form_label">
上级机构
</td>
<td colspan="1">
<%--
<h:text property="oOrg/omOrganization/orgid" readonly="true"/>
--%>
<r:comboSelect id="countryList" name="oOrg/omOrganization/orgid" disabled="true"
queryAction="com.primeton.abframe.organization.organization.OrgManager.queryOrgidname.biz"
textField="orgname" valueField="orgid" xpath="oaOrgidname" width="100" initParamFunc="initComboSelectParam"
/>
</td>
............................
function initComboSelectParam(){
return "<oOrgidname><orgid>"+$name("iParentorgid").value+"</orgid></oOrgidname>" ;
}
//http://127.0.0.1:8080/eos-default/organization/org/org_add.jsp
26 弹出式窗口实现新增操作
26.1从查询结果页面中发起:
http://127.0.0.1:8080/eos-default/organization/emp/emp_query_result.jsp
主要调用信息:
<%
String contextPath = request.getContextPath();
%>
......
function addRec2() {
var sUrl="<%=contextPath%>"+"/organization/emp/empopr_add.jsp";
showModalCenter(sUrl,null,callBack,800,600,"新增人员信息");
}
function callBack(returnValue) {
window.location.href=window.location.href+"&"; //保存原有tab输入参数
}
26.2新增的弹出页面
http://127.0.0.1:8080/eos-default/organization/emp/empopr_add.jsp
处理逻辑:用ajax方式调用,并用window.close()关闭
26.3优点:不用多增加一个子页面流
27 弹出式窗口实现修改操作
27.1从查询结果页面中发起:
http://127.0.0.1:8080/eos-default/organization/emp/emp_query_result.jsp
主要调用信息:
function mdfRec2() {
var g= $id('group1');
if(g.getSelectLength()==1){
var parm="iOrgid="+g.getSelectParams("oaOrgEmpQry/inorgid")+"&iEmpid="+g.getSelectParams("oaOrgEmpQry/empid")+"&lOperatorid="+g.getSelectParams("oaOrgEmpQry/operatorid");
var sUrl="com.primeton.abframe.organization.employee.empOprAndOtherModify.flow?"+parm;
showModal(sUrl,null,callBack,700,600,200,50,"修改人员信息");
}else{
alert("请选择一行记录!");
return;
}
}
function callBack(returnValue) {
window.location.href=window.location.href+"&";
}
27.2修改的弹出页面
http://127.0.0.1:8080/eos-default/organization/emp/empopr_add.jsp
处理信息:
<input type="button" value="保存" οnclick="javascript:mdfEmpOpr();window.close();">
.......
function mdfEmpOpr(){
var frm = $name("dataform1");
frm.submit();
}
处理逻辑:页面流方式
27.3优点/缺点:必须增加一个子页面流,主要是完成修改前的查询
28 showModalCenter中传递字符串
var sUrl="<%=contextPath%>"+"/organization/emp/emp_power_rightkey_maintain.jsp";
var argument = node;
//var argument = node.getProperty("empid")+"-"+node.getProperty("operatorid")+"-"+node.getProperty("orgid")+"-"+node.getProperty("position");
showModalCenter(sUrl,argument,callBack,570,450,"维护人员权限");
29 showModalCenter中传递对象
function maintainPowerEmp2(node){
var sUrl=contextPath+"/organization/emp/emp_power_rightkey_maintain.jsp";
var argument = node; //传递树节点对象
showModalCenter(sUrl,argument,callBack,570,450,"<b:message key='orgSubMaintain_l_menu_maintainPowerEmp2'/>");
}
function callBack(returnValue) {
window.location.href=window.location.href+"&";
}
30 取主调页面传过来的参数
在被调页面中的处理如下,
function init(){
//取得主页面传过来的参数
var argument = window["dialogArguments"];
var pos = argument.indexOf("-");
alert(argument.substr(0, pos-1));
$name('oEmpposi/omPosition/positionid').value= argument.substr(0, pos);
alert(argument.substr(pos+1));
$name('oEmporg/omOrganization/orgid').value= argument.substr(pos+1);
}
31 页面流中传递汉字变成乱码的问题
改D:\eos6la2\apache-tomcat-5.5.20\conf\server.xml文件,加URIEncoding="GBK", 或加URIEncoding="UTF-8"。如下示,
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="5" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>
32 调试(尤其是对命名SQL调试)时,随时跟踪SQL日志
SQL日志存放位置D:\eos6la2\eosserver\working\eos-default\logs\eos-engine.log
33 Ajax调用的写法
var ajax = new Ajax("com.primeton.abframe.organization.organization.OrgManager.removeOrg.biz");
ajax.addParam("oRmvOrg/orgid", node.getProperty("orgid") );
ajax.addParam("oRmvOrg/orgseq", node.getProperty("orgseq") );
ajax.submit();
var rtnNode = ajax.getResponseXMLDom();
if( rtnNode ) {
if( ajax.getValue("root/data/iRtn") == 0 )
alert( "操作成功!" );
else {
alert( "操作失败!" );
}
} else {
alert("操作失败!");
}
34 弹出页面选择并返回值的实现(如: 选择上级岗位)
position_add.jsp
........
<td class="form_label">
上级岗位
</td>
<td colspan="1">
<w:lookup property="parentPosName" name="parentPosID" readonly="true" displayProperty="parentPosName" dialogTitle="选择上级岗位" width="370" height="550" lookupUrl="/organization/position/position_tree.jsp" onReturnFunc="lookupRetFun"></w:lookup>
</td>
.........
......
function lookupRetFun( arg ) {
return true;
}
35 截字符串
String s=".0.1.3.511."; //最后返回".0.1.3."
int i=s.lastIndexOf('.'); //=10
s=s.substring(0, s.lastIndexOf('.'));
s=s.substring(0, s.lastIndexOf('.')+1);
36 简单页面校验的写法
<h:text property="acmenu/menuname" validateAttr="allowNull=false;maxLength=40"/>
<h:text property="acmenu/displayorder" validateAttr="type=number;minValue=-32768;maxValue=32767" />
37 保存后,关闭本页面(弹出窗口)的处理方式
<l:equal property="iRtn" targetValue="0" compareType="number" scope="request" >
<script>
//window['returnValue'] = $id("function_code").value;
alert("保存成功!");
window.close();
</script>
</l:equal>
<l:lessThan property="iRtn" targetValue="0" compareType="number" scope="request">
<script>
alert("保存失败!");
</script>
</l:lessThan