欢迎光临
我们一直在努力

用Java实现可保存状态的数据库生成XML树(4)-JSP教程,Java与XML

建站超值云服务器,限时71元/月

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("<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的个数不为零,遍历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发布的完整过程.
 

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 用Java实现可保存状态的数据库生成XML树(4)-JSP教程,Java与XML
分享到: 更多 (0)

相关推荐

  • 暂无文章