利用AjAX动态变换过滤条件

原创 2006年06月02日 14:12:00

在我的一个java项目中,需要在数据列表的上面添加过滤功能,可且根据用户选择的过滤条件,来生成不同过滤脚本:
//**********************以下是表格的第一行脚本***************************//
   <TD align="center" width="15%" height="25">选择查询条件:</TD>
 <TD align="left" width="30%"><select name="FilterName" id="FilterName"
  style="width:100%" onchange="javascript:changeFilter();">
  <option value=""></option>
        <option value='BugInfo_Title' <%=BugInfoList.getSelected("BugInfo_Title")%>>Bug标题</option>
        <option value='BugInfo_BugUser' <%=BugInfoList.getSelected("BugInfo_BugUser")%>>安装用户</option>
        <option value='BugInfo_BugSystem' <%=BugInfoList.getSelected("BugInfo_BugSystem")%>>安装系统</option>
        <option value='BugInfo_BugTime' <%=BugInfoList.getSelected("BugInfo_BugTime")%>>提交时间</option>
        <option value='BugInfo_DoneTime' <%=BugInfoList.getSelected("BugInfo_DoneTime")%>>完成时间</option>
    </select></TD>
 <TD align="left" width="37%" id="filter"><%=BugInfoList.getFilterHtml()%></TD>
    <TD align="center" width="18%"><A class="TextUrl9" href="javascript:doFilter();">
     <IMG src="../images/image/chaxun.gif" align="absMiddle" border="0">开始过滤</A>
     &nbsp;&nbsp;<A class="TextUrl9" href="javascript:doAll();"><IMG
     src="../images/image/cx.gif" align="absMiddle" border="0">全部</A>
    </TD>
  </TR>
