11 12
发新话题
打印

[原创] 一段代码,实现一个想法。。。

一段代码,实现一个想法。。。

今天早上突然冒出来一个想法,就是在BS程序开发中,如果有几个下拉列表,而下拉列表的内容都是从数据库中读取的
互相之间还有联动关系,那么实现起来比较麻烦,可不可以有一种模式可以让这个工作变得的更简单呢?

想了一下,动手写了这个程序,只是粗略的实现了一下。。。

基本思路就是利用HTML组件可以自定义扩展属性的特性,对下拉列表的 显示值,数据值以及 互相之间的联动关系(比如省和市)进行定义,然后利用脚本程序,进行解析,利用XMLHTTP协议将请求发送到后台,进行数据的读取,然后再以JSON 数据对像的形式将数据 传回至前台页面。。。。

用到的东西:
   HTML
   javascript
   json
   xmlhttp
   。。。。。

脚本代码如下:
<script language="javascript">
   function query(qdata)
     {        
          var poster;
          poster=new ActiveXObject("Msxml2.XMLHTTP");
          var url = "../select_init"+"?tmp=" + (Math.random()).toFixed(5); // 加随机数,防止IE缓存
          poster.open("POST",url,false);
          poster.send(qdata);
          var rtn
          rtn = poster.responseText;
          return rtn;
     }
        
    //--当MASTER发生ONCHANGE事件时自动填充子下拉列表的数据项------//
    function get_sub(master_compent,sub_compent,vtype,vfld)
      {
         var m_key;
         var rtn_str;
         m_key = master_compent.value;
         var send_str ;
         send_str = vfld + '#' + sub_compent.master_key + "='" + m_key + "'";
         rtn_str = query(send_str);
         rtn_str = "(" + rtn_str +")";
         var data_obj = eval(rtn_str);
         var disp_val,data_val;
         sub_compent.options.length=0;
         for(j=0;j<data_obj.ddlb_data.length;j++)
             {
                 disp_val = data_obj.ddlb_data[j].disp;
                 data_val = data_obj.ddlb_data[j].data;
                 sub_compent.options[ j + 1 ] = new Option(disp_val,data_val);
             }
        }

     function init_condition()
        {
          var rtn_str
          var vdisp,vdata
          var vattrib,vmaster_key,vmaster_compent
         
          fm_condition.zu.options[0] = new Option('','')
          var select_obj;
          var sub_obj
          var vmaster_type;
          for(var k=0;k<fm_condition.elements.length;k++) {
                if (fm_condition.elements[k].tagName=='SELECT'){
                        select_obj = fm_condition.elements[k];
                        vattrib = select_obj.init_attrib;//自动初始化属性
                        vdisp = select_obj.disp; //显示值属性
                        vdata = select_obj.data; //数据值属性
                        vmaster_type = select_obj.master_type;
                        vmaster_key = select_obj.master_key; //关联键值属性
                        vmaster_compent = select_obj.master_compent; //关联组件属性
               
                        if(vmaster_key.length >0 )
                        {
                             eval('fm_condition.' + vmaster_compent +'.onchange=function(){get_sub(this,fm_condition.'+
                             select_obj.name+ ','+ "'"+vmaster_type +"','"+  vdisp +'|' + vdata +"'"+');}' );
                        }
                        if (vattrib=='T'){
                                rtn_str = query(vdisp + '|' + vdata+'#');
                                //========接收返回数据并显示在select中=================/
                                rtn_str = "(" + rtn_str +")";
                                var data_obj = eval(rtn_str);
                                var disp_val,data_val;
                                for(j=0;j<data_obj.ddlb_data.length;j++)
                                {
                                        disp_val = data_obj.ddlb_data[j].disp;
                                        data_val = data_obj.ddlb_data[j].data;
                                        select_obj.options[ j + 1 ] = new Option(disp_val,data_val);
                                }
                        }                        
                }
          }
        }        
</script>


HTML 实例:

<body >
<form name="fm_condition"  action="jbxxbgjl_res.jsp" method="post">

    <select name="zu" style="width:200px" disp='dm_zu.zu' data='dm_zu.id' master_compent=''
                       master_key =   '' init_attrib='T'
>
    </select>
</form>
</body>
</html>

注:红色部分为自定义属性
      disp属性: 是下拉列表的显示值,用法--  disp='表名.字段名'
      data属性:是下拉列表的数据值。用法--  data='表名.字段名'
      master_compent 属性: 是其上级关联的下拉列表,比如省与市。。如果没有,则设置其值为 ''
      master_key 属性: 设置两下拉列表关联的 关键字
      init_attrib属性: 设置该下拉列表框在页面打开时是否进行初始化,填充其值。 是 则为 T,否则为 F

