4.5.構(gòu)造生成點(diǎn)擊樹(shù)型XMl顯示詳細(xì)節(jié)點(diǎn)內(nèi)容的Servlet 在點(diǎn)擊樹(shù)的樹(shù)杈節(jié)點(diǎn)時(shí),會(huì)使當(dāng)前點(diǎn)擊節(jié)點(diǎn)發(fā)生變化,這種變化會(huì)要反映到節(jié)點(diǎn)的詳細(xì)狀態(tài)信息顯示上,這種頁(yè)面之間的通訊在這里是通過(guò)改變cookie中的點(diǎn)擊對(duì)象的值來(lái)傳遞的,使用這種方式的原因有: 一,處理反應(yīng)快,因?yàn)橹皇菍?duì)客戶端的cookie進(jìn)行一些簡(jiǎn)單的讀寫操作,避免了一些較為煩瑣,耗時(shí)的通訊和服務(wù)器處理過(guò)程; 二,對(duì)點(diǎn)擊的安全性要求不高,點(diǎn)擊對(duì)象是顯式操作的,沒(méi)有敏感的客戶信息和服務(wù)器信息,所以是可以保存在客戶端的cookie中的; 三,代碼編寫,維護(hù)較為簡(jiǎn)單,在點(diǎn)擊頁(yè)面中只是需要用javascript把點(diǎn)擊對(duì)象寫入cookie中,再刷新節(jié)點(diǎn)詳細(xì)顯示頁(yè)面即可,在節(jié)點(diǎn)詳細(xì)顯示頁(yè)面也只是節(jié)點(diǎn)向服務(wù)器重新請(qǐng)求一次該頁(yè)面; 實(shí)現(xiàn)節(jié)點(diǎn)詳細(xì)信息的頁(yè)面的主體仍是由XMLServlet生成的XML樹(shù),實(shí)現(xiàn)XSL模版的是Servlet XMLTreeXSL,該XSL主要是在XML提取符合要求的節(jié)點(diǎn),顯示節(jié)點(diǎn)的詳細(xì)信息,并把節(jié)點(diǎn)的最近子節(jié)點(diǎn)的詳細(xì)信息顯示出來(lái),確認(rèn)符合要求的節(jié)點(diǎn)是通過(guò)提取客戶端瀏覽器cookie中的點(diǎn)擊對(duì)象記錄得到的.所以該Servlet完成兩部分任務(wù),讀取瀏覽器cookie然后書(shū)寫XSL.下面是對(duì)該Servlet代碼的主要分析:
/**讀取cookie和書(shū)寫XSL*/ public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try{ /**確認(rèn)有XML樹(shù)需要進(jìn)行模版轉(zhuǎn)換,通過(guò)Session中是否含有Sessionbean來(lái)確認(rèn)*/ HttpSession session=request.getSession(); if( session.getAttribute("ResultEditHandle")==null) { flag=false; } else { flag=true; } if (flag) { /**cookie中可能含有多個(gè)子cookie信息,用一個(gè)數(shù)組保存多個(gè)cookie*/ javax.servlet.http.Cookie cookies[] = request.getCookies(); String t_click_id = null; /**書(shū)寫XSL還需要遵循XML書(shū)寫規(guī)范,標(biāo)簽要一一對(duì)應(yīng)*/ response.setContentType(CONTENT_TYPE); out = response.getWriter(); out.println(CONTENT_XSL); out.println("<xsl:template match=\"/\">"); out.println("<HTML>"); out.println("<HEAD><STYLE>body{FONT-SIZE: 10pt;}</STYLE></HEAD>"); /**select=”//node”是對(duì)所有的node進(jìn)行訪問(wèn),而不僅僅局限于頂層的node*/ out.println("<BODY><xsl:apply-templates select=\"//node\"/></BODY></HTML></xsl:template>"); if ((cookies == null)||(cookies.length == 0)){ out.println("No Clicked Node"); } /**cookie不為空且子cookie的個(gè)數(shù)不為零,遍歷cookie*/ else { for(int i = 0;i < cookies.length; i++){ javax.servlet.http.Cookie c =cookies[i]; /**當(dāng)遍歷的子cookie的名稱為ClickId時(shí)書(shū)寫XSL*/ if ( c.getName().equals("ClickId")){ /**t_click_id的值為點(diǎn)擊對(duì)象的id*/ …
4.6.Servlet調(diào)用的Session Bean的構(gòu)造 XML樹(shù)是從數(shù)據(jù)庫(kù)中得到相應(yīng)結(jié)果集而構(gòu)造的,這個(gè)結(jié)果集如果不采用EJB的方式可以用ResultSet來(lái)完成,但是如果考慮采用EJB來(lái)做,那么就需要放棄使用ResultSet,因?yàn)樗遣豢尚蛄谢?不能直接為EJB所用,使用RowSet或者CachedRowSet這些可序列化的結(jié)果集對(duì)象來(lái)實(shí)現(xiàn). 這里構(gòu)造的SessionBean是有狀態(tài)的,需要構(gòu)造的有遠(yuǎn)程接口,home接口和bean類. 遠(yuǎn)程接口, ResultEdit.java home接口, ResultEditHome.java bean類, ResultEditBean.java 對(duì)如何實(shí)現(xiàn)bean類進(jìn)行詳細(xì)描述,
public class ResultEditBean implements SessionBean { /**Session容器定義*/ private SessionContext sessionContext; public int id; public String name; /**結(jié)果集定義,定義結(jié)果集類型為sun.jdbc.rowset.CachedRowSet*/ private CachedRowSet crset=null; /**容器定義*/ private Context ctx = null; /**數(shù)據(jù)源定義*/ private DataSource ds = null; /**構(gòu)造函數(shù)*/ public ResultEditBean() { } /**EJB創(chuàng)建,該方法是每個(gè)EJB定義都必須有,方法里面包含EJB的創(chuàng)建過(guò)程*/ public void ejbCreate() { try { /**容器初始化*/ ctx = new InitialContext(); /**從容器獲得DataSource名稱為imis的實(shí)例*/ ds = (DataSource)ctx.lookup("java:comp/env/imis"); } catch (Exception e) { System.out.println("ejbCreate failed:"+e.getMessage()); e.printStackTrace(); } }
/**以下幾個(gè)ejb開(kāi)頭的方法是構(gòu)造EJB時(shí)必須的,分別處理著相應(yīng)的事件*/ public void ejbRemove() throws RemoteException { } public void ejbActivate() throws RemoteException { } public void ejbPassivate() throws RemoteException { } public void setSessionContext(SessionContext sessionContext) throws RemoteException { this.sessionContext = sessionContext; } /**getRowSet()返回私有成員crset,該方法在遠(yuǎn)程接口中有定義*/ public RowSet getRowSet() throws SQLException { return crset; } /**setRowSet(String sqlExp)通過(guò)定義好的數(shù)據(jù)源連接數(shù)據(jù)庫(kù),并用查詢語(yǔ)句獲得結(jié)果集*/ public RowSet setRowSet(String sqlExp) throws SQLException { Connection con = null; try { con = ds.getConnection(); Statement stmt = con.createStatement(); ResultSet rs =stmt.executeQuery(sqlExp); CachedRowSet t_crset = new CachedRowSet(); t_crset.populate(rs); rs.close(); stmt.close(); crset = t_crset; return t_crset; } finally { if (con != null) con.close(); } } SessionBean在附錄中有完整的代碼和EJB發(fā)布的完整過(guò)程.
|