2011/6/26 功能菜单模块分析
2011-06-26 19:44
302 查看
2011/6/26功能菜单模块分析
1.Model层MenuPojo[JavaBean]
.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)功能菜单查看的初始化页面:
.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
.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控件,界面的显示如下
上面的方法中调用了一个递归的方法,用于生成树形菜单
.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)功能菜单编辑的初始化页面:
.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页面上去,也就是
.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)提交编辑结果
.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;}
(4)重新显示树形结构
只要将要重新显示的控件添加到m_bs中就可以了
4.页面的分析
Index.jsp这个是功能菜单管理的首页
以下是首页的重要的js
.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方法来提交操作,也就是得到了一个新的需要的窗口
首页index.jsp的界面就非常的简单,就是一个树形结构的对象<BS:tree…../>,name属性很重要,后台就是通过这个name来进行赋值的(或者给这个树添加节点的)
.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
.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中
.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中
.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);前者是验证序号是否是空的,而后者是验证序号是否是只包含数字
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);前者是验证序号是否是空的,而后者是验证序号是否是只包含数字
相关文章推荐
- 2011/6/26 功能菜单模块分析_数据库操作层
- 深入PHP购物车模块功能分析(函数讲解,附源码)
- Linux 网络协议栈开发代码分析篇之VLAN(一)—— vlan 功能模块分析
- contacts模块功能分析(较全面)
- 深入PHP购物车模块功能分析(函数讲解,附源码)
- AFNetworking3.1.0源码分析(一)整体框架和功能模块
- contacts模块功能分析
- contacts模块功能分析(较全面)
- phpweb 网站 -会员模块安装后会员功能菜单修复方法
- wireshark功能模块分析
- 模块管理常规功能自定义系统的设计与实现(14--模块图表分析的设计)
- PostgreSQL源码目录结构及其相关模块功能分析
- Android网络编程之一个Android下菜单系统模块的实现(服务器端—结算功能(中部))
- phpweb 各模块的会员功能菜单内部链接网址清单
- 常规功能和模块自定义系统 (cfcmms)—010主界面和菜单的展示和控制(2)
- 【BUG分析】手机插着USB时手动重启,USB功能选择菜单点不动
- Discuz!!论坛wap功能模块编码的注射漏洞分析
- Android网络编程之一个Android下菜单系统模块的实现(服务器端—开桌功能))
- Full PACS系统功能模块设计及应用案例分析
- DX1.5 home模块的DIY功能分析