bean和普通的类没有任何区别,只是多了一种规范,它就是类.但生命周期是根据你指定的PAGE,SESSION,APPLICATION,普通类不行,运行完了就死了.
From: http://aspfans.yeah.net
需要用到两个程序,jsp文件和数据库操作的java bean
Select.jsp
<html>
<head>
<title>Select everything from a database</title>
</head>
<body>
<jsp:useBean id="select" class="DataBaseSelect" scope="request">
</bean>
<% out.print(select.connect()); %>
<% out.print(select.select()); %>
<p>Format results
<%@ page import="java.util.Vector" %>
<% Vector aResult = select.getResult(); %>
<table>
<% for (int i=0; i < aResult.size(); i++) { %>
<tr>
<td>
<% out.print(aResult.elementAt(i)); %>
</td>
</tr>
<% } %>
</table>
</body>
</html>
DataBaseSelect.java
import java.sql.*;
import java.util.Vector;
public class DataBaseSelect {
private Vector result;
public DataBaseSelect() {
result = new Vector();
} // constructor DataBaseSelect
public String connect() {
try {
Class.forName("a jdbc driver").newInstance();
return "Driver Loaded!";
} catch (Exception E) {
return "Unable to load driver.";
}
}
public String select() {
try {
Connection C = DriverManager.getConnection("database connection string");
Statement Stmt = C.createStatement();
ResultSet myResult = Stmt.executeQuery("SELECT acolumn from atable");
while (myResult.next()) {
result.addElement(myResult.getString(1));
}
// Clean up
myResult.close();
Stmt.close();
C.close();
return "Connection Success!";
} catch (SQLException E) {
return "SQLException: " + E.getMessage();
}
}
/**
* Accessor for result
**/
public Vector getResult() {
return result;
}
/**
* Mutator for result
**/
public void setResult(Vector avector) {
result = avector;
}
} // class DataBaseSelect
(转载请注明来源)
From: http://aspfans.yeah.net
SERVELT也是一种类,不过它的生命周期不能由你来控制,它从第一次访问始到服务器停止或就一直生存在内存中,并且它是多线程响应用户的请求.这就是JSP和别的CGI的本质区别,效率是ASP,PHP,PERL,C这些CGI的N倍.因为它们都是多进程的.当然asp plus(c#)现在好模仿这种机制了.
你平时是如何使用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取出体积很大的数据时,会相当耗费系统资源[系统会在内存单独开一块空间存放结果]---相关的优化方法是有的,我在这里就不作陈述了,大家可以参考一下其它的相关资料。
BTW:SQLFactory.java中的方法如有写得不恰当的地方,还请各位DX指出,修正
论坛相关链接:
http://www.cnjbb.org/thread.jsp?boardid=3&threadid=41812&pageno=last#lastpost
From: http://aspfans.yeah.net
需要用到两个程序,jsp文件和数据库操作的java bean
Select.jsp
<html>
<head>
<title>Select everything from a database</title>
</head>
<body>
<jsp:useBean id="select" class="DataBaseSelect" scope="request">
</bean>
<% out.print(select.connect()); %>
<% out.print(select.select()); %>
<p>Format results
<%@ page import="java.util.Vector" %>
<% Vector aResult = select.getResult(); %>
<table>
<% for (int i=0; i < aResult.size(); i++) { %>
<tr>
<td>
<% out.print(aResult.elementAt(i)); %>
</td>
</tr>
<% } %>
</table>
</body>
</html>
DataBaseSelect.java
import java.sql.*;
import java.util.Vector;
public class DataBaseSelect {
private Vector result;
public DataBaseSelect() {
result = new Vector();
} // constructor DataBaseSelect
public String connect() {
try {
Class.forName("a jdbc driver").newInstance();
return "Driver Loaded!";
} catch (Exception E) {
return "Unable to load driver.";
}
}
public String select() {
try {
Connection C = DriverManager.getConnection("database connection string");
Statement Stmt = C.createStatement();
ResultSet myResult = Stmt.executeQuery("SELECT acolumn from atable");
while (myResult.next()) {
result.addElement(myResult.getString(1));
}
// Clean up
myResult.close();
Stmt.close();
C.close();
return "Connection Success!";
} catch (SQLException E) {
return "SQLException: " + E.getMessage();
}
}
/**
* Accessor for result
**/
public Vector getResult() {
return result;
}
/**
* Mutator for result
**/
public void setResult(Vector avector) {
result = avector;
}
} // class DataBaseSelect
(转载请注明来源)
From: http://aspfans.yeah.net
SERVELT也是一种类,不过它的生命周期不能由你来控制,它从第一次访问始到服务器停止或就一直生存在内存中,并且它是多线程响应用户的请求.这就是JSP和别的CGI的本质区别,效率是ASP,PHP,PERL,C这些CGI的N倍.因为它们都是多进程的.当然asp plus(c#)现在好模仿这种机制了.
你平时是如何使用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取出体积很大的数据时,会相当耗费系统资源[系统会在内存单独开一块空间存放结果]---相关的优化方法是有的,我在这里就不作陈述了,大家可以参考一下其它的相关资料。
BTW:SQLFactory.java中的方法如有写得不恰当的地方,还请各位DX指出,修正
论坛相关链接:
http://www.cnjbb.org/thread.jsp?boardid=3&threadid=41812&pageno=last#lastpost