`
zc4530
  • 浏览: 85535 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

JSP、Java实现选择框多级连动

阅读更多

 JSP、Java实现选择框多级连动

 
环境:
DB2 9.1
J2SDK 1.5
Servlet 2.4
 
 
一、问题
        在web开发中,经常会遇到两级三级甚至更多级的选项框连动的情况,一般情况下都考虑用js来实现,但是在有大量等级选项的情况下,js实现也很麻烦,并且页面反应很慢,抛弃了js,我们还能用什么来做呢?
        这是我在实际项目中遇到的一个问题,为了在有大量数据请况下不至于慢的无法接受,我打算用JSP/java来实现这个需求。下面我给出我做测试用的例子,以探求其可行性,是两级连动的,有数据回填功能。
        作为测试,业务很简单,第一个选择况是省,第二个显示省里的市,省市分别存储在数据库中的两个表province、city(实际项目中一般都用一个表)。另外还有个静态选择框和文本况,目的是演示数据回填功能。
        所谓的数据回填就是自动为客户回复填过的选项,比如你填写一个注册单,填写有错误,又返回了,在返回的时候,要把所有正确的填写项恢复回来,不必用户再从 头填写。(这个回填功能用struts很容易实现,但是我面对现实是不用struts、hibernate,呵呵,因为没有复杂业务处理,主要是报表页 面)。
        下面是省市两个建表SQL的(DB2脚本)
drop table province;
create table province(
code varchar(10),
name varchar(10));
insert into province (code,name) values('1','河南'),
('2','陕西'),
('3','河北');
drop table city;
create table city(
code varchar(10),
name varchar(10));
insert into city (code,name) values('1','郑州'),
('1','洛阳'),
('1','许昌'),
('1','焦作'),
('1','开封'),
('2','西安'),
('2','咸阳'),
('2','宝鸡'),
('3','石家庄'),
('3','唐山');
二、实现方法
1、两级连动
        在省选择框中读取所有省,当选项改变的时候触发一个js事件(onchange),将选择的省份代码和发送给自身页面,进一步显示该省下的城市选择框。
2、回填
        对于文本框回填,则将请求参数记录下来。
        对于静态选择框,将选择项记录下来,在再次进入页面时候利用查询,设置checked属性。
        对于动态文本框,有专门的后台方法来实现。
三、实现代码
实现很简单,就两个文件,一个后台工具类,一个页面就搞定了。
1、后台工具类
package test;
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.sql.DataSource;
import java.sql.*;
/**
 * File Name:   TestDBUitl.java
 * Created by:  IntelliJ IDEA.
 * Copyright:   Copyright (c) 2003-2006
 * Company:     TopSoft(
http://www.topnet.net.cn)
 * Author:      leizhimin
 * Modifier:    leizhimin
 * Date Time:   2007-3-6 14:05:42
 * Readme:      JSP实现多级选择框连动测试,后台工具类
 */
/**
 * 数据库工具类
 */

public final class TestDBUitl {
    /**
     * 通过数据源获取一个JDBC链接(如果没有配置数据源,可以将此完全方法注释掉,下面直接用JDBC的方式获取数据库连接)
     *
     * @return 一个JDBC链接
     */

    public static Connection getConnectionByJNDI() {
        try {
            //建立数据库连接
            Context ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/zfvds"); //tomcat数据源
            //DataSource ds = (DataSource) ctx.lookup("zfvds");    //Weblogic或者WebSphere数据源
            return ds.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 直接获取JDBC链接
     *
     * @return 一个JDBC链接(测试用,方便)
     */

    public static Connection getConnectionByJDBC() {
        Connection conn = null;
        try {
            //装载驱动类
            Class.forName("com.ibm.db2.jcc.DB2Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("装载驱动异常!");
            e.printStackTrace();
        }
        try {
            //建立JDBC连接
            conn = DriverManager.getConnection("jdbc:db2://192.168.3.8:50000/zfvims", "zfvims", "zfvimsdb2");
        } catch (SQLException e) {
            System.out.println("链接数据库异常!");
            e.printStackTrace();
        }
        return conn;
    }
    /**
     * 获取省份选项的html代码串
     * @param sect 要选择的省份
     * @param topage 要转向的页面
     * @return 省份选项的html代码串
     */

    public static String getProvinceOptions(String sect, String topage) {
        String optionHTML = "";
        Connection conn = getConnectionByJDBC();
        Statement stmt;
        ResultSet rs;
        String sqlx = "select t.code,t.name from province t order by t.code asc";
        try {
            //创建一个JDBC声明
            stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
            //执行查询
            rs = stmt.executeQuery(sqlx);
            while (rs.next()) {
                String code = rs.getString("code");
                String name = rs.getString("name");
                String linked = "\"" + topage + "?province=" + code + "\"";
                if (sect.equals(code)) {
                    optionHTML = optionHTML + "<option value=\"" + code + "\"" + "\" tourl=" + linked + " selected>" + code + "-" + name + "</option>\n\t\t";
                } else {
                    optionHTML = optionHTML + "<option value=\"" + code + "\" tourl=" + linked + ">" + code + "-" + name + "</option>\n\t\t";
                }
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        return optionHTML;
    }
    /**
     * 获取一个省份下城市选项的html代码串
     * @param pcode 省份
     * @param sect 默认选中的城市代码
     * @return 城市选项的html代码串
     */

    public static String getCityOptions(String pcode, String sect) {
        String optionHTML = "";
        Connection conn = getConnectionByJDBC();
        ResultSet rs;
        String sqlx = "select t.code,t.name from city t where t.code = ? order by t.code asc";
        try {
            //开始一个事务(注意关闭事务)
            conn.setAutoCommit(false);
            //创建一个JDBC声明
            PreparedStatement pstmt = conn.prepareStatement(sqlx, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
            //设置预定义参数
            pstmt.setString(1, pcode);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                String code = rs.getString("code");
                String name = rs.getString("name");
                if (sect.equals(code)) {
                    optionHTML = optionHTML + "<option value=\"" + code + "\"" + " selected>" + code + "-" + name + "</option>\n\t\t";
                } else {
                    optionHTML = optionHTML + "<option value=\"" + code + "\">" + code + "-" + name + "</option>\n\t\t";
                }
            }
            //提交事务
            conn.commit();
            //关闭连接等资源(注意先后顺序)
            rs.close();
            pstmt.close();
            conn.close();
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        } finally {
            //预防性关闭连接(避免异常发生时在try语句块关闭连接没有执行)
            try {
                if (conn != null) conn.close();
            } catch (SQLException e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
        }
        return optionHTML;
    }
}
2、测试用的页面
<%--
  File Name:    TestCheckBoxLinks.jsp
  Created by:   IntelliJ IDEA.
  Copyright:    Copyright (c) 2003-2006
  Company:      TopSoft(
http://www.topnet.net.cn)
  Author:       leizhimin 
  Modifier:     leizhimin
  Date:         2007-3-6 15:14:33
  Readme:       JSP、Java实现选择框连动,实现页面输入信息回填功能。
--%>

<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="test.TestDBUitl" %>
<%
    String rootPath = request.getContextPath();
    String topage = rootPath + "/pages/test/TestCheckBoxLinks.jsp";
    String province = request.getParameter("province");
    String city = request.getParameter("city");
    String stype = request.getParameter("stype");
    String author = request.getParameter("author");
    if (province == null || "null".equals(province)) province = "";
    if (city == null || "null".equals(city)) city = "";
    if (stype == null || "null".equals(stype)) stype = "";
    if (author == null || "null".equals(author)) author = "熔  岩";
%>
<html>
<head>
    <title>JSP、Java实现选择框连动,实现页面输入信息回填功能。</title>
</head>
<body>
<form method="post">
    <table>
        <tr>
            <td>省 份:</td>
            <td>
                <select name="province" onchange="getallpames(this)">
                    <option value="" tourl="/zfvims/pages/test/TestCheckBoxLinks.jsp">不限制</option>
                    <%=TestDBUitl.getProvinceOptions(province, topage)%>
                </select>
            </td>
            <td>城 市:</td>
            <td>
                <select name="city">
                    <option value="">不限制</option>
                    <%=TestDBUitl.getCityOptions(province, city)%>
                </select>
            </td>
        </tr>
        <tr>
            <td>类 型:</td>
            <td>
                <select name="stype">
                    <option value="04">A</option>
                    <option value="07">B</option>
                    <option value="11">C</option>
                    <option value="13">D</option>
                </select>
            </td>
            <script language="javascript">
                var a = document.all.stype.options;
                var n = a.length;
                for (var i = 0; i < n; i++) {
                    var b = document.all.stype.options[i].value;
                    if (b == "<%=stype%>") {
                        document.all.stype.options[i].selected = true;
                    }
                }
            </script>
            <td>作 者:</td>
            <td>
                <input type="text" name="author" value="<%=author%>" maxlength="20">
            </td>
        </tr>
    </table>
    <table>
        <tr>
            <td colspan="2"></td>
            <td><input type="button" name="CX" value="查询"></td>
            <td><input type="reset" value="重置"></td>
            <td colspan="2"></td>
        </tr>
    </table>
</form>
</body>
</html>
<script type="text/javascript">
    function getallpames(obj) {
        var pames = "&province=" + document.all.province.value;
        pames += "&city=" + document.all.city.value;
        pames += "&stype=" + document.all.stype.value;
        pames += "&author=" + document.all.author.value;
        var tourl = obj.options[obj.selectedIndex].tourl + pames;
        //alert(tourl);  //打印转向地址的开关
        window.location = tourl;
    }
</script>
三、评价
          这中做法适合有大量数据的情况下,即使数据很多,也不会很慢,但也在少量数据的情况下,速度和用户体验度上都不及JS的实现。现在的AJAX技术是个更好的选择,只是我还不会,呵呵。
这个例子在实际项目中应该慎用,因为需要考虑回填,校验等相关问题。
          数据库脚本稍作修改就可以用到其他数据库中,后台方法也一样,主要差别在于注册驱动和驱动url上面。
分享到:
评论

相关推荐

    ajax多级联动菜单

    【Ajax多级联动菜单】是一种常见的前端交互设计,它允许用户在选择某个菜单项时,自动更新下一级菜单的内容,以此类推,实现多级菜单之间的动态关联。这种技术广泛应用于网页表单填写、筛选器等场景,为用户提供更加...

    ajax+json实现多级联动菜单

    **需求分析**:假设我们需要在一个电商网站上实现商品分类的多级联动菜单,即当用户选择一级分类时,相应的二级分类自动更新显示。 ##### 2. **设计思路**: - 客户端通过点击事件触发Ajax请求。 - 服务器端根据...

    struts实现下拉框多级联动

    在Struts框架中实现下拉框的多级联动是一项常见的需求,比如在地址选择时,可以选择国家、省份、城市等,每一级的选择都会影响下一级的选项。 在Struts框架中,实现下拉框的联动通常涉及到以下几个关键知识点: 1....

    JSP页面下拉框三级联动

    其中,JSP(JavaServer Pages)页面中的下拉框三级联动功能,是一种常见的需求,用于处理多级分类数据的选择,如国家-省份-城市的选择。本文将深入解析如何在JSP页面中实现下拉框的三级联动功能,以及其背后的实现...

    java-数据库—省县区三级联动

    在这个场景中,我们关注的是"java-数据库—省县区三级联动"的功能实现,这通常用于地址选择或者地理信息相关的Web应用中。下面将详细阐述这个主题涉及的知识点。 首先,我们要理解的是数据库层面的内容。在提供的...

    js+jsp 联动下拉列表框

    - **多级联动**:通过扩展JavaScript逻辑,可以支持三级或更多级别的联动效果。 - **异步加载**:结合Ajax技术,可以在用户选择某个选项时异步加载子分类数据,提高用户体验。 - **响应式设计**:利用CSS媒体查询等...

    jsp二级联动

    在IT行业中,"jsp二级联动"是一个常见的网页交互功能,主要应用于下拉菜单或者选择框之间数据的联动更新。这个实例通常涉及到前端的HTML、CSS,以及后端的Java JSP技术,配合数据库来实现动态的数据交互。下面将详细...

    Java二级联动

    在Java中实现二级联动,主要涉及以下几个关键知识点: 1. **模型(Model)**:数据存储与管理。这通常涉及到数据库设计,如创建包含省、市、区三个层级的表结构,并通过关联关系来表示它们之间的上下级关系。比如,...

    JSP联动下拉菜单-易明白

    在本文中,我们将深入探讨如何使用JavaServer Pages (JSP) 实现联动下拉菜单,一个常见的前端交互功能。联动菜单允许用户在一个下拉框的选择影响另一个下拉框的显示内容,提供动态交互的用户体验。 首先,我们看到...

    纯JSP+DWR实现三级联动下拉选择菜单实现技巧

    在本文中,我们将探讨如何使用纯JSP和Direct Web Remoting (DWR) 实现一个三级联动下拉选择菜单。这种技术通常用于地理信息系统或组织结构等需要分层次选择的场景,用户可以从一系列相关的下拉菜单中进行选择,每个...

    三级联动java源码

    8. **状态管理**:在多级联动中,需要管理不同级别选择的状态,这可能涉及到JavaScript中的变量管理和事件监听。 9. **部署与运行**:理解如何在本地或服务器环境(如Tomcat)上部署和运行Java Web项目也是必要的...

    联动(struts2+json+jquey)

    然而,对于一些复杂的数据展示,如多级联动选择框,Struts2的内置标签可能无法满足需求,这就引出了JSON的角色。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于...

    下拉框二级联动

    在实现下拉框二级联动时,JSP通常用于构建后端逻辑,处理用户的选择,并返回相应的数据。 AJAX(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下与服务器交换数据并更新部分网页的技术。在二级...

    JSP+AJAX三级级联及更多级的实现

    在这个“JSP+AJAX三级级联及更多级的实现”主题中,我们将深入探讨如何通过这两种技术构建一个能够实现多级联动下拉菜单的系统,这种功能常见于地址选择、部门结构展示等场景。 首先,JSP是Java的一种服务器端脚本...

    三级联动数据库应用实例

    这种效果通常用于下拉菜单或者选择框,当用户在一级菜单中做出选择时,二级菜单会动态更新,接着选择二级菜单后,三级菜单也会相应地动态加载数据,提供用户更加直观便捷的交互体验。 【描述】中的"一个简单的web...

    三级联动,第一次从数据库拿,第二次从redis中拿

    "三级联动"是一种常见的数据交互模式,通常用于实现下拉菜单或筛选功能,用户在选择某一层次的选项后,下一层的选项会根据前一层的选择动态加载。这种设计可以减少不必要的数据传输,提高用户体验。在描述中提到的...

    JSP级联效果JSP级联效果JSP级联效果JSP级联效果JSP级联效果JSP级联效果

    根据提供的标题、描述以及部分代码内容,我们可以了解到这篇文章主要探讨的是如何在JSP(Java Server Pages)中实现级联选择框的效果。级联选择框通常用于处理多层级的数据结构,如国家-省份-城市这样的地理位置数据...

    ssh+jquery+ajax二级联动

    4. **jQuery**:在客户端,jQuery库可能被用来监听用户在父级选择框中的变化事件。当事件触发时,一个Ajax请求会被发送到服务器,获取对应的子级数据。然后,jQuery可以方便地更新DOM,动态加载新的城市列表。 5. *...

    combox3级联动

    这种多级联动的选择器在用户体验上具有很高的价值,它能够简化用户操作流程,提高用户输入效率。 本文将详细介绍一种实用的实现方法——`combox3级联动`,这是一种基于JSP技术栈的解决方案,适用于需要实现三级或更...

Global site tag (gtag.js) - Google Analytics