Tomcat5.5链接Oracle、DB2、MySQL数据源实现JSP下拉框的填充
作者:leizhimin
日期:2006年11月29日星期三
天气:晴
背景:在做jsp页面过程中,常常有一些下拉框的表单,表单的内容都是数据库中某些代码表的code(代码)和name(名称)字段。通常JSP页面中要显示这些下拉选择框的时候,都是按照标准业务去做,比如通过后台方法获取到要显示代码和名称的集合,然后传递个前台的方法,最后在页面通过struts标签或者别的技术来实现。这样做的好处之一就是代码周整,但是也比较麻烦,效率也不高。目前我做了一个web应用,又大量的代码表要在页面中中以下拉选择框来展示,并且不用任何其他的框架,针对这种情况,写一个静态工具类实现,类方法直接返回要展示的下拉列表内容。实现方式如下:
一、建立表,并填充数据:
建表的Oracle SQL如下:
――――――――――――――――――
create table DM_HY
(
HY_DM VARCHAR2(6) not null,
HY_MC VARCHAR2(200) not null,
MLBZ CHAR(1) not null,
DLBZ CHAR(1) not null,
ZLBZ CHAR(1) not null,
XLBZ CHAR(1) not null,
FQHY VARCHAR2(6),
XYBZ CHAR(1) not null
);
-- Add comments to the table
comment on table DM_HY
is '行业代码表';
-- Add comments to the columns
comment on column DM_HY.HY_DM
is '行业代码';
comment on column DM_HY.HY_MC
is '行业名称';
comment on column DM_HY.MLBZ
is '门类标志';
comment on column DM_HY.DLBZ
is '大类标志';
comment on column DM_HY.ZLBZ
is '中类标志';
comment on column DM_HY.XLBZ
is '小类标志';
comment on column DM_HY.FQHY
is '父亲类型';
comment on column DM_HY.XYBZ
is '选用标志';
插入数据:
insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ)
values ('01', '农、林、牧、渔业', 'Y', 'N', 'N', 'N', null, 'Y');
insert into DM_HY (HY_DM, HY_MC, MLBZ, DLBZ, ZLBZ, XLBZ, FQHY, XYBZ)
values ('010200', '林业', 'N', 'Y', 'Y', 'Y', '01', 'Y');
。。。。。。
二、配置数据源
配置方法:根据数据库类型修改apache-tomcat-5.5.20\conf下的context.xml内容为:
1、 Tomcat种的Oracle数据源
―――――――――――――――――――――――――――
<!-- The contents of this file will be loaded for each web application -->
<Context privileged='true'>
<Resource name="zfvims/zfvimsds"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@192.168.0. 2:1521: orcl"
username=" zfvims"
password="leizhimin"
maxIdle="30"
maxWait="10000"
maxActive="100"
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"/>
</Context>
―――――――――――――――――――――――――――
2、 Tocmat中的DB2数据源
―――――――――――――――――――――――――――
<!-- The contents of this file will be loaded for each web application -->
<Context privileged='true'>
<Resource name="zfvims/zfvimsds"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.ibm.db2.jcc.DB2Driver"
url="jdbc:db2: zfvims"
username=“zfvims”
password=" leizhimin"
maxIdle="30"
maxWait="10000"
maxActive="100"
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"/>
</Context>
―――――――――――――――――――――――――――
3、 Tocmat中的MySQL数据源
―――――――――――――――――――――――――――
<!-- The contents of this file will be loaded for each web application -->
<Context privileged='true'>
<Resource name="zfvims/zfvimsds"
auth="Container"
type="javax.sql.DataSource"
driverClassName=" com.mysql.jdbc.Driver "
url=" jdbc:mysql://192.168.0.2:3306/zfvims"
username=“zfvims”
password=" leizhimin"
maxIdle="30"
maxWait="10000"
maxActive="100"
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"/>
</Context>
―――――――――――――――――――――――――――
注意:Oracle和DB2 JDBC连接的URL有较大差别,其中Oracle中url="jdbc:oracle:thin:@192.168.3.12:1521:orcl"的orcl表示数据库SID,一个SID下面的可以有多个用户,每个用户对应自己的数据库。DB2中url="jdbc:db2:zfvims"其中的zfvims是数据库的别名;MySQL中的url=" jdbc:mysql://192.168.0.2:3306/zfvims"其中的zfvims却是数据库的实名。
三、写工具类
package com.zfvims.common.utils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
/**
* File Name: PageComboxOptions.java
* Created by: IntelliJ IDEA.
* Copyright: Copyright (c) 2003-2006
* Author: leizhimin
* Modifier: leizhimin
* Date Time: 2006-11-29 8:58:42
* Readme: jsp页面中的选择控件(Combox)之选项列表获取工具类
*/
public final class PageComboxOptions {
private static final Log log = LogFactory.getLog(PageComboxOptions.class);
private static Connection conn;
private static Statement stmt;
private static ResultSet rs;
//行业类别SQL
private static final String SQL_HYLB = "select '<option value=\"' || t.hy_dm || '\">' || t.hy_dm || '-' || t.hy_mc || '</option>' from dm_hy t order by t.hy_dm";
static {
try {
//建立数据库连接
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/zfvims/zfvimsds");
conn = ds.getConnection();
} catch (Exception e) {
log.error("获取数据库链接出现错误,请检查PageComboxOptions.java和连接池的配置!");
e.printStackTrace();
}
}
/**
* @return 获取行业类别下拉列表HTML串
*/
public static String getOptionsHYLB() {
String optionHTML = "";
try {
conn.setAutoCommit(false);
//创建一个JDBC声明
stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
//执行查询
rs = stmt.executeQuery(SQL_HYLB);
optionHTML = result2String(rs);
//关闭数据库连结
rs.close();
stmt.close();
} catch (SQLException e) {
log.error("查询行业类别出错,请检查!");
e.printStackTrace();
}
return optionHTML;
}
/**
* @return 结果集的String组合串
*/
private static String result2String(ResultSet rs) throws SQLException {
String optionHTML = "";
while (rs.next()) {
optionHTML = optionHTML + rs.getString(1);
}
return optionHTML;
}
}
说明:这个工具类会一直占用一个数据库连接,为所有需要展示代码表的页面服务。这比每次当页面有代码表需要展示的时候,调用后台方法获取一次数据库连接然后又返回到池更高效。尤其是当系统很庞大的时候,这种优势尤为明显。当然也可以将静态的获取连接的代码块做成一个静态方法,然后分别在每个方法中获取连接。这样实质上每次取出一个代码表,都要获取一次连接,效率也不高,并且每次都要取连接,关闭连接(归池),本人不推荐这种做法。
四、写测试页面
写一个测试页面,在页面中导入工具类PageComboxOptions,然后直接调用其静态方法获取展示需要的html字符串代码,测试页面代码如下:
testoption.jsp
――――――――――――――――――――――――――――――――
<%@ page import="com.zfvims.common.utils.PageComboxOptions"%>
<%--
Created by IntelliJ IDEA.
User: leizhimin
Date: 2006-11-29
Time: 11:19:02
--%>
<%@ page contentType="text/html;charset=GBK" language="java" %>
<html>
<head><title>Simple jsp page</title></head>
<body>
<form action="#" method="post">
<table>
<tr>
<td>行业类型</td>
<td >
<select name="hylb">
<%=PageComboxOptions.getOptionsHYLB()%>
</select>
</td>
</tr>
</table>
</form>
</body>
</html>
――――――――――――――――――――――――――――――――
五、看看页面效果
Web应用的完整配置组成就不赘述了,下面看看运行后的效果:
《完》