你平时是如何使用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());
}
闽公网安备 35060202000074号