你平时是如何使用JSP操作数据库呢?对于jsp+javaBean模式,想必大家都已经很熟悉了,我们可以将获取数据库连接,查询,更新甚至将其它的功能都封装进javaBean----

好了--下面让我们来好好弄清楚一个问题:**你如何在JSP页中取得DB中的数据?从javaBean中返回ResultSet,然后在JSP中枚举吗?如果是这样的话,那我强烈建议你把这篇文章读完。*^_^*

用javaBean封装数据库操作谁不会?--对啊,大家都会,但是--如果构建一个高扩展性的“结构”?这就要用到java的相关知识了。废话少说,我们先在Tomcat中创建一个DataSource- jdbc/Panabia,然后再创建一个java“基类”,这个类封装了数据库连接和连接的释放:[程式中有相应的注解]

CODE:
--------------------------------------------------------------------------------

package Panabia.db; 


import javax.sql.DataSource; 

import javax.naming.*; 

import java.sql.*; 


public class SQLFactory 

{ 

     

 private static DataSource ds=null; 

 private static Object Lock=new Object(); 


//生成DataSource** 

public static DataSource gainDataSource(){ 

try{ 

 if(ds==null){ 

    synchronized(Lock){ 

     if(ds==null){ 

        Context ctx=new InitialContext(); 

          ds=(DataSource)ctx.lookup("java:comp/env/jdbc/Panabia"); 

       } 

     } 

   } 

 } 

 catch(NamingException e){e.printStackTrace();} 

 return ds; 

}  


//生成SQL连接** 

public static synchronized Connection gainConnection(){ 

 Connection con=null; 

 try{ 

  if(ds==null){ 

   gainDataSource(); 

   } 

   con=ds.getConnection(); 

 } 

 catch(SQLException e){e.printStackTrace();} 

 return con;     

} 


//释放SQL连接** 

public static void releaseConnection(ResultSet rs,PreparedStatement ps,Statement sql,Connection con){ 

try{ 

   if(rs!=null) 

   rs.close(); 

   } 

   catch(SQLException e){e.printStackTrace();} 

try{ 

    if(ps!=null) 

    ps.close();  

   } 

   catch(SQLException e){e.printStackTrace();} 

try{ 

    if(sql!=null) 

    sql.close(); 

   } 

   catch(SQLException e){e.printStackTrace();}  

try{  

   if(con!=null&&!con.isClosed())  

   con.close(); 

  } 

  catch(SQLException e){e.printStackTrace();} 

 } 

}




--------------------------------------------------------------------------------


大家都应该注意到了,这个类的所有的方法全部是static的,之所以这样,主要是为了方便其它“扩展类”的调用,当然,还有其它好处--- :)

好了,这个类就封装完毕了,现在我们就可以针对不同的应用要求单独写javaBean了,比如一个简单的:在JSP中列出verify表中的所有用户名与密码列表-

该怎么做?--使用SQLFactory生成Connection,再生成Statement,再生成ResultSet--然后枚举吗?好象不错,哦,等等......这样做你难道没有一种“非常亲切”的感觉吗?---对了,ASP,PHP中就是如此-Faint~我们怎么又回到“原始社会”了....

有没有更好的方式?答案是肯定的,JAVA的能力是“通天”的强大,只要你能想得到,仔细看看它的API Document,就不难找出解决办法。
答案出来了:
我们在查询类中返回Iterator到JSP枚举,而不是ResultSet。
好了,我们的UserQuery类就产生了:

CODE:
--------------------------------------------------------------------------------

package Panabia.operate; 


import Panabia.db.SQLFactory; 

import java.util.*; 

import java.sql.*; 


public class UserQuery{ 

  

 private ArrayList list=null; 

 private Connection con=null; 

 private Statement sql=null; 

 private ResultSet rs=null; 

  

 public Iterator getResult(){ 

   try{ 

     con=SQLFactory.gainConnection(); 

     sql=con.createStatement(); 

     rs=sql.executeQuery("select * from verify"); 

                          //verify表只有两个字段:username,password; 

      list=new ArrayList(); 

       while(rs.next()){ 

         list.add(rs.getString(1)); 

         list.add(rs.getString(2)); 

           } 

     } 

     catch(SQLException e){e.printStackTrace();} 

     finally{SQLFactory.releaseConnection(rs,null,sql,con);}  

      return list.iterator(); 

     } 

}




--------------------------------------------------------------------------------



然后,就是在JSP页中进行数据的枚举:因为发现cnjbb不支持html标签的显示,所以,只贴出了JSP中的全部java代码片--

........ 

Iterator it=UserQuery.getResult(); 

 while(it.hasNext()){ 

  out.print((String)it.next()); 

  } 

..........



就是这么简单,一个循环就搞定了。


我承认,就这样把数据“裸列”出来实是“不雅”,想美化?---如果你会,那就开始做;如果觉得自己水平不行,你就需要找一个网页美工来帮你了;和网页美工配合并不是难事儿,只要将html标签简单的插入Java scriptlet中就OK了--很明显,这个比在JSP中枚举ResultSet的情况好多了,不会“牵一发而动全身”。

尚不完善的地方:虽然情况好了一些,但当使用ArrayList取出体积很大的数据时,会相当耗费系统资源[系统会在内存单独开一块空间存放结果]---相关的优化方法是有的,我在这里就不作陈述了,大家可以参考一下其它的相关资料。