用javascript每次动态去取值来填充select 就行了

解决方案 »

  1.   

    用DHTML可以完成。
    将数据库读出来的数据按类别排好后,放到javascript的数组变量中,然后就动态设置和删除select里面的值
      

  2.   

    按照你的表结构,其实是个树型结构
    搜索思路如下:
    递归(深度搜索+广度搜索)
    算法:
    1、搜索当前节点的下一级子节点;
    2、对所有子节点按1的算法递归,直至当前节点无下一级子节点。
    递归算法较简单,这里不再赘述。至于生成三级联动菜单可以给你一个例子
    import com.netutel.ubisp.acceptarea.value.*;
    import com.netutel.ubisp.acceptarea.dao.*;
    import java.util.Collection;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.sql.*;
    import javax.servlet.jsp.JspTagException;
    import javax.servlet.jsp.tagext.TagSupport;
    import javax.servlet.jsp.JspWriter;
    import java.io.IOException;/**
     * <p>Title: 打印脚本</p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: </p>
     * @author YuanQi
     * @version 1.0
     */
    public class WriteScript extends TagSupport
    {
    private String menuStr = "";
    private String areaId = "";

    private void setMenuStr(String aValue)
    {
    menuStr = aValue;
    }
    private String getMenuStr()
    {
    return menuStr;
    }

    public void setAreaId(String aValue)
    {
    areaId = aValue;
    }
    public String getAreaId()
    {
    return areaId;
    }

    public int doStartTag()
    {
    try
    {
    JspWriter out = pageContext.getOut();
    this.getAssociateMenu();
    out.println(this.getMenuStr());
    }
    catch(IOException e)
    {
    e.printStackTrace();
    }
    catch(Exception ex)
    {}
    return (SKIP_BODY);
    }

    public void getAssociateMenu() throws Exception
    {
    try
    {
    StringBuffer sb = new StringBuffer();
    AcceptAreaDAO qeryDao = new AcceptAreaDAO();
    Collection countyList = new ArrayList();
    countyList = qeryDao.queryCounty(this.getAreaId());
    if(countyList!=null&&countyList.size()>0)
    {
    int i=0;
    sb.append("<script language='JavaScript'>\n<!--\n");
    sb.append("selector = [ \"countyCode\", \"citiesCode\", \"acceptArea\" ];\n");
    sb.append("menu = [\n");
    sb.append("\"所有县\",\"-1\",\n[\n");
    sb.append("\"所有营销中心\",\"-1\",\n[\n\"所有营业点\",\"-1\",null\n]\n],\n");
    Iterator ir = countyList.iterator();
    while(ir.hasNext())
    {
    Collection acceptCenterList = new ArrayList();
    AcceptAreaValueBean tmpValue = (AcceptAreaValueBean)ir.next();
    sb.append("\""+tmpValue.getCountyDesc()+"\",\""+tmpValue.getCountyKey()+"\",\n[\n");
    sb.append("\"所有营销中心\",\"-1\",\n[\n\"所有营业点\",\"-1\",null\n],\n");

    acceptCenterList = qeryDao.queryAcceptCenter(tmpValue.getCountyKey(),this.getAreaId());
    if(acceptCenterList!=null&&acceptCenterList.size()>0)
    {
    int k = 0;
    Iterator it = acceptCenterList.iterator();
    while(it.hasNext())
    {
    Collection acceptAreaList = new ArrayList();
    AcceptAreaValueBean tmpValue2 = (AcceptAreaValueBean)it.next();
    sb.append("\""+tmpValue2.getAcceptCenterDesc()+"\",\""+tmpValue2.getAcceptCenterKey()+"\",\n[\n");
            sb.append("\"所有营业点\",\"-1\",null,\n");
            
            acceptAreaList = qeryDao.queryAcceptArea(tmpValue2.getAcceptCenterKey());
            if(acceptAreaList!=null&&acceptAreaList.size()>0)
            {
             int j=0;
             Iterator ia = acceptAreaList.iterator();
             while(ia.hasNext())
             {
             AcceptAreaValueBean tmpValue3 = (AcceptAreaValueBean)ia.next();
             if(j==acceptAreaList.size()-1)
             sb.append("\""+tmpValue3.getAcceptAreaDesc()+"\",\""+tmpValue3.getAcceptAreaKey()+"\",null\n");
             else
             sb.append("\""+tmpValue3.getAcceptAreaDesc()+"\",\""+tmpValue3.getAcceptAreaKey()+"\",null,\n");
             j++;
             }
            }
            
            if(k==acceptCenterList.size()-1)
            sb.append("]\n");
            else
            sb.append("],\n");
            k++;
    }
    }

    if(i==countyList.size()-1)
    sb.append("]\n");
    else
    sb.append("],\n");
    i++;
    }
    sb.append("];\n\n");
    sb.append("function wizz(level)\n");
    sb.append("{\nif( level == 0 )\n");
    sb.append("a = menu;\nelse\n{\n");
    sb.append("str = \"menu\";\nfor( i=0; i<level; i++ )\n");
    sb.append("str += \"[\" + (document.all[selector[i]].selectedIndex * 3 + 2)  + \"]\";\n");
    sb.append("a = eval(str);\n}\n");
    sb.append("if( a == null ) return;\n");
    sb.append("s = document.all[selector[level]];\n");
    sb.append("i = s.length;\n");
    sb.append("while( i > 0 ) s.options[--i] = null;\n");
    sb.append("while( i < Math.floor(a.length/3) )\n");
    sb.append("s.options[i] = Option( a[i*3], a[i++*3+1] );\n");
    sb.append("s.onchange = Function(\"wizz(\" + (level+1) + \")\");\n");
    sb.append("wizz(level+1);\n}\nwizz(0);\n");
    sb.append("//-->\n</script>\n");
    }
    this.setMenuStr(sb.toString());
    //System.out.println(this.getMenuStr());
        }
        catch(Exception e)
        {
         e.printStackTrace();
        }
    }
    }
      

  3.   

    上面的代码是个自定义tag,其中三级联动菜单的基本脚本如下:
    <html>
    <title>关联菜单测试</title>
    <body>
    <SELECT NAME="s1"></SELECT>
    <SELECT NAME="s2"></SELECT>
    <SELECT NAME="s3"></SELECT>
    <SELECT NAME="s4"></SELECT>
    <script language="JavaScript">
    <!--
    //选择框的名字
    selector = [ "s1", "s2", "s3", "s4" ];
    //选择项: "名字", "值", 子选择
    menu = [
    "郑州","1",
     [
     "所有县","-1",
      [
      "所有营销中心","-1",
       [
       "所有营业点","-1",null
       ]
      ],
     "新密","1",
      [
      "所有营销中心","-1",
       [
       "所有营业点","-1",null
       ],
      "新密营销中心1","1",
       [
       "所有营业点","-1",null,
       "营业点1a","1",null,
       "营业点1b","2",null
       ],
      "新密营销中心2","2",
       [
       "所有营业点","-1",null,
       "营业点1c","1",null,
       "营业点1d","2",null
       ],
       "新密营销中心3","2",
       [
       "所有营业点","-1",null,
       "营业点1e","1",null,
       "营业点1f","2",null
       ]
      ],
     "登封","2",
      [
      "所有营销中心","-1",
       [
       "所有营业点","-1",null
       ],
      "登封营销中心1","1",
       [
       "所有营业点","-1",null,
       "营业点1g","1",null,
       "营业点1h","2",null
       ],
      "登封营销中心2","2",
       [
       "所有营业点","-1",null,
       "营业点1i","1",null,
       "营业点1j","2",null
       ],
       "登封营销中心3","2",
       [
       "所有营业点","-1",null,
       "营业点1k","1",null,
       "营业点1l","2",null
       ]
      ]
     ],
    "洛阳","2",
     [
     "所有县","-1",
      [
      "所有营销中心","-1",
       [
       "所有营业点","-1",null
       ]
      ],
     "洛阳县1","1",
      [
      "所有营销中心","-1",
       [
       "所有营业点","-1",null
       ],
      "洛阳县1营销中心1","1",
       [
       "所有营业点","-1",null,
       "营业点1a","1",null,
       "营业点1b","2",null
       ],
      "洛阳县1营销中心2","2",
       [
       "所有营业点","-1",null,
       "营业点1c","1",null,
       "营业点1d","2",null
       ],
       "洛阳县1营销中心3","2",
       [
       "所有营业点","-1",null,
       "营业点1e","1",null,
       "营业点1f","2",null
       ]
      ],
     "洛阳县2","2",
      [
      "所有营销中心","-1",
       [
       "所有营业点","-1",null
       ],
      "洛阳县2营销中心1","1",
       [
       "所有营业点","-1",null,
       "营业点1g","1",null,
       "营业点1h","2",null
       ],
      "洛阳县2营销中心2","2",
       [
       "所有营业点","-1",null,
       "营业点1i","1",null,
       "营业点1j","2",null
       ],
       "洛阳县2营销中心3","2",
       [
       "所有营业点","-1",null,
       "营业点1k","1",null,
       "营业点1l","2",null
       ]
      ]
     ]
    ];
     
    function wizz(level)
    {
     if( level == 0 )
      a = menu;
     else
     {
      str = "menu";
      for( i=0; i<level; i++ )
       str += "[" + (document.all[selector[i]].selectedIndex * 3 + 2)  + "]";
      a = eval(str);
     }
     if( a == null ) return;
     s = document.all[selector[level]];
     i = s.length;
     while( i > 0 ) s.options[--i] = null;
     while( i < Math.floor(a.length/3) )
      s.options[i] = Option( a[i*3], a[i++*3+1] );
     s.onchange = Function("wizz(" + (level+1) + ")");
     wizz(level+1);
    }
    wizz(0);
    //-->
    </script>
    </body>
    </html>
      

  4.   

    poppop(光盘)人才呀,用servlet画页面,汗!
      

  5.   

    to ejb99666
    写成自定义tag只是为了在页面上使用方便,无所谓怎样实现。
      

  6.   

    如果数据不是很多,可以把所有的数据打印到js数组变量中,然后使用js对他进行连动下拉