繁体中文
设为首页
加入收藏
当前位置:JSP技术首页 >> Java与XML >> 用Java实现可保存状态的数据库生成XML树(4)

用Java实现可保存状态的数据库生成XML树(4)

2004-10-01 08:26:10  作者:  来源:互联网  浏览次数:38  文字大小:【】【】【
简介:4.5.构造生成点击树型XMl显示详细节点内容的Servlet   在点击树的树杈节点时,会使当前点击节点发生变化,这种变化会要反映到节点的详细状态信息显示上,这种页面之间的通讯在这里是通过改变cookie中的点...

4.5.构造生成点击树型XMl显示详细节点内容的Servlet

在点击树的树杈节点时,会使当前点击节点发生变化,这种变化会要反映到节点的详细状态信息显示上,这种页面之间的通讯在这里是通过改变cookie中的点击对象的值来传递的,使用这种方式的原因有:

一,处理反应快,因为只是对客户端的cookie进行一些简单的读写操作,避免了一些较为烦琐,耗时的通讯和服务器处理过程;

二,对点击的安全性要求不高,点击对象是显式操作的,没有敏感的客户信息和服务器信息,所以是可以保存在客户端的cookie中的;

三,代码编写,维护较为简单,在点击页面中只是需要用javascript把点击对象写入cookie中,再刷新节点详细显示页面即可,在节点详细显示页面也只是节点向服务器重新请求一次该页面;

实现节点详细信息的页面的主体仍是由XMLServlet生成的XML树,实现XSL模版的是Servlet XMLTreeXSL,该XSL主要是在XML提取符合要求的节点,显示节点的详细信息,并把节点的最近子节点的详细信息显示出来,确认符合要求的节点是通过提取客户端浏览器cookie中的点击对象记录得到的.所以该Servlet完成两部分任务,读取浏览器cookie然后书写XSL.下面是对该Servlet代码的主要分析:

/**读取cookie和书写XSL*/

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

try{

/**确认有XML树需要进行模版转换,通过Session中是否含有Sessionbean来确认*/

HttpSession session=request.getSession();

if ( session.getAttribute("ResultEditHandle")==null) {

flag=false;

}

else {

flag=true;

}

if (flag) {

/**cookie中可能含有多个子cookie信息,用一个数组保存多个cookie*/

javax.servlet.http.Cookie cookies[] = request.getCookies();

String t_click_id = null;

/**书写XSL还需要遵循XML书写规范,标签要一一对应*/

response.setContentType(CONTENT_TYPE);

out = response.getWriter();

out.println(CONTENT_XSL);

out.println("");

out.println("");

out.println("");

/**select=”//node”是对所有的node进行访问,而不仅仅局限于顶层的node*/

out.println("");

if ((cookies == null)||(cookies.length == 0)){

out.println("No Clicked Node");

}

/**cookie不为空且子cookie的个数不为零,遍历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调用的Session Bean的构造

XML树是从数据库中得到相应结果集而构造的,这个结果集如果不采用EJB的方式可以用ResultSet来完成,但是如果考虑采用EJB来做,那么就需要放弃使用ResultSet,因为它是不可序列化,不能直接为EJB所用,使用RowSet或者CachedRowSet这些可序列化的结果集对象来实现.

这里构造的SessionBean是有状态的,需要构造的有远程接口,home接口和bean类.

远程接口, ResultEdit.java

home接口, ResultEditHome.java

bean类, ResultEditBean.java

对如何实现bean类进行详细描述,

public class ResultEditBean implements SessionBean {

/**Session容器定义*/

private SessionContext sessionContext;

public int id;

public String name;

/**结果集定义,定义结果集类型为sun.jdbc.rowset.CachedRowSet*/

private CachedRowSet crset=null;

/**容器定义*/

private Context ctx = null;

/**数据源定义*/

private DataSource ds = null;

/**构造函数*/

public ResultEditBean() {

}

/**EJB创建,该方法是每个EJB定义都必须有,方法里面包含EJB的创建过程*/

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开头的方法是构造EJB时必须的,分别处理着相应的事件*/

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)通过定义好的数据源连接数据库,并用查询语句获得结果集*/

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发布的完整过程.

责任编辑:admin
相关文章