另: 1、XMLHTTP 这里为了简单,采用了同步方式。。。


    2、后台数据的读取,我只是粗略的用servlet实现,如何从数据库取数 ,用EJB,Hibernate,还是自己封装JDBC,还是其它的,完全视实际需要而定。。。。所以后面的代码就不再贴出来了。。


[ 本帖最后由 p.m 于 2007-7-3 13:27 编辑 ]

TOP

以上只是一个大概的想法和实现
其实还有很多不合理的地方,比如XMLHTTP协议通讯中状态的检查等代码都没有详细实现。
也可能这个想法并不科学
也只是我一时的想法。。。
一直都想做一个属于自己的BS开发框架
能够使页面变的更为简洁清晰
后台操作更为高效便捷
但一直处于一个构思的状态,并未付诸行动。。

写这个程序,希望能起到一个抛砖引玉的作用。。。
也希望有此兴趣的朋友一起研究一下。。。
有什么更好的想法提出来
有问题的朋友也可以进行交流
说一定一个好的BS应用程序框架就会出自我们手里呢?
对不对?

进来的朋友,如果懂的话,有兴趣的话,不要吝啬你的想法,大胆说出来
我们一起讨论一下。。

TOP

我发现LZ很有才

TOP

引用:
原帖由 小餮 于 2007-7-3 11:11 AM 发表
我发现LZ很有才
事实确是这样的

TOP

相当有才

就是我一点都看不懂
Experience without learning is better than learning without excperience.

TOP

你把数据写到XML文件中,然后让OPTION的数据源跟相应的XML文件绑定,全静态文件,不需牵扯数据库,效率高,其不更好
如果不把钱花在教育上,那么就一定会把它花在监狱上。
不修德而读书,甚于给强盗一把刀。

TOP

引用:
原帖由 tot 于 2007-7-5 09:21 发表
你把数据写到XML文件中,然后让OPTION的数据源跟相应的XML文件绑定,全静态文件,不需牵扯数据库,效率高,其不更好
嗯,用eclipse做胖客户端的时候,就这么搞过,用XML 文件存到本地,每次用的时候检查一下,与数据库是否一致就可以了。。

TOP

楼主的实现方法貌似每次选择就得提交一次,虽然可以不刷新整个页面,但是用户好像仍需等待一定时间才能看到数据从服务器读取并显示出来!
对于一个 国家,省,市的及联显示我的想法是:

<select name="country" >
       <option value="country_id"> country_display </option>
</select>
<select name="province">
       <option value="provice_id"> provice_display </option>
</select>
<select name="city">
       <option value="city_id"> city_display </option>
</select>

<!--
这段js定义一些变量,类型为数组,可以是固定的js文件,也可以是用J2EE等动态生成的文件:
也可以用 XmlHttpRequest 请求一个servlet,再整个解析返回的JOSN字符串(可以用prototype.js的现有函数)
内容例如:
var addr = [
      [                                             
        country_id,
        country_display,
        [
          [
             province_id,
             province_display,
             [
                [city_id, city_display],
                ...        //other cities
             ]
          ],
          ...        //other provinces
        ]
      ],
      ...         //other countries
];

访问国家                     addr[idx_0];
访问国家id                   addr[idx_0][0];
访问国家显示信息         addr[idx_0][1];
访问省                        addr[idx_0][3][idx_1];
访问省ID                     addr[idx_0][3][idx_1][0];
访问省显示信息            addr[idx_0][3][idx_1][1];
访问城市                     addr[idx_0][3][idx_1][3][idx_2];
访问城市ID                  addr[idx_0][3][idx_1][3][idx_2][0];
访问城市显示信息         addr[idx_0][3][idx_1][3][idx_2][1];
-->
<script type="text/javascript" language="javascript" src="ONEURL" />


好了,余下的我就不说了,用数组来编程会很Easy的。其实像嵌套对象的对象,如果只是存储数据的话,就很容易用JOSN来表示,这就是JOSN的强大之处了!

[ 本帖最后由 btpka3 于 2007-7-11 19:27 编辑 ]

TOP

引用:
原帖由 btpka3 于 2007-7-11 11:13 发表
楼主的实现方法貌似每次选择就得提交一次,虽然可以不刷新整个页面,但是用户好像仍需等待一定时间才能看到数据从服务器读取并显示出来!
对于一个 国家,省,市的及联显示我的想法是:

<select name="country" & ...
嗯,我明白你的想法

其实我的主要意思是

去如何实现一个通用的方法

而不是针对个例

就是说,当遇到此类情况时,我们只需要设置好一些HTML自定义扩展属性。

那么其它的,我们就不需要再关心了。。

就是想通用一下。。


另外,我喜欢这样的讨论,希望以后可以多一点。。。

[ 本帖最后由 p.m 于 2007-7-11 11:21 编辑 ]

TOP

怎么看怎么像是 AJAX!

TOP

 11 12
发新话题