用Java完成可保存狀態(tài)的數(shù)據(jù)庫生成XML樹(4)
發(fā)表時間:2024-05-20 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]4.5.構(gòu)造生成點擊樹型XMl顯示詳細節(jié)點內(nèi)容的Servlet在點擊樹的樹杈節(jié)點時,會使當前點擊節(jié)點發(fā)生變化,這種變化會要反映到節(jié)點的詳細狀態(tài)信息顯示上,這種頁面之間的通訊在這里是通過改變cookie中的點擊對象的值來傳遞的,使用這種方式的原因有:一,處理反應(yīng)快,因為只是對客戶端的cookie進行...
4.5.構(gòu)造生成點擊樹型XMl顯示詳細節(jié)點內(nèi)容的Servlet
在點擊樹的樹杈節(jié)點時,會使當前點擊節(jié)點發(fā)生變化,這種變化會要反映到節(jié)點的詳細狀態(tài)信息顯示上,這種頁面之間的通訊在這里是通過改變cookie中的點擊對象的值來傳遞的,使用這種方式的原因有:
一,處理反應(yīng)快,因為只是對客戶端的cookie進行一些簡單的讀寫操作,避免了一些較為煩瑣,耗時的通訊和服務(wù)器處理過程;
二,對點擊的安全性要求不高,點擊對象是顯式操作的,沒有敏感的客戶信息和服務(wù)器信息,所以是可以保存在客戶端的cookie中的;
三,代碼編寫,維護較為簡單,在點擊頁面中只是需要用javascript把點擊對象寫入cookie中,再刷新節(jié)點詳細顯示頁面即可,在節(jié)點詳細顯示頁面也只是節(jié)點向服務(wù)器重新請求一次該頁面;
實現(xiàn)節(jié)點詳細信息的頁面的主體仍是由XMLServlet生成的XML樹,實現(xiàn)XSL模版的是Servlet XMLTreeXSL,該XSL主要是在XML提取符合要求的節(jié)點,顯示節(jié)點的詳細信息,并把節(jié)點的最近子節(jié)點的詳細信息顯示出來,確認符合要求的節(jié)點是通過提取客戶端瀏覽器cookie中的點擊對象記錄得到的.所以該Servlet完成兩部分任務(wù),讀取瀏覽器cookie然后書寫XSL.下面是對該Servlet代碼的主要分析:
/**讀取cookie和書寫XSL*/
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try{
/**確認有XML樹需要進行模版轉(zhuǎn)換,通過Session中是否含有Sessionbean來確認*/
HttpSession session=request.getSession();
if( session.getAttribute("ResultEditHandle")==null) {
flag=false;
}
else {
flag=true;
}
if (flag) {
/**cookie中可能含有多個子cookie信息,用一個數(shù)組保存多個cookie*/
javax.servlet.http.Cookie cookies[] = request.getCookies();
String t_click_id = null;
/**書寫XSL還需要遵循XML書寫規(guī)范,標簽要一一對應(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”是對所有的node進行訪問,而不僅僅局限于頂層的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的個數(shù)不為零,遍歷cookie*/
else {
for(int i = 0;i < cookies.length; i++){
javax.servlet.http.Cookie c =cookies[i];
/**當遍歷的子cookie的名稱為ClickId時書寫XSL*/
if ( c.getName().equals("ClickId")){
/**t_click_id的值為點擊對象的id*/
…
4.6.Servlet調(diào)用的Session Bean的構(gòu)造
XML樹是從數(shù)據(jù)庫中得到相應(yīng)結(jié)果集而構(gòu)造的,這個結(jié)果集如果不采用EJB的方式可以用ResultSet來完成,但是如果考慮采用EJB來做,那么就需要放棄使用ResultSet,因為它是不可序列化,不能直接為EJB所用,使用RowSet或者CachedRowSet這些可序列化的結(jié)果集對象來實現(xiàn).
這里構(gòu)造的SessionBean是有狀態(tài)的,需要構(gòu)造的有遠程接口,home接口和bean類.
遠程接口, ResultEdit.java
home接口, ResultEditHome.java
bean類, ResultEditBean.java
對如何實現(xiàn)bean類進行詳細描述,
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)建,該方法是每個EJB定義都必須有,方法里面包含EJB的創(chuàng)建過程*/
public void ejbCreate() {
try {
/**容器初始化*/
ctx = new InitialContext();
/**從容器獲得DataSource名稱為imis的實例*/
ds = (DataSource)ctx.lookup("java:comp/env/imis");
}
catch (Exception e) {
System.out.println("ejbCreate failed:"+e.getMessage());
e.printStackTrace();
}
}
/**以下幾個ejb開頭的方法是構(gòu)造EJB時必須的,分別處理著相應(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,該方法在遠程接口中有定義*/
public RowSet getRowSet() throws SQLException {
return crset;
}
/**setRowSet(String sqlExp)通過定義好的數(shù)據(jù)源連接數(shù)據(jù)庫,并用查詢語句獲得結(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ā)布的完整過程.