您的位置:首页 > 其它

2011/6/26 功能菜单模块分析

2011-06-26 19:44 302 查看
2011/6/26功能菜单模块分析
1.Model层MenuPojo[JavaBean]

publicclassMenuPojo{
publicfinalstaticString[]STATE_NAME={"无效","有效"};
publicfinalstaticString[]CLASS_NAME={"功能组","普通功能"};
publicfinalstaticString[]ISOPEN_NAME={"关闭","打开"};
publicfinalstaticString[]TOPFLAG_NAME={"不可以","可以"};
privateStringmenuId="";//菜单ID
privateStringappName="";//应用ID
privateStringmenuName="";//菜单项名称
privateStringmenuDes="";//菜单项描述
privateintmenuClass=1;//菜单组
privateStaticPojomenuType=newStaticPojo();//类型
privateintstate=1;//状态
privateStringjsfun="";//JS方法
privateStringimgName="";//图标路径
privateintisOpen=1;//是否打开
privateStringpmenuId="";//上级菜单id
privateStringpmenuName="无";//上级菜单名称
privateintchlMenuNum=-1;//下级菜单数量
privateStringtoPage="";//去向页面
privateinttopFlag=0;//是否可放置在top菜单里;0:不可;1:可以
privateintseq=0;
privateintcount=0;//下级数量
.....gettersandsetters......
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

2.数据库层BSMenuDBMang

下文再谈,呵呵呵

3.表现层BSMenu
(1)功能菜单查看的初始化页面:

publicBSObjectdo_MenuIni(BSObjectm_bs)throwsException{
m_bs.setCurPage("system/menu/index.jsp");
SqlExecutesqlHelper=newSqlExecute();
try{
//设置功能菜单树
this._setMenuTree(m_bs,sqlHelper);
}catch(Exceptionep){
ep.printStackTrace();
throwep;
}finally{
sqlHelper.close();
}
returnm_bs;
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

注意点:项目统一命名规范,进入页面的第一个初始化方法的do_之后的命名是首字母大写,内部自己定义的方法以下划线开头,其他的方法do_之后是以小写字母开头

其中调用的方法_setMenuTree

//设置角色和权限关系树
publicvoid_setMenuTree(BSObjectm_bs,SqlExecutesqlHelper)
throwsException{
//设置组织机构数
VBSTreetree=null;
VBSTreeNoderootnode=null;
tree=newVBSTree();
tree.setName("MenuTree");
//设置右键
Stringtpath=m_bs.getRequest().getContextPath()
+"/common/images/toolbar/";
tree.setRightmenu(newVBSRightMenu());
VBSRightMenuArearma=tree.getRightmenu().addMenuAreaMenu("菜单操作");
VBSRightMenuItemitem=rma.addItem("添加功能",-1);
item.setImg(tpath+"add.gif");
item.setName("add");
item.setJsFun("addMenu()");
//根
rootnode=tree.addRootNode();
rootnode.set("root","功能菜单","","");
rootnode.setIsOpen(true);
rootnode.setRmAreaIndex(0);
//得到第一层
BSMenuDBMangmenuDB=newBSMenuDBMang(sqlHelper,m_bs);
ArrayList<MenuPojo>thisNodes=menuDB
.getMenuList("andt.MENU_IDnotin(selectMENU_IDfromT_MENU_R)");
this._setTreeNode(thisNodes,rootnode,menuDB);
m_bs.setTagValue(tree);
}


.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

从这里可以学会如何使用Tree控件和RightMenu控件,界面的显示如下





上面的方法中调用了一个递归的方法,用于生成树形菜单

//递归得到下级树
privatevoid_setTreeNode(ArrayList<MenuPojo>thisNodes,VBSTreeNodepNode,
BSMenuDBMangmenuDB)throwsException{
VBSTreeNodenode=null;
MenuPojooneMenu=null;
for(inti=0,size=thisNodes.size();i<size;i++){
oneMenu=thisNodes.get(i);
//递归得到下级功能菜单
node=pNode.addNode();
node.set(oneMenu.getMenuId(),oneMenu.getMenuName(),"editMenu()",
"");
node.setRmAreaIndex(0);
node.setTitle(oneMenu.getMenuDes());
//是否有下级菜单
if(oneMenu.getCount()>0){
node.setIsOpen(true);
ArrayList<MenuPojo>subNodeList=menuDB
.getMenuList("andt.MENU_IDin(selectMENU_IDfromT_MENU_RwhereP_MENU_ID='"
+node.getName()+"')");
this._setTreeNode(subNodeList,node,menuDB);
}

}
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

(2)功能菜单编辑的初始化页面:

publicBSObjectdo_MenuEditIni(BSObjectm_bs)throwsException{
m_bs.setCurPage("system/menu/edit.jsp");
Stringtype=(String)m_bs.getPrivateMap().get("in_type");
StringmenuId=(String)m_bs.getPrivateMap().get("in_menuid");
//得到功能树
SqlExecutesqlHelper=newSqlExecute();
try{
//得到一个菜单项
MenuPojoonePojo=newMenuPojo();
if(type!=null&&type.trim().equals("edit")){
//编辑菜单
BSMenuDBMangmenuDB=newBSMenuDBMang(sqlHelper,m_bs);
onePojo=menuDB.getOneMenu("andt.MENU_ID='"+menuId+"'");
}
//网页面上放置
this._setMenuToWeb(m_bs,onePojo,sqlHelper);
}catch(Exceptionep){
ep.printStackTrace();
throwep;
}finally{
sqlHelper.close();
}
returnm_bs;
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

这里调用了一个很重要的方法,就是将从数据库中得到的一个menu(onepojo)设置到web页面上去,也就是

//设置编辑页面
privatevoid_setMenuToWeb(BSObjectm_bs,MenuPojoonePojo,
SqlExecutesqlHelper){
m_bs.setPrivateValue("t_menuid",onePojo.getMenuId());
m_bs.setPrivateValue("t_pmenuid",onePojo.getPmenuId());
m_bs.setPrivateValue("l_pmenuname",onePojo.getPmenuName());
m_bs.setPrivateValue("t_menuname",onePojo.getMenuName());
m_bs.setPrivateValue("t_menudesc",onePojo.getMenuDes());
m_bs.setPrivateValue("t_menujsfun",onePojo.getJsfun());
m_bs.setPrivateValue("t_menuimg",onePojo.getImgName());
m_bs.setPrivateValue("t_menutopage",onePojo.getToPage());
m_bs.setPrivateValue("t_menutseq",String.valueOf(onePojo.getSeq()));
m_bs.setPrivateValue("t_menuclass",
String.valueOf(onePojo.getMenuClass()));

//m_bs.setPrivateValue("t_menutype",String
//.valueOf(onePojo.getMenuType()));
m_bs.setPrivateValue("t_menustate",String.valueOf(onePojo.getState()));
m_bs.setPrivateValue("t_menuisopen",
String.valueOf(onePojo.getIsOpen()));
m_bs.setPrivateValue("t_menutop",String.valueOf(onePojo.getTopFlag()));
//下拉框
VBSSelectt_menuclass=newVBSSelect();
t_menuclass.setName("t_menuclass");
t_menuclass.setOption("1","普通功能",0);
t_menuclass.setOption("0","功能组",0);
m_bs.setTagValue(t_menuclass);

VBSSelectt_menustate=newVBSSelect();
t_menustate.setName("t_menustate");
t_menustate.setOption("0","无效",0);
t_menustate.setOption("1","有效",0);
m_bs.setTagValue(t_menustate);

VBSSelectt_menuisopen=newVBSSelect();
t_menuisopen.setName("t_menuisopen");
t_menuisopen.setOption("0","关闭",0);
t_menuisopen.setOption("1","打开",0);
m_bs.setTagValue(t_menuisopen);

VBSSelectt_menutop=newVBSSelect();
t_menutop.setName("t_menutop");
t_menutop.setOption("0","不可做快捷方式",0);
t_menutop.setOption("1","可做快捷方式",0);
m_bs.setTagValue(t_menutop);
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

这里的主要操作就是将onepojo里保存的数据放入到页面相应的显示控件中

例如:edit.jsp中的

<BS:textname="t_menuname"style="width:100%;"/>

这个text控件就是用于存放功能菜单的名称的,后台通过m_bs.setPrivateValue("t_menuname",onePojo.getMenuName());来赋值给它

类似的还有其他的一些控件,如:

<BS:textarearows="3"cols=""value=""name="t_menudesc"style="width:100%;"/>

<BS:selectname="t_menuclass"style="width:100%;"/>//这个是菜单组,菜单是有分组的

(3)提交编辑结果

publicBSObjectdo_commitMenu(BSObjectm_bs)throwsException{
StringretStr="操作失败,请稍后再试";
Stringtype=(String)m_bs.getPrivateMap().get("in_type");
VBSTreeMenuTree=(VBSTree)m_bs.getTagMap().get("MenuTree");
if(MenuTree!=null){
//得到一个菜单项
MenuPojoonePojo=this._getMenuFormWeb(m_bs);
intcount=0;
VBSTreeNodenode=null;
SqlExecutesqlHelper=newSqlExecute();
try{
sqlHelper.setAutoCommit(false);
BSMenuDBMangmenuDB=newBSMenuDBMang(sqlHelper,m_bs);
//得到一个菜单项
if(type!=null&&type.trim().equals("edit")){
//保存菜单
count=menuDB.updateMenu(onePojo);
node=MenuTree.getNodeByName(onePojo.getMenuId());
if(onePojo!=null){
node.set(onePojo.getMenuId(),onePojo.getMenuName(),
"editMenu()","");
node.setRmAreaIndex(0);
node.setUpdateFlag(true);
MenuTree.getReFreshNodeList().add(node);
}
}else{
//新增
count=menuDB.insertMenu(onePojo);
if(!onePojo.getPmenuId().trim().equals("")){
node=MenuTree.getNodeByName(onePojo.getPmenuId())
.addNode();
}else{
node=MenuTree.getRootNode().addNode();
}
if(onePojo!=null){
node.set(onePojo.getMenuId(),onePojo.getMenuName(),
"editMenu()","");
node.setRmAreaIndex(0);
MenuTree.getReFreshNodeList().add(node);
}
}
if(count>0){
retStr="T";
m_bs.setTagValue(MenuTree);
}else{
retStr="没有更新任何数据!";
}
sqlHelper.commit();
}catch(Exceptionep){
sqlHelper.rollback();
ep.printStackTrace();
throwep;
}
}
m_bs.setRetrunObj(retStr);
returnm_bs;
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

提交这里会去获取编辑的那些项的内容,但是有可能是空的或者不合法,所以还要有一个方法来进行判断和解析那些编辑项

privateMenuPojo_getMenuFormWeb(BSObjectm_bs){
MenuPojoonePojo=newMenuPojo();
if(m_bs.getPrivateMap().get("t_menuid")!=null){
onePojo.setMenuId((String)m_bs.getPrivateMap().get("t_menuid"));
}
if(m_bs.getPrivateMap().get("t_pmenuid")!=null){
onePojo.setPmenuId((String)m_bs.getPrivateMap().get("t_pmenuid"));
}
if(m_bs.getPrivateMap().get("t_menuname")!=null){
onePojo.setMenuName((String)m_bs.getPrivateMap().get("t_menuname"));
}
if(m_bs.getPrivateMap().get("t_menudesc")!=null){
onePojo.setMenuDes((String)m_bs.getPrivateMap().get("t_menudesc"));
}
if(m_bs.getPrivateMap().get("t_menujsfun")!=null){
onePojo.setJsfun((String)m_bs.getPrivateMap().get("t_menujsfun"));
}
if(m_bs.getPrivateMap().get("t_menuimg")!=null){
onePojo.setImgName((String)m_bs.getPrivateMap().get("t_menuimg"));
}
if(m_bs.getPrivateMap().get("t_menutopage")!=null){
onePojo.setToPage((String)m_bs.getPrivateMap().get("t_menutopage"));
}
if(m_bs.getPrivateMap().get("t_menutseq")!=null){
onePojo.setSeq(Integer.parseInt((String)m_bs.getPrivateMap().get(
"t_menutseq")));
}
if(m_bs.getPrivateMap().get("t_menustate")!=null){
onePojo.setState(Integer.parseInt((String)m_bs.getPrivateMap()
.get("t_menustate")));
}
if(m_bs.getPrivateMap().get("t_menuclass")!=null){
onePojo.setMenuClass(Integer.parseInt((String)m_bs.getPrivateMap()
.get("t_menuclass")));
}
if(m_bs.getPrivateMap().get("t_menuisopen")!=null){
onePojo.setIsOpen(Integer.parseInt((String)m_bs.getPrivateMap()
.get("t_menuisopen")));
}
if(m_bs.getPrivateMap().get("t_menutop")!=null){
onePojo.setTopFlag(Integer.parseInt((String)m_bs.getPrivateMap()
.get("t_menutop")));
}
returnonePojo;
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

(4)重新显示树形结构

publicBSObjectdo_reShowMenu(BSObjectm_bs)throwsException{
m_bs.addRefreshTag("MenuTree");
returnm_bs;
}

只要将要重新显示的控件添加到m_bs中就可以了

4.页面的分析

Index.jsp这个是功能菜单管理的首页

以下是首页的重要的js

<scripttype="text/javascript"language="javascript">
varretObj={};
varfromObj=thisDlg.inObj;
functioniniPage(){
thisDlg.endFun();
}

functionaddMenu(){
varnode=MenuTree.getSelectNode();
if(node!=null){
vartObj={};
tObj.type="new";
tObj.pid=node.name;
tObj.pname=node.showStr;
if(node.id<=0){
tObj.pid="";
}
p.openParentDlg("MENU_EDIT","新建功能菜单",550,440,tObj,"MENU",
"MenuEditIni","&in_type="+tObj.type,window,true,true,
"editMenuRet","");
}else{
alert("请选择一个功能!");
}
}
functioneditMenu(){
varnode=MenuTree.getSelectNode();
if(node!=null){
vartObj={};
tObj.type="edit";
tObj.id=node.name;
p.openParentDlg("MENU_EDIT","编辑功能菜单",550,440,tObj,"MENU",
"MenuEditIni","&in_type="+tObj.type+"&in_menuid="
+tObj.id,window,true,true,"editMenuRet","");
}else{
alert("请选择一个功能!");
}
}
functioneditMenuRet(r_obj,i_obj){
if(r_obj=="T"){
doRefresh("MENU","reShowMenu",true,"","","");
}
}
</script>

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

这里的retObj就是返回的对象,fromObj是来源对象,它是当前的thisDlg的inObj,这里通过给这个对象设置一些值可以使得打开的dialog能够得到这些值,并进行相应的操作

varretObj={};varfromObj=thisDlg.inObj;

iniPage方法:thisDlg.endFun();这里不理解是什么意思,后文有介绍,主要就是表明打开了新的子窗体

addMenu方法和editMenu方法:两者的区别在前者只需要从前面得到操作类型是new还有选中的menu的id[新建一个功能菜单时需要知道该功能菜单的pid],而后者除了需要操作类型是edit还需要选中的的menu的id[修改一个功能菜单需要知道修改的功能菜单的id]

打开一个新的窗口来进行添加和编辑功能菜单

由于功能菜单是多对多的关系,存在着上下级,属于树形结构,所以选择用Tree控件来显示它,如果选择了某项来进行操作,就要有一个node对象,当他不为空时,就可以得到它的

相关信息,再传给打开的窗口

addMenu方法:

p.openParentDlg("MENU_EDIT","新建功能菜单",550,440,tObj,"MENU",
"MenuEditIni","&in_type="+tObj.type,window,true,true,
"editMenuRet","");

editMenu方法:

p.openParentDlg("MENU_EDIT","编辑功能菜单",550,440,tObj,"MENU",
"MenuEditIni","&in_type="+tObj.type+"&in_menuid="
+tObj.id,window,true,true,"editMenuRet","");

openParentDlg这个方法来源于index.js,定义如下:从下面可以看出各个参数分别是什么

这个方法实际上就是根据特定的用户,通过该用户的选择进一步封装一些参数,然后将这些参数传给parentDlg.openDlg()方法,生成另一个窗体来进行下一步的操作,例如添加

或者编辑,最后还是调用了doCommit方法来提交操作,也就是得到了一个新的需要的窗口

functionopenParentDlg(id,title,width,height,inObj,bsID,fun,paras,
cWinName,isMT,isResize,retFun,img,index){
if(isMT){
isResize=false;
}else{
if(isResize!=null&&!isResize){
isResize=false;
}else{
isResize=true;
}
}
//parentDlg.show();
varexStr1=":"+$F("pub_tusername");
varexStr2=":"+$F("pub_torgname");
varexStr3="";
varnewDlg=parentDlg.openDlg(parentDlg.name+"_"+id,title,0,0,
width,height,isMT,isResize,retFun,img,index,exStr1,exStr2,
exStr3,true);
if(newDlg!=null){
newDlg.inObj=inObj;
newDlg.win=cWinName;
newDlg.startFun();
if(retFun!=null&&retFun!=""){
newDlg.retFun=retFun;
}
newDlg.returnObj=null;
frmBusiness.target=newDlg.target;
doCommit(bsID,fun,paras);
}
}


注意这里的红色部分,后文解释
其中的retFun就是在新打开的窗体关闭后调用的方法(回调函数),首先判断用户是否进行了操作,如果没有进行任何必要的操作,那么就不用刷新,反之就要调用deRefresh来进行零刷新操作
functioneditMenuRet(r_obj,i_obj){
if(r_obj=="T"){
doRefresh("MENU","reShowMenu",true,"","","");
}
}

首页index.jsp的界面就非常的简单,就是一个树形结构的对象<BS:tree…../>,name属性很重要,后台就是通过这个name来进行赋值的(或者给这个树添加节点的)

<bodyscroll="no"onload="iniPage();">
<formmethod="POST"name="frmBusiness"action="">
<tablestyle="width:100%;height:100%;"align="center"
class="table_d"border="0"cellpadding="0"cellspacing="0">
<tr>
<tdstyle="width:100%;height:100%;">
<divstyle="width:100%;height:100%;overflow:auto">
<BS:treename="MenuTree"imagesPath="bsweb/images/tree/"
canDrag="false"/>
</div>
</td>
</tr>
</table>
</form>
</body>

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}


.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

然后就是编辑页面edit.jsp

<scripttype="text/javascript"language="javascript">
varfObj=thisDlg.inObj;
varval=newBSValidate();
functioniniPage(){
if(fObj.type=="new"){
$("t_pmenuid").value=fObj.pid;
$("p_l_pmenuname").innerHTML=fObj.pname;
}
thisDlg.endFun();
val.add("t_menuname","菜单项名称");
val.add("t_menutseq","序号");
val.add("t_menutseq","序号",1);
}

functionMenuCommit(){
if(val.doValidate()&&confirm("是否提交数据?")){
doRefresh("MENU","commitMenu",true,"",
"&in_type="+fObj.type,"MenuCommitRet");
}
}

functionMenuCommitRet(retObj,data){
if(data=="T"){
thisDlg.returnObj=data;
thisDlg.closeDlg();
}else{
alert(data);
}
}
</script>

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

这里的相关解释:fObj是来源obj,它就是父窗体中的fromObj,里面保存了一些数据,(这里是功能菜单的父亲编号pid和父菜单的名称,前者设置为当前页面的一个元素的value,后者设置为一个label的innerHTML),同时还有一个最重要的数据就是type,当type是new时,就表明是新建一个功能菜单

回到上面的红色部分,newDlg.inObj=inObj;这句话很重要,这句话的意思就是说,将父窗体的inObj(这个是Dialog的一个属性)传给了新建的子窗体

对照一下,inde.jsp的js中

functionaddMenu(){
varnode=MenuTree.getSelectNode();
if(node!=null){
vartObj={};
tObj.type="new";
tObj.pid=node.name;
tObj.pname=node.showStr;
if(node.id<=0){
tObj.pid="";
}
p.openParentDlg("MENU_EDIT","新建功能菜单",550,440,tObj,"MENU",
"MenuEditIni","&in_type="+tObj.type,window,true,true,
"editMenuRet","");
}else{
alert("请选择一个功能!");
}
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

edit.jsp的js中

varfObj=thisDlg.inObj;
functioniniPage(){
if(fObj.type=="new"){
$("t_pmenuid").value=fObj.pid;
$("p_l_pmenuname").innerHTML=fObj.pname;
}
thisDlg.endFun();
val.add("t_menuname","菜单项名称");
val.add("t_menutseq","序号");
val.add("t_menutseq","序号",1);
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

val是一个BSValidate对象,来源于/bsweb/js/bsvalidate.js,用于对各种数据进行验证,对于需要验证的对象只要调用val.add(…)方法就可以了

val.add("t_menutseq","序号");val.add("t_menutseq","序号",1);前者是验证序号是否是空的,而后者是验证序号是否是只包含数字
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: