/*------------------------------------------------------------------------
写在前面:
我看到很多网友的提问都跟服务器配置有关,搭建一个可靠而又安全的应用开发服务器是WEB编程的基础,尤其对于在LINUX上进行JSP开发的朋友而言。
这篇文档是我多年服务器配置的结晶,发表前已历经本人N此修改(最后一次大的修改是在RH7.2刚刚发布之即,而后一来由于忙于开发二来由于没有发现错误,所以没有升级),文档
于2001年底被天极网转载(http://www.yesky.com/20020206/217592.shtml),后经linuxbye.net,cnjsp.com等多个linux和JAVA社区转载,历经时间考验,至今未曾发现错误,各位尽可
放心使用。
文档在web页面的显示效果不够理想,如果您希望得到本文档的PDF,或有任何意见建议,可邮件至roczhao@msn.com
文档较长,分为多篇发布,这是第七篇,以下为正文:
-----------------------------------------------------------------------*/
例三:使用处理层连接数据库
##本例告诉你如何使用组件
##其实你完全可以写一个bean来处理数据库,而不用象例二那么罗索。只用四条语句就可以取出数据库中的所有数据并显示出来,这样做实现了处理层和逻辑层的彻底分离,由逻辑层发出指令、由处理层去响应相关处理,记录集也不会返回到逻辑层的jsp页面,而由处理层的bean处理,使得代码非常精简,效率也更高。至于如何书写组件不是本文档的重点,下面仅给出一个组件的例子并说明逻辑层的调用方法,你会发现其实逻辑层是个官僚,处理层是下属,呵呵。
1 创建处理层组件
下面的组件是我为公司写的数据库处理组件的简化版本,考虑到篇幅和可读性等问题,这里我简化了它的功能(象数据分页、批量更新、获取字段数和字段名称,用set和get提高其扩展性、对其他连库方法的支持等都没有出现在下面的代码中),使之包含所有常用的功能并使之更加清晰和易于理解;其二,我将连库动作加到了构造函数中,这是个优点也是个缺点,优点是简化了连库动作,缺点是降低了通用性,我没有添加设置数据源等方法,从而每当变换一次数据库就需要改写组件中的连接池名称,这在做一个固定项目的时候是可以的,如果你需要set数据源,可以自行添加;
##使用组件的方法:
我这里说的是使用bean的通用方法,你建立自己的bean目录可以仿照该例子。在你的站点根目录下建立resin.conf中指定的存放bean的目录,我上面的举例是classes,那你就建立classes目录,那么classes就是你站点的class根目录。然后在下面依次建立com\gledecity\yesgo\sql,注意它们之间是父子关系,不是同级文件夹,然后将下面即将建立的DBBridge.java放到”站点根目录\classes\com\gledecity\yesgo\sql”目录下,然后将该文件上传到服务器端即可。上面的步骤在微软平台上使用UltraDev之类的开发工具即可完成,当然手工也可以。
源文件如下:
//------------------------------------------------------------------------------
// File: DBBridge.java
// Copyright (c) 2001-2002 Mr.Fengjun Zhao. All Rights Reserved.
// Author: 赵凤君@06/18/01
// Last Revision: 赵凤君@01/18/2002
// Description: 数据库接口类。一个统一的数据库接口,实现了逻辑层和数据层的彻底分离,封装了常用的数据库操作。主要功能是:连接数据库、执行SQL语句、数据库取值操作、数据分页、清除数据、关闭数据库等。
// Version:简化版1.0
//------------------------------------------------------------------------------
//指定包目录
package com.gledecity.yesgo.sql;
//导入包
import java.sql.* ;
import com.caucho.sql.*;
public class DBBridge {
//声明属性
private DBPool pool ;
private Connection conn ;
private ResultSet rs ;
private Statement stmt ;
// -------------------------------------- 构造函数---------------------------------
public DBBridge() {
pool=null ;
conn=null ;
rs=null ;
stmt=null ;
try{open();}
catch(java.sql.SQLException ex){ex.toString();}
}
// ------------------------------------------------------------------------------------
//连接数据库的方法
public void open()
throws SQLException {
if( conn!=null && !conn.isClosed() )
throw new SQLException( "The connection has been established already." ) ;
clear () ;
pool=new DBPool();
conn = pool.getPool("your_data_source_name").getConnection();
}
//执行SQL语句的方法,将JDBC中的executeQuary()和executeUpdate()两个方法//合而为一,注意返回值为整形,
public int execSQL( String sqlStmt )
throws SQLException {
if( conn==null || conn.isClosed() )
throw new SQLException( "This connection has not been established yet." ) ;
if( sqlStmt==null )
throw new SQLException( "SQL-statement is null." ) ;
clear () ;
conn.setAutoCommit( true ) ;
stmt=conn.createStatement() ;
if( sqlStmt.toUpperCase().startsWith( "SELECT" ) ) {
rs=stmt.executeQuery( sqlStmt ) ;
return -1 ;
}
else {
int numRow=stmt.executeUpdate( sqlStmt ) ;
clear() ;
return numRow ;
}
}
//获取字段值,参数为整形——字段次序
public String getString( int fieldNo )
throws SQLException {
return rs.getString(fieldNo) ;
}
//获取字段值,参数为字符串——字段名
public String getString( String fieldName )
throws SQLException {
return rs.getString(fieldName) ;
}
//上移指针
public boolean previous()
throws SQLException {
if( rs==null )
throw new SQLException( "ResultSet is null." ) ;
return rs.previous() ;
}
//下移指针
public boolean next()
throws SQLException {
if( rs==null )
throw new SQLException( "ResultSet is null." ) ;
return rs.next() ;
}
//指针最上
public boolean first()
throws SQLException {
if( rs==null )
throw new SQLException( "ResultSet is null." ) ;
return rs.first() ;
}
//指针最下
public boolean last()
throws SQLException {
if( rs==null )
throw new SQLException( "ResultSet is null." ) ;
return rs.last() ;
}
//清除变量,当你仅需要清除变量而不关库时可调用此方法
private void clear () throws SQLException {
if( rs!=null ) rs.close() ;
rs=null ;
if( stmt!=null ) stmt.close() ;
stmt=null ;
}
//清除变量并关库
public void close() throws SQLException {
clear () ;
if( conn==null )
throw new SQLException( "This connection has been closed already." ) ;
if( conn.isClosed() )
throw new SQLException( "This connection has been closed." ) ;
conn.close() ;
conn=null ;
}
}
2 编写逻辑层代码
##在客户端创建dbbridge.jsp,然后上传到服务器端即可:
##上级要来视察某官僚的工作,只见该官僚指挥若定:
##逻辑层对处理层说:小子,去跟我的后台联络一下。 //连库并初始化
<jsp:useBean id=”bridge” class=”com.gledecity.yesgo.sql.DBBridge” />
##逻辑层对处理层说:把我们今年的工作成果准备一下。 //执行SQL语句
<%bridge.execSQL(“select * from prov”);
##逻辑层对处理层说:材料准备好了?干得好!上级一来看到一片数据。//循环显示
while(bridge.next())
{ out.print(bridge.getString("prov_id")+bridge.getString("prov_name")+"<br>");}
##逻辑层对处理层说:好了好了,政绩显示完毕,你们通通滚蛋吧。 //关闭所有变量
bridge.close();%>
##上级看后非常满意,拍拍官僚的肩膀:“干得不错!”官僚一高兴,说:“哪里哪里,都是下属办事得力!”
3 测试该程序
lynx http://www.yesgo.loc/dbbridge.jsp
##当然你也可以在客户端浏览器测试,只是你需要将你服务器的IP添加到你网络设置中的DNS列表中。
##处理的结果是数据库中所有的数据:
1安徽
2北京
3重庆
4福建
5甘肃
6广东
7广西
8贵州
9海南
10河北
11黑龙江
12河南
13湖北
14湖南
15内蒙古
16江苏
17江西
18吉林
19辽宁
20宁夏
21青海
22山西
23陕西
24山东
25上海
26四川
27天津
28西藏
29新疆
30云南
31浙江
32香港
33澳门
34台湾