Sword框架解析——知識采集流程頁面初始化
聲明:目前因為是初學者小白,現階段不去考慮架構底層的東西,比如:BaseZrarBlh類是如何通過factory創建;框架是如何將spring、spring mvc、hibernate封裝的;一些具體的基礎組件是額如何封裝的,這個后續再去討論和研究,目前現階段,是了解清楚他的用法,清楚的展現出來,說明他是怎么用的即可。
問題解答流程——采集新增頁面初始化
1.1后台t_xt_gnzy表和BLH類
正式開始,以模仿問題解答采集流程為例:
先在t_xt_gnzy表中添加一個問題解答采集的模仿數據,這個表主要存放的是頁面左邊的菜單欄的數據,后續這些數據會通過封裝在框架中的特定方法去調用后台對應的java類的特定方法去跳轉頁面。
圖1 .1.1 系統頁面菜單欄展示
圖1.1.2 oracle數據庫t_xt_gnzy表存放的菜單欄數據信息
跳轉的關鍵就在於URL里面存儲的sword?tid=ZskwtwhnewBLH_toZskwtwhNewTree&wtwhlx=zscj這種數據。我們可以發現,在前端數據傳遞到后台處理的時候,也是類似的用法,其中也包括我們經常用的ajax,框架的ajax也是經過特殊封裝的,但是原理是一樣的。
在數據庫中存放的url,后續會通過框架中的特有方式執行:
圖1.1.3 t_xt_gnzy中的url
sword?tid=ZskwtwhnewBLH_toZskwtwhNewTree&wtwhlx=zscj
以“_”作為分界線:
前面的地址是后台BLH類的唯一標識符,在本例中是:ZskwtwhnewBLH
。
后面的部分,到&之前,是對應類的方法名的唯一標示符,在本例中是:toZskwtwhNewTree
。
&之后,是我們需要向后台傳值的部分,在本例中,傳遞了一個名叫“wtwhlx”的值,具體值是:zscj,一般在這里傳遞的值,都是用來控制頁面展示的一些參數
。
1.2BLH類的寫法&前台目錄樹代碼
(1)BLH類
前面我們提到了,在數據庫中的url包含了兩個【唯一標識符】的問題
@BLH("ZskwtwhnewBLH") public class ZskwtwhnewBLH extends BaseZrarBlh { private static final String WtwhVO_Form = "wtwhFormID"; private static final String WtwhVO_Grid = "wtwhGridID"; //問題維護初始化頁面跳轉 public IResData toZskwtwhNewTree(IReqData req){ IResData res=new SwordRes(); //判斷樹頁面右邊加載的iframe類型 String wtwhlx=(String)req.getAttr("wtwhlx"); res.addJSTL("wtwhlx", wtwhlx); if("zscj".equals(wtwhlx)){ res.addJSTL("scrolling", "no"); }else{ res.addJSTL("scrolling", "yes"); } res.addPage("zrarpages/main/zsk/zlwh/wtwh_new_tree.jsp"); return res; }
代碼段1.2.1 ZskwtwhnewBLH類
表中sword?tid=ZskwtwhnewBLH_toZskwtwhNewTree&wtwhlx=zscj
1.ZskwtwhnewBLH對應代碼中的注解@BLH("ZskwtwhnewBLH"),這兩個地方要寫得一模一樣,具體原理不解釋,是sword框架封裝之后所實現的效果。
2.toZskwtwhNewTree是對應@BLH("ZskwtwhnewBLH")這個注解所在的類下面的toZskwtwhNewTree方法
3&wtwhlx=zscj傳遞了wtwhlx的值,這個值決定了傳遞到頁面的scrolling值是no還是yes,在這里,我們得到wtwhlx的值是zjcs,所以傳遞到頁面的scrolling值是no。
(2)前台目錄樹
核心代碼塊如下:
<body class="body_bq"> <div class="div_bq"> <div class="pad_8" id="ie6_wid"> <table width="100%" cellpadding="0" cellspacing="0" border="0"> <tr> <td class="shu_2"> <div class="tree_td_div"><span><%=ZskConstants.ZSK_ZLFLAG_WT_NAME %></span></div> <div sword='SwordTree' id="SwordTreeWT" name="zskTree" onCreateNode="createNode()" tid="ZskTreeBLH_zskInitTree?zltype=wtjd" ltid="ZskTreeBLH_zskLoadTree" onNodeClick="zsk_redirectURL('<c:out value="${wtwhlx }"/>','<c:out value="${ zlcode}"/>', '<c:out value="${ zltypemc}"/>')" lazyLayer="2" laztTime="200"></div> </td> <td style="width:8px;"></td> <td valign='top' id="main"> <iframe frameborder="0" width="100%" name="viewView" id="viewView" scrolling='<c:out value="${scrolling}"/>'></iframe> </td> </tr> </table> </div> </div> </body>
代碼段1.2.2 wtwh_new_tree.jsp 查詢左側目錄樹
1.我們可以發現,在這句代碼中:
<div sword='SwordTree' id="SwordTreeWT" name="zskTree" onCreateNode="createNode()" tid="ZskTreeBLH_zskInitTree?zltype=wtjd" ltid="ZskTreeBLH_zskLoadTree" onNodeClick="zsk_redirectURL('<c:out value="${wtwhlx }"/>','<c:out value="${ zlcode}"/>', '<c:out value="${ zltypemc}"/>')" lazyLayer="2" laztTime="200"></div>`
用
tid="ZskTreeBLH_zskInitTree?zltype=wtjd"
ltid="ZskTreeBLH_zskLoadTree"
的方法去調用java類的相關方法。
用
框架封裝的createNode();zsk_redirectURL(...,...,...)
的方法實現目錄樹的使用。
2.知道上述功能即可,具體目錄樹如何實現的相關代碼不做進一步深入
1.3登錄系統開啟權限
在t_xt_gnzy中添加了數據之后,我們會發現在頁面的【知識采集】菜單欄中點開,並沒有出現我們自定義的【問題解答】菜單,這是因為sword系統的權限過濾和我之前做的系統的權限過濾是不同的:
之前不管是scm系統也好,自行車項目也好,權限過濾模塊的設計是,賬戶登錄之后可以看到所有的模塊,對於自己沒有權限的模塊,可以看見,但是沒有辦法編輯。
而現在的sword系統是:對於賬戶沒有開通的權限部分,在菜單欄里面是不會展示出來的。
那么,為了讓我們添加的新菜單能夠展示出來,我們需要按照圖示的路徑去開通【問題解答】模塊的權限:
圖1.3.1 權限管理頁面
在下圖中,開啟【問題解答】權限:
圖1.3.2 開啟【問題解答】權限
開啟權限之后,用具備該權限的賬號去登錄系統-【知識管理】-【知識采集】
頁面中就可以看到【問題解答】模塊了:
圖1.3.3 問題采集模塊
1.4頁面樹&iframe加載
(1)頁面樹
當我們寫好了后台和前台頁面之后,點擊問題解答,將出現下述頁面,
前台只顯示左側的目錄樹:
圖1.4.1 頁面測試
(2)iframe加載
核心代碼如下:
//初始化加載iframe的頁面。對於zltypemc參數,1.知識采集待辦傳"zlcjdb" 2.首頁采集待辦傳"cjdb"3.維護列表傳"wh" //根據后台傳過來的數據,根據不同的業務類別,去加載相應的【自增】【維護】【審批】頁面 function zsk_reloadView(wtwhlx,zlcode,zltypemc,ywlb){ if(wtwhlx=="zscj"){ document.getElementById("viewView").src="sword?tid=ZskwtwhBLH_zskwtwhAdd&zltype=<%=ZskConstants.ZSK_ZLFLAG_WT %>" }else if(wtwhlx=="modify"){ document.getElementById("viewView").src="sword?tid=ZskwtwhBLH_zskwtwhModify&zlcode="+zlcode+"&cjdb="+zltypemc+"&ywlb="+ywlb; }else if(wtwhlx=="glwzadd"||wtwhlx=="glwzmodify"){ document.getElemenetById("viewView").src="sword?tid=ZskZhcxBLH_zhcxInit&zlflag2&zltype=2&glzltype="+zlcode+"&glzltypemc="+encodeURI(zltypemc)+"&whlx="+wtwhlx+"&ywlb="+ywlb; }else{ document.getElementById("viewView").src="sword?tid=ZskwtwhBLH_zskwtwhFindList&zltype=<%=ZskConstants.ZSK_ZLFLAG_WT %>" } } //自動題解iframe高度——設置頁面的高度 function setHeight(){ var h=parent.zsk_getH(); $('viewView').setStyle('height',h-18); $('SwordTreeWT').set('height',h-45+"px"); }
代碼塊1.4.1 ifarme加載
<div Sword="PageInit" onBefore="setHeight()" onFinish="zsk_reloadView('<c:out value="${wtwhlx}"/>','<c:out value="${zlcode}"/>','<c:out value="${zltypemc}"/>')".'<c:out value="${ ywlb}"/>')"></div>
代碼塊1.4.2 jsp頁面加載完成后執行
這里的jsp代碼段,表達在頁面加載之前,執行setHeight()方法,用於設置頁面高度
在頁面加載完成之后執行zsk_reloadView()方法用於調用后台java代碼查詢相關數據、返回頁面內容,放到wtwh_new_tree.jsp頁面的id為viewView的ifame里面作為內容展示出來。
(3) BLH新增問題跳轉zskwtwhAdd&wtwh_add.jsp
詳細代碼這里不做進一步詳解。
測試之后,會得到如圖所示的頁面:
圖1.4.2 問題解答采集新增頁面的形成過程