注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 IB客座主编(四)美国西蒙公..
 帮助

Tomcat5.5链接Oracle、DB2、MySQL数据源实现JSP下拉框的填充


2006-11-29 15:12:30
Tomcat5.5链接OracleDB2MySQL数据源实现JSP下拉框的填充
 
作者:leizhimin
日期:20061129星期三
天气:晴
 
背景:在做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>
―――――――――――――――――――――――――――
 
注意OracleDB2 JDBC连接的URL有较大差别,其中Oracleurl="jdbc:oracle:thin:@192.168.3.12:1521:orcl"orcl表示数据库SID,一个SID下面的可以有多个用户,每个用户对应自己的数据库。DB2url="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应用的完整配置组成就不赘述了,下面看看运行后的效果:
 
《完》
 
 
 
 
 
 




    文章评论
 
2006-11-29 15:14:50
很郁闷,帖子老是超出长度限制,希望51cto放宽一下帖子大小的限制!图片没法贴了!

2006-11-29 15:27:08
因为你的文章是从word粘贴过来的,自带了很多代码,远远不是你肉眼看到的这么多哦。你点击一下编辑器里的“源码”,就能看到你的真正字数了。现在的最低字数限制是8万(http://51ctoblog.blog.51cto.com/blog/26414/5591)。已经不算少了。
你可以把文字放进记事本里过滤一下,再拿出来字数就很少啦……

2006-11-29 17:43:00
多谢提示,看来发文章之前还是不用word编辑了!

2006-11-29 17:44:52
对的,可以先备好份,然后在博客编辑器里编辑就可以了。

2006-11-29 17:51:51
不错,写得很细致!

2006-11-30 13:33:35
学习了,谢谢!

2006-11-30 16:06:19
博主,我有事找你~
欢迎加入我们的qq群14541432,或者加我msn:zhangxi8288@hotmail.com

2006-11-30 21:45:45
好的,我平时很少上qq,一般都用msn,我已从msn加你了。

2006-12-02 12:15:51
对帖子内容补充:
本人在编辑帖子后,提交多次还是无法更新帖子内容,打算在这里补充进来,补充内容如下:

Tocmat中的DB2数据源
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://192.168.0.2:50000/zfvims"
            username=“zfvims”
            password=" leizhimin"
            maxIdle="30"
            maxWait="10000"
            maxActive="100"
            removeAbandoned="true"
                  removeAbandonedTimeout="60"
                  logAbandoned="true"/>
</Context>
―――――――――――――――――――――――――――
第二种:数据库别名连接方式
―――――――――――――――――――――――――――
<!-- 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>
―――――――――――――――――――――――――――

注意:Oracle和DB2 JDBC连接的URL有较大差别,其中Oracle中url="jdbc:oracle:thin:@192.168.3.12:1521:orcl"的orcl表示数据库SID,一个SID下面的可以有多个用户,每个用户对应自己的数据库。DB2中的实名连接方式url="jdbc:db2://192.168.0.2:50000/zfvims"中的zfvims是数据库的实名,50000是数据库的(默认)服务端口号。DB2中的别名连接方式url="jdbc:db2:zfvims"其中的zfvims是数据库的别名;MySQL中的url=" jdbc:mysql://192.168.0.2:3306/zfvims"其中的zfvims却是数据库的实名,3306是MySQL的(默认)服务端口。

欢迎各位多加评论!


2007-01-09 15:06:30
最后,我再把我写的系统中的应用程序代码给出,看看怎么写的:
package com.topsoft.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.*;
/**
* File Name: PageComboxOptions.java
* Created by: IntelliJ IDEA.
* Copyright: Copyright (c) 2003-2006
* Company:   TopSoft( http://www.topnet.net.cn)
* 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";
  //企业类型SQL
  private static final String SQL_QYLX = "select '<option value=\"' || t.qylx_dm || '\">' || t.qylx_dm || '-' || t.qylx_mc ||'</option>' from dm_qylx t order by t.qylx_dm";
  //管辖单位SQL(老的,暂时不用了)
  private static final String SQL_GXDW = "select '<option value=\"' ||trim( char(t.id)) ||'\">' || t.code || '-' || t.name || '</option>' from a_organ t where t.organtypecode in ('E', 'P') order by t.id";
  //行政区划SQL
  private static final String SQL_XZQH = "select '<option value=\"' || t.xzqh_dm || '\">' || t.xzqh_dm || '-' || t.xzqh_mc || '</option>' from dm_xzqh t order by t.xzqh_dm asc ";
  //信用大类SQL
  private static final String SQL_XYDL = "select '<option value=\"' ||trim( char(t.bs)) ||'\">' || t.dlmc ||'</option>' from xy_xydl t where t.xybz = 1 order by t.lx";
  //信用小类SQL
  private static final String SQL_XYXL = "select '<option value=\"' ||trim( char(a.bs)) ||'\">' || b.dlmc||'-'||a.xlmc ||'</option>' from xy_xyxl a,xy_xydl b where a.xybz = 1 and a.dlbs = b.bs order by b.dlmc desc";
  //管辖单位SQL_GXDW_PRE(最新的,现在用的)
  private static final String SQL_GXDW_PRE = "select '<option value=\"' || trim(char(z.id)) || '\">' || z.code || '-' || z.name || '</option>'\n" +
        " from a_organ z,\n" +
        "     (select *\n" +
        "       from a_organ m\n" +
        "       where m.code =\n" +
        "           (select case y.organtypecode\n" +
        "                 when 'D' then\n" +
        "                 (select x.code from a_organ x where x.id = y.parent)\n" +
        "                 when 'S' then\n" +
        "                 (select x.code from a_organ x where x.id = y.parent)\n" +
        "                 else\n" +
        "                 y.code\n" +
        "               end\n" +
        "             from a_organ y\n" +
        "           where y.id = ?)) w\n" +
        " where substr(z.code, 1, integer(w.grade)) =\n" +
        "     substr(w.code, 1, integer(w.grade))\n" +
        "   and z.organtypecode in ('P', 'E')";
  static {
    try {
        //建立数据库连接
        Context ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/topicms3ds"); //tomcat数据源
        //DataSource ds = (DataSource) ctx.lookup("topicms3ds");   //DB2数据源
        conn = ds.getConnection();
    } catch (Exception e) {
        log.error("获取数据库链接出现错误,请检查PageComboxOptions.java和连接池的配置!");
        e.printStackTrace();
    }
  }
  /**
  * @return 获取行业类别下拉列表串
  */
  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 获取企业类型下拉列表串
  */
  public static String getOptionsQYLX() {
    String optionHTML = "";
    try {
        conn.setAutoCommit(false);
        //创建一个JDBC声明
        stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        //执行查询
        rs = stmt.executeQuery(SQL_QYLX);
        optionHTML = result2String(rs);
        //关闭数据库连结
        rs.close();
        stmt.close();
    } catch (SQLException e) {
        log.info("查询企业类型出错,请检查!");
        e.printStackTrace();
    }
    return optionHTML;
  }
  /**
  * @return 获取管辖单位下拉列表串
  */
  public static String getOptionsGXDW() {
    String optionHTML = "";
    try {
        conn.setAutoCommit(false);
        //创建一个JDBC声明
        stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        //执行查询
        rs = stmt.executeQuery(SQL_GXDW);
        optionHTML = result2String(rs);
        //关闭数据库连结
        rs.close();
        stmt.close();
    } catch (SQLException e) {
        log.info("查询管辖单位出错,请检查!");
        e.printStackTrace();
    }
    return optionHTML;
  }
  public static String getOptionsGXDW(String orgIdStr) {
    String optionHTML = "";
    long orgid = Long.parseLong(orgIdStr);
    try {
        conn.setAutoCommit(false);
        //创建一个JDBC声明
        PreparedStatement pstmt = conn.prepareStatement(SQL_GXDW_PRE, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
        //设置预定义参数
        pstmt.setLong(1, orgid);
        //执行查询
        rs = pstmt.executeQuery();
        optionHTML = result2String(rs);
        //关闭数据库连结
        rs.close();
        pstmt.close();
    } catch (SQLException e) {
        log.info("查询管辖单位出错,请检查!");
        e.printStackTrace();
    }
    return optionHTML;
  }
  /**
  * @return 获取行政区划下拉列表串
  */
  public static String getOptionsXZQH() {
    String optionHTML = "";
    try {
        conn.setAutoCommit(false);
        //创建一个JDBC声明
        stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        //执行查询
        rs = stmt.executeQuery(SQL_XZQH);
        optionHTML = result2String(rs);
        //关闭数据库连结
        rs.close();
        stmt.close();
    } catch (SQLException e) {
        log.info("查询行政区划出错,请检查!");
        e.printStackTrace();
    }
    return optionHTML;
  }
  /**
  * @return 获取信用大类下拉列表串
  */
  public static String getOptionsXYDL() {
    String optionHTML = "";
    try {
        conn.setAutoCommit(false);
        //创建一个JDBC声明
        stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        //执行查询
        rs = stmt.executeQuery(SQL_XYDL);
        optionHTML = result2String(rs);
        //关闭数据库连结
        rs.close();
        stmt.close();
    } catch (SQLException e) {
        log.info("查询信用大类出错,请检查!");
        e.printStackTrace();
    }
    return optionHTML;
  }
  /**
  * @return 获取信用小类下拉列表串
  */
  public static String getOptionsXYXL() {
    String optionHTML = "";
    try {
        conn.setAutoCommit(false);
        //创建一个JDBC声明
        stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
        //执行查询
        rs = stmt.executeQuery(SQL_XYXL);
        optionHTML = result2String(rs);
        //关闭数据库连结
        rs.close();
        stmt.close();
    } catch (SQLException e) {
        log.info("查询信用小类出错,请检查!");
        e.printStackTrace();
    }
    return optionHTML;
  }
  /**
  * @return 结果集的String组合串
  */
  private static String result2String(ResultSet rs) throws SQLException {
    String optionHTML = "";
    while (rs.next()) {
        optionHTML = optionHTML + rs.getString(1)+"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
    }
    return optionHTML;
  }
}

2007-07-24 08:49:28
tomcat 5.0的conf下没有context.xml?

2007-07-24 09:01:33
tomcat 5.0下确实没有这个文件,但是你可以在 。。conf\Catalina\localhost 下面的的web应用配置描述文件中将数据源的配置写上,也是可以的。。

最原始的就是修改conf下的server.xml,都可以达到同样的目的。

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: