利用AjAX动态变换过滤条件

在我的一个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>       <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)否则返回一个文本输入框这样选择不同的过滤条件(或者说过滤字段),产生不同的过滤效果,而且是异步的,下面显示的数据列表不用刷新,在这个项目中获得了较好的用户体验。

以下是截图:

以上是 利用AjAX动态变换过滤条件 的全部内容, 来源链接: utcz.com/p/205207.html

回到顶部