分享
 
 
 

Linux 网络服务器构架实务之七

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

/*------------------------------------------------------------------------

写在前面:

我看到很多网友的提问都跟服务器配置有关,搭建一个可靠而又安全的应用开发服务器是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台湾

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有