分享
 
 
 

利用AjAX动态变换过滤条件

王朝other·作者佚名  2007-01-15
窄屏简体版  字體: |||超大  

在我的一个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)否则返回一个文本输入框

这样选择不同的过滤条件(或者说过滤字段),产生不同的过滤效果,而且是异步的,下面显示的数据列表不用刷新,在这个项目中获得了较好的用户体验。

以下是截图:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有