//*********************************以下是JavaScript脚本******************************************************//
 /*获取客户端XMLHttpRequest请求对象*/
 function getRequest(){
    var request = false;
    try {
        request = new XMLHttpRequest();
    } catch (trymicrosoft) {
        try {
         request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (othermicrosoft) {
         try {
             request = new ActiveXObject("Microsoft.XMLHTTP");
         } catch (failed) {
             request = false;
         } 
        }
    }
    if (!request) alert("错误初始化XMLHttpRequest对象!");
    return request;
 }
    var request=getRequest();
    //改变过滤条件
 function changeFilter() {
      if(request==null) request=getRequest();
      var name = FrmBugInfo.FilterName.value;
      var url ="../ajaxFilter?name="+name;
      request.onreadystatechange = updateFilter;
      request.open("GET", url, true);
      request.send(null);
   }
   //改变过滤条件
   function updateFilter(){
      if (request.readyState == 4) {
         if (request.status == 200) {
            var text=request.responseText;
            document.getElementById("filter").innerHTML=text;
         } else{
            alert("状态是:" + request.status);
         }
         delete request['onreadystatechange'];
         request=null;//必须清空
      }
   }
//*********************************以下是ajaxFilter源码,它是一个servlet*********************************************//
    static final String[] TIME={"smalldatetime","datetime","timestamp"};
    static final String[] NUM ={"tinyint","smallint","int","bigint","decimal","numeric",
                                 "float","real","smallmoney","money","binary",};
    static final String SQL   ="select * from DataDict where TableName='%s' and FieldName='%s'";
    static final String DEFAULT="<input type='text' name='FilterValue' id='FilterValue' value='@value' style='width:100%'></input>";
    static final String DATE   ="<input id=/"@name/" type=/"text/" name=/"@name/" value='@value' /n"
                                +"         class=/"TextBox/" readonly=/"readonly/" style=/"width:100px;/"/> /n"
                         +"         <IMG style=/"CURSOR: hand/" onclick=/"showtime(@name)/"/n"
                                +"         alt=/"选择日期/" src=/"../images/image/date.gif/" width='16' align='middle'>";
                               
    //doGet和doPost中的源码
    response.setContentType(CONTENT_TYPE);
    PrintWriter out=response.getWriter();
    String name=request.getParameter("name");
    out.print(PageList.getFilter(name));
       
   /**
     * 得到过滤类型
     * @param name   过滤选择名称(包括表名和字段名)
     * @param isAdd  是否添加ClassID,BindField等信息
     * @return
     */
    public static String getFilterType(String name,boolean isAdd){
        if(name!=null){
            int index=name.indexOf("_");
         if(index>=0){
             String[] str=new String[2];
             str[0]=name.substring(0,index);
             str[1]=name.substring(index+1);
             ResultSet rs=DBAccess.getInstance().OpenCommand(Common.Format(SQL,str));
             try{
              if(rs.next()){//时间
                  if(Common.in(TIME,rs.getString("FieldType"))){
                      return "1";
                  }else if(!isDBNull(rs.getString("ClassID"))){//固定代码
                      if(isAdd)
                          return "2_"+rs.getString("ClassID");
                      else
                          return "2";
                  }else if(!isDBNull(rs.getString("BindTable"))){//外键关联
                      if(isAdd)
                          return "3_"+rs.getString("BindTable")
                                 +"_"+rs.getString("BindField")
                                 +"_"+rs.getString("BindShowField");
                      else
                          return "3";
                  }else if(Common.in(NUM,rs.getString("FieldType"))){//数值
                      return "4";
                  }
              }
             }catch(Exception e){}
         }
        }
        return "0";//普通字符串
    }
   
    /**
     * 获取过滤字符串
     * @param name   过滤类型名称
     * @param value  第一个过滤值
     * @param value1 第二个过滤值(主要针对时间)
     * @return
     */
    public static String getFilter(String name,String value,String value1){
        String type=getFilterType(name,true);
        int flag=0,pos=type.indexOf("_");
        String[] other=type.split("_");
        if(pos>=0){
            flag=Integer.parseInt(type.substring(0,pos));
        }else{
            flag=Integer.parseInt(type);
        }
        return getFilter(flag,other,value,value1);
    }
   
    /**
     * 获取过滤字符串
     * @param type    过滤类型
     * @param other   固定代码编号等
     * @param value   第一个过滤值
     * @param value1  第二个过滤值(主要针对时间)
     * @return
     */
    public static String getFilter(int type,String[] other,String value,String value1){
        if(value==null) value="";
        if(value1==null) value1="";
        switch(type){
           case 0:return DEFAULT.replaceAll("@value",value);//字符串
           case 1:return ("从:"+DATE.replaceAll("@name","FromDate").replaceAll("@value",value)
                   +" 到:"+DATE.replaceAll("@name","ToDate").replaceAll("@value",value1));//时间
           case 2:if(other.length==2)
                      return Html.getInstance().GetList("Exec P_GetBaseCode '"
                             +other[1]+"'",true,true,"FilterValue","100%",value);//固定代码
           case 3:if(other.length==4)
                  return Html.getInstance().GetList("select distinct "+other[2]+","+other[3]
                         +" from "+other[1],true,true,"FilterValue","100%",value);//外键关联
           case 4:return DEFAULT.replaceAll("@value",value);//数值
        }
        return "";
    }
    /**
     * 得到过滤字符串
     * @param name 过滤名称
     * @return
     */   
    public static String getFilter(String name){
        return getFilter(name,"","");
    }
   
    /**
     * 检查是否为空
     * @param obj 要检查的对象
     * @return
     */
    public static boolean isNull(Object obj){
        if(obj==null || obj.toString().equals(""))
            return true;
        else
            return false;
    }
   
    /**
     * 判断是否为空,包括空字段
     * @param obj 要判断的对象
     * @return
     */
    public static boolean isDBNull(Object obj){
        if(isNull(obj) || obj.toString().trim().toLowerCase().equals("null"))
            return true;
        else
            return false;
    }
//*****************************************************************************************//
原理:根据选择不同的过滤条件,获取条件中的表名和字段名,利用Ajax根据表名和字段名在数据字典中获取它的类型:
(1)如果是日期型:返回日期范围选择
(2)如果是固定代码:返回一个下拉列表,并初始化固定代码
(3)如果是外键关联:则读出所有的外键所对应的名称
(4)否则返回一个文本输入框
这样选择不同的过滤条件(或者说过滤字段),产生不同的过滤效果,而且是异步的,下面显示的数据列表不用刷新,在这个项目中获得了较好的用户体验。

以下是截图:

在sphinx中应用复杂过滤条件

一、问题的引入 在sphinx应用中,需要对数据进行复杂的条件过滤,刷选出我们需要的数据。这个过程,等同于mysql查询中的where条件。 但sphinx本身的filter并不能支持复杂的逻辑组合运...

SQL中过滤条件放在on和where中的区别

今天接到蚂蚁金服的电面,问了sql中过滤条件放在on和where中的区别,当时满脑子是inner join,觉得没区别啊。后来才想起来,连接查询除了inner join还有right join,lef...

tab 界面展示多选单选过滤条件组成

html> html ng-app="indApp"> head lang="en"> meta http-equiv="Content-Type" content="text/html; cha...

谓词 NSPredicate 使用 筛选约束 过滤条件

谓词 NSPredicate 使用 筛选约束 过滤条件 过滤集合 BEGINWITH ENDSWITH CONTAINS MATCHES BETWEEN...
  • yiral
  • yiral
  • 2016年10月31日 10:57
  • 360

使用了过滤条件的 ArrayAdapter,向源数据添加或删除数据后刷新时,界面不会同步更新

上周完成的工作主要是修改BUG,当点击清空历史记录按钮时,listview清除全部记录。 问题描述:在ActivityA中的edittext中输入搜索内容,点击搜索按钮后,跳转到B界面,在A的lis...

八-应用Wireshark过滤条件抓取特定数据流

应用抓包过滤,选择Capture | Options,扩展窗口查看到Capture Filter栏。双击选定的接口,如下图所示,弹出Edit Interface Settints窗口。 ...

字符串组做过滤条件的使用方法

在润乾报表的使用过程中,许多客户需要在数据集的sql中使用in (?)的形式,这样可以实现数据的动态过滤,而参数的内容就是一个字符串组,下面就用一个简单的例子实现在数据集中使用字符串组动态实现数据的过...
  • RQlyc
  • RQlyc
  • 2016年11月29日 17:38
  • 239

列表界面增加自定义面板过滤条件

/** * output package name */ package com.kingdee.eas.jc.trading.invoice.client; import java.awt.e...
  • fenyu8
  • fenyu8
  • 2014年02月19日 15:34
  • 656
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用AjAX动态变换过滤条件
举报原因:
原因补充:

(最多只允许输入30个字)