业务系统常用开发技巧1.docx
《业务系统常用开发技巧1.docx》由会员分享,可在线阅读,更多相关《业务系统常用开发技巧1.docx(22页珍藏版)》请在冰豆网上搜索。
业务系统常用开发技巧1
1.取到表格上的某个格子,用于等表格加载完后用脚本往cell里设值;
例:
综合测评的测评方案定义的针对年级是这样搞的
2.获取选中的所有checkbox对象
varcheckboxList=Ext.query("#V_QGZX_BCTJinput:
checked[@name=cb_select_field]");
3.需要传递的参数如果包含汉字,一定要在传前编码
filter=StringURLEncode(filter);
4.弹出的模态对话框的参数传递
例如:
在做逐条审核的时候,弹出的审核页面就是一个模态对话框,通过在BDTAG上面增加一个按钮,该按钮触发一个动作,如ztsh()函数
functionztsh()//BDTAG里面,逐条审核
{
varurl="/epstar/app/template.jsp?
mainobj=SWMS/CJPXKSXT/T_CJKS_SHB&tfile=XGMRMB/SHYM";
varspyj=window.showModalDialog(url,"审批意见","dialogWidth:
400px;dialogHeight:
300px");
if(spyj=="notgoon")return;
EditField_SetValue("SHYJ",spyj);
if(EditForm_Save("T_CJKS_SHB")){
frameContents.query();//刷新页面
}
5.脚本->callservice->login_page.jsp->Service->callserviceImpl
5.1.同步:
varserviceUrl="/epstar/app/template.jsp?
mainobj=SWMS/ZHSZCPGLZXT/ZHSZCPPZ/T_ZHCP_CPDY&tfile=XGMRMB/logic_dealGrades";
varparam=[];
param["type"]="checkForCpdyQy";
param["cpdybh"]=cpdybh;
param["gradesStr"]=checkedStr;//注意前面后面参数不同
//传到后台处理
varbackStr=callService(serviceUrl,param,callback,null,null);//callback是回调函数
5.2.异步:
代码位置:
V_QGZX_BCTJ/XGMRMB/JB.jsp
例如:
functionupdateRecord(){
if(Page_GetStrLen(EditField_GetValue("XH"))>10){alert("学号长度过长");return;}
if(Page_GetStrLen(EditField_GetValue("SHYJ"))>10){alert("审核意见长度超出范围");return;}
varsURL="/epstar/app/template.jsp?
mainobj=SWMS/CJPXKSXT/V_CJKS_CJST&tfile=XGMRMB/LOGIC_CJKS";
varparam=[];
param["type"]="updateRecord";
param.WID=wid;
param["XH"]=EditField_GetValue("XH");
param["XB"]=EditField_GetValue("XB");
param["SHZT"]=EditField_GetValue("SHZT");
param["SHYJ"]=EditField_GetValue("SHYJ");
varsfkj=EditField_GetValue("SFKJ");
if(sfkj){
param["SFKJ"]=1;
}else{
param["SFKJ"]=0;
}
param["FS"]=EditField_GetValue("FS");
callService(sURL,param,ResultShow,null,null);
}
functionResultShow(xmlDocStr)
{
if(Page_GetResultXmlMessage(xmlDocStr)=="true"){
alert("提示:
保存成功");
frameMyquery.query();
window.close();
}else{
alert("提示:
失败");
}
}
注意:
同步就是要等一个事件完成之后才能下一个;异步就是同时可以完成几个事件
6.Logic页面的模式化写法
例见V_QGZX_GWPS/XGMRMB/logic_gwps.jsp
例如:
<%@pageimport="com.wiscom.system.log.Logger"%>
<%@pageimport="java.io.PrintWriter"%>
<%@pageimport="com.wiscom.epstar.system.util.XmlMessage"%>
<%@pagecontentType="text/html;charset=utf-8"pageEncoding="utf-8"%>
<%@pageimport="com.wiscom.app.swms.service.factory.GenericFactory,com.wiscom.app.swms.service.CjksService"%>
<%@includefile="/app/_head.jsp"%>
<%
Stringtype=request.getParameter("type");
Stringwid=request.getParameter("WID");
Stringxh=request.getParameter("XH");
Stringxb=request.getParameter("XB");
Stringshzt=request.getParameter("SHZT");
Stringshyj=request.getParameter("SHYJ");
Stringsfkj=request.getParameter("SFKJ");
Stringfs=request.getParameter("FS");
CjksServicesbiService=(CjksService)com.wiscom.app.swms.service.factory.GenericFactory.getServiceInstance(CjksService.class);
XmlMessagexm=newXmlMessage();
PrintWriterwriter=response.getWriter();
try{
if("updateRecord".equals(type)){
xm.setMessage(sbiService.updateRecord(wid,xh,xb,shzt,shyj,sfkj,fs));
xm.setType(XmlMessage.TYPE_SUCCESS);
}
}catch(Exceptione){
Logger.debug("&&&&&&&&&&&&&&&&&&&&&&&&&"+e.getMessage());
xm.setType(XmlMessage.TYPE_FAILURE);
xm.setMessage(e.getMessage());
}finally{
Logger.debug("88888888888888888888888");
response.setContentType("text/xml;charset=utf-8");
writer.write(xm.toString());writer.close();
}
%>
注意:
字段是表和视图中共有的字段
7.Service的几个注意事项
命名规范:
HxfService
function名称与type及logic中调用的方法名称一样。
实现体有两种:
基于orcale及基于DB2
logic中对于service的定义就是从配置文件中读取它所对应的实现体。
同步异步的概念。
开发规范:
一个子系统一个service;一个模块一个logic
7.1.命名不要全大写,如ZXJFFService
7.2.一个子系统不要定义多于3个的Service
7.3.尽量在service中屏蔽orcle和db2的差异
具体地:
1.epstar里的固定长度对应的db2里的char,oracle里的varchar,不要用固定长度,字符型字段统一使用epstar客户端建模工具里的"文本:
可变长度";
2.db2里的sequence一般最大值为9位9,可通过将sequence类型指定为bigint使db2支持更多位的sequence(有兴趣可参看附件).oracle默认方式可建30位9的sequence.
3.db2里没有createorreplace语句(oracle里有),所以在写初始化脚本的时候,不要写createorreplace
而要先删再建:
droptablev_ss_fjxxst;
createviewv_ss_fjxxstas...
4.db2视图里不能直接用orderby语句,而oracle可以直接使用,那么db2里在使用orderby时,应该在子句里
用orderby,如:
select*from(selecta,b,cfromtable1orderbya)astab
5.db2里的SQL要求比较严格,字符型字段值不能与数字比较,数字型字段不能与字符串比较,否则会出错,如XH是varchar类型,那么在select*fromt_xsjbxx_xsjbbwherexh=1是会报错的,因为1是整数
7.4.方法名和变量名第一个单词的首字母必须小写,其后单词的首字母必须大写
如:
updateRecord
8.多TAB页的规范做法
可参考V_QGZX_GWSHTJ/XGMRMB/view_mainFrame.jsp
9.获取sequence
getSeqNextValue("SEQ_ZHCP_CPJGXX");
10.只允许输入整数、n位小数的正则表达式
10.1.利用建模工具
10.2.利用JS脚本
例见T_ZHCP_CPJGXX/XGMRMB/JB.jsp,35行附近
if(!
/^[-]?
\d*[.]?
\d*$/.test(document.getElementById("Z").value.trim()))
{
alert("提示:
只能输入数字,请重新输入!
");
returnfalse;
}
//判断不能超值
11.移花接木
<%
((ContextParameters)request.getAttribute(ContextParameters.ID_STORED_IN_REQUEST)).setParamValue(ContextParameters.PARAM_TEMPLATE_FILE,"");
%>
参考:
V_QGZX_SGZST/XGMRMB/XJ_BGTAG.jsp
12.判断某表中某字段是否有某值
说明:
如勤工助学申请岗位时,岗位要求不允许黑名单中的学生申请,因此当学生A去申请该岗位时,会去黑名单表中找是否有该学生,如果有,不给申请。
//获取某表中符合条件的记录条数
checkNumber(objPath,filter);
参数:
objPath表名或业务对象路径
Filter是where后面的过滤条件
例:
参见V_QGZX_GWPS/XGMRMB/JB.jsp中的checkAppliable方法
functioncheckAppliable(gwbm,xh){
//判断是否困难生、是否需要上岗证、是否允许一人多岗、是否受黑名单控制
//查出岗位的限制
vargwxxDOM=Page_GetServerDataXmlCP("SWMS/QGZXGLZXT/QGZXGL/T_QGZX_GZGW","SQKSRQ,SQJSRQ,SFZZDKNS,SFXYSGZ,SFYXYRDG,SFSHMDXZ","GWBM="+gwbm,"","");
//检查是否在申请期间
varsqksrq=getFieldValue(gwxxDOM,0,"SQKSRQ");
varsqjsrq=getFieldValue(gwxxDOM,0,"SQJSRQ");
sqksrq=sqksrq.substring(0,10);
sqjsrq=sqjsrq.substring(0,10);
//alert(sqksrq+":
"+curDate+":
"+sqjsrq);
if(sqksrq>curDate||sqjsrqalert("提示:
该岗位不在申请时间内,审批无法通过!
");
returnfalse;
}
//是否需要检查困难生SFZZDKNS
if(getFieldValue(gwxxDOM,0,"SFZZDKNS")=="1"){
//查看该学生是否困难生,不是困难生者,返回false,申请失败
if(!
isKns(xh))
{
alert("提示:
不是困难生,审批无法通过!
");
returnfalse;
}
}
//是否需要检查上岗证SFXYSGZ
if(getFieldValue(gwxxDOM,0,"SFXYSGZ")=="1"){
//查看该学生是否有上岗证,如果没有上岗证,返回false,申请失败
if(checkNumber("SWMS/QGZXGLZXT/QGZXGL/T_QGZX_SGZ","XH='"+xh+"'")*1==0)
{
alert("提示:
没有上岗证,审批无法通过!
");
returnfalse;
}
}
//是否需要检查受黑名单控制SFSHMDXZ
if(getFieldValue(gwxxDOM,0,"SFSHMDXZ")=="1"){
if(checkNumber("SWMS/QGZXGLZXT/QGZXGL/T_QGZX_HMD","XH='"+xh+"'","XH")*1>=1)
{
alert("提示:
被加入黑名单,审批无法通过!
");
returnfalse;
}
}
//是否需要检查允许一人多岗SFYXYRDG
if(getFieldValue(gwxxDOM,0,"SFYXYRDG")!
="1"){
if(checkNumber("SWMS/QGZXGLZXT/QGZXGL/T_QGZX_XY","SHZT=99andgwbmin(selectgwbmfromt_qgzx_gzgwt_gzgwwheret_gzgw.sfyxyrdg=0)andXH='"+xh+"'")*1>0)
{
alert("提示:
已有成功申请的记录,审批无法通过!
");
returnfalse;
}
}
returntrue;
}
13.获取某表中符合条件的记录的某些字段值
getFormData()方法
//查询
functionquery(){
vardata=Epx.getFormData('T_CJKS_SHB');
varfilter="filter=T_CJKS_SHB:
1=1";
for(fieldindata)
{
if(data[field])
{
if(field=='mainobj'||field=='mainobjidtype'||field=='editfield_wid'||field=='taglib_userid')continue;
//用like查询的字段
if(field=='XM'||field=='XH')
filter+="and"+field+"like'%"+replaceSingleQuotesByDouble(data[field])+"%'";
else
filter+="and"+field+"='"+replaceSingleQuotesByDouble(data[field])+"'";
}
}
filter=StringURLEncode(filter);
varurl="/epstar/app/template.jsp?
mainobj=SWMS/CJPXKSXT/T_CJKS_SHB&tfile=XGMRMB/BGTAG&page=T_CJKS_SHB:
curpage=1,pagesize=20";
parent.main.location.href=url+"&"+filter;
}
14.QueryString助你获取URL中的参数
例:
参见T_ZHCP_KTSZ/XGMRMB/BGTAG..jsp,配合DBTAG.jsp
varrequest=newQueryString();
BDTAG中:
<%
Stringxg=request.getParameter("xg");
java.lang.BooleantextOnly=java.lang.Boolean.FALSE;
if(xg!
=null&&xg.equals("1"))
textOnly=java.lang.Boolean.TRUE;;
java.lang.BooleancprReadOnly=java.lang.Boolean.FALSE;
if(xg!
=null&&xg.equals("2"))
cprReadOnly=java.lang.Boolean.TRUE;
%>
15.使按钮失效
15.1.Epstar的按钮
ToolButton_SetDisable(”按钮ID”);
15.2.学工中ext扩展过的按钮
toolbar_T_XSJBXX_XSJBB.items.get("btn_chosen").disable();
16.加入等待进度条使慢可以接受
Epx.showProgressDialog();//显示进度条
Epx.hideProgressDialog();//隐藏进度条
17.借鸡生蛋(保存数据到另外一个业务对象)
18.种树
18.1.树一:
18.2.树二:
19.配流程
显示: