`
raywithu
  • 浏览: 24785 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

ExtJs结合QBC,简化工作量的一个尝试

阅读更多

QBC中用得比较普遍的莫过于 property op value 这种形式

较常用的一些方法


 

而在界面的表单上,我们的查询,做成公共实现还是有较多方案的,不过问题在于像between,not等这类关系,并不能很好的控制,尤其是between,一个property对应两个value,表示一个区间。

 

之前我做的一个项目中,前端使用extjs,后台索引部分使用compass,而compass与spring结合后,风格跟spring-hibernate,以及hibernate的qbc很像。

 

下面就以extjs3.2,以及compass进行简要说明我的思路。

 

1、有一个这样的查询



其中"公司名称"是模糊匹配,即"like"

"添加日期"是精确匹配,即"eq"

当然,你也可以处理时间跨度的查询,即between,不过这种方式使用">"、"<"相结合计较好实现。

like你也可以自己设定规则,如headLike,endLike等,只要后台有相应的解析处理程序。

 

2、我希望界面能传给后台这样的一个信息:

 

[{
	name:'companyName',
	value:'长江',
	relation:'like'
},{
	name:'createDate',
	value:'2011-08-03',
	relation:'eq'
}]

 

我希望不需要每次都手工去拼写这样的JSON,ExtJs的FormPanel(实际上是BasicForm的方法)有提供这样的一种方式获取json,用以提交:

 

var formJSON = formPanel.getForm().getValues();

 

可是通过这样获取到的JSON格式是:

 

{companyName:'长江',createDate:'2011-08-03'}

 

这并不是我所希望的格式,我想要的是三元关系。

要得到三元关系JSON的效果,需要对ExtJs的BasicForm进行扩展,如下:

 

Ext.override(Ext.form.BasicForm, {
	getRelations : function(tarName, tarFun) {
		var _this = this;
		var form = this.el.dom;
		var fElements = form.elements
		  || (document.forms[form] || Ext.getDom(form)).elements, hasSubmit = false, encoder = encodeURIComponent, name, relation, data = [], type, hasValue;

		Ext.each(fElements, function(element) {
			  var record;
			  name = element.name;
			  type = element.type;
			  if (_this.findField(name)) {
				  relation = _this.findField(name).relation;
				  nullValue = _this.findField(name).nullValue;
				  hiddenValue = _this.findField(name).hiddenValue;
			  }
			  if (!element.disabled && name) {
				  if (/select-(one|multiple)/i.test(type)) {
					  Ext.each(element.options, function(opt) {
						    if (opt.selected) {
							    hasValue = opt.hasAttribute ? opt.hasAttribute('value') : opt
							      .getAttributeNode('value').specified;
							    data += String.format("{0}={1}&", encoder(name), encoder(hasValue
							        ? opt.value
							        : opt.text));
						    }
					    });
				  } else if (!(/file|undefined|reset|button/i.test(type))) {
					  if (!(/radio|checkbox/i.test(type) && !element.checked)
					    && !(type == 'submit' && hasSubmit)) {
						  var value = hiddenValue ? hiddenValue : element.value;
						  if (relation && value && value != '' && value != nullValue) {
							  if (/\./.test(name)) {
								  name = name.substring(0, name.indexOf('.'));
							  }
							  record = 'name=' + encoder(name) + '&value=' + encoder(value)
							    + '&relation=' + relation;
							  var json = Ext.urlDecode(record);
							  if (tarName == name && tarFun) {
								  json = tarFun(json);
							  }
							  data.push(json);
						  }
						  hasSubmit = /submit/i.test(type);
					  }
				  }
			  }
			  relation = null;
		  });
		return data;
	}
});

 

使用的时候,form还是一样的写法,只是多了一个relation属性

 

  this.formPanel = new Ext.form.FormPanel({
	    xtype : 'form',
	    title : '查询区',
	    region : 'north',
	    height : 65,
	    layout : 'column',
	    frame : true,
	    items : [{
		      xtype : 'panel',
		      columnWidth : 0.4,
		      layout : 'form',
		      labelPad : 0,
		      labelWidth : 60,
		      items : [{
			        xtype : 'textfield',
			        name : 'company.companyName',
			        relation : 'like',
			        width : 100,
			        fieldLabel : '公司名称',
			        anchor : '95%'
		        }]
	      }, {
		      xtype : 'panel',
		      columnWidth : 0.4,
		      layout : 'form',
		      labelPad : 0,
		      labelWidth : 60,
		      items : [{
			        xtype : 'datefield',
			        name : 'startDate',
			        relation : 'eq',
			        fieldLabel : '添加日期',
			        format : 'Y-m-d',
			        editable : false,
			        maxValue : new Date(),
			        anchor : '95%'
		        }]
	      }, {
		      xtype : 'panel',
		      items : [{
			        xtype : 'button',
			        columnWidth : 0.2,
			        text : '查询',
			        iconCls : 'ux-icon-search',
			        handler : this.onQuery.createDelegate(this),
			        scope : this
		        }]
	      }],
	    keys : [{
		      key : Ext.EventObject.ENTER,
		      fn : this.onQuery.createDelegate(this),
		      scope : this
	      }]
    });

 

提交时只需要

 

var formJSON= this.formPanel.getForm().getRelations();
即可拿到对应的三元JSON串。
通过ajax方式提交,params可以如下设置:
params:{
    data:Ext.util.JSON.encode(formJSON),
    xxx:'其他参数'
}
 

 

 

3、我希望后台能够读懂这样格式的数据

当然,这里实际是用compass提供的qbc,但若用在hibernate上亦是类似。

如果你不喜欢直接传JSON作为参数,亦可做一次转换。Map或者Bean集合。这里只是想说明问题。

 

	public static CompassBooleanQueryBuilder generateQueryBuilder(Class entity, CompassSession session, JSONArray queryArray) {
		CompassQueryBuilder queryBuilder = session.queryBuilder();
		CompassBooleanQueryBuilder query = queryBuilder.bool();
		query.addMust(queryBuilder.term("alias",entity.getSimpleName()));
		if (null==queryArray || queryArray.size()==0) {
			logger.debug("[OSEM]  "+query.toQuery().toString()+"  [OSEM]");
			return query;
		}
		for (int i = 0; i < queryArray.size(); i++) {
			java.lang.reflect.Field field;
			String name = queryArray.getJSONObject(i).getString("name");
			try {
				field = entity.getDeclaredField(name);
			} catch (NoSuchFieldException e) {
				try {
					field = entity.getSuperclass().getDeclaredField(name);
				} catch (NoSuchFieldException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
	                throw new NoSuchElementException("error.class.no.field");
				}
			}
			Class type = field.getType();
			Object value = queryArray.getJSONObject(i).get("value");
			String relation = queryArray.getJSONObject(i).getString("relation");
			if (relation.equals("like")) {
				query.addShould(queryBuilder.term(name, generateSpace(value.toString())+splitStrings(value.toString())));
			}else if (relation.equals("eq")) {
				query.addMust(queryBuilder.term(name, value));
			}else if (relation.equals("<")) {
				query.addMust(queryBuilder.lt(name, value));
			}else if (relation.equals("<=")) {
				query.addMust(queryBuilder.le(name, value));
			}else if (relation.equals(">")) {
				query.addMust(queryBuilder.gt(name, value));
			}else if (relation.equals(">=")) {
				query.addMust(queryBuilder.ge(name, value));
			}else if (relation.equals("between")) {
				JSONArray array = (JSONArray)value;
				query.addMust(queryBuilder.between(name, array.getString(0), array.getString(i), true));
			}
		}
		logger.debug("[OSEM]  "+query.toQuery().toString()+"  [OSEM]");
		return query;
	}

 

这样处理了之后,基本ExtJs表单配置完成,即可,而且不局限于Bean一一映射的那一类查询方式。

http://raywithu.iteye.com/admin/blogs/1139513

 

0
1
分享到:
评论

相关推荐

    Extjs结合fckeditor+c#实现新闻发布

    【标题】:“Extjs结合fckeditor+c#实现新闻发布”是一个基于Web的应用开发示例,它展示了如何使用Extjs作为前端框架,与富文本编辑器fckeditor集成,并利用C#后端语言来处理新闻发布功能。这一组合可以创建一个交互...

    Highstock与ExtJs结合使用

    另一方面,ExtJS是一个全面的前端框架,用于构建复杂的、桌面级的Web应用。它提供了丰富的组件库,包括表格、面板、窗口、菜单等,具有强大的数据绑定和布局管理功能。ExtJS的MVC架构和模块化设计使得代码组织和维护...

    extjs流程界面设计器参考_ExtJS工作流设计器_extjs工作流_extjs_

    基于ExtJS的工作流设计器,利用了ExtJS的强大组件模型和交互性,为用户提供了一个直观的方式来创建和编辑流程图。这样的设计器通常包括以下关键组成部分: 1. **组件库**:设计师需要一个包含各种工作流元素(如...

    ExtJs与.Net结合开发实例

    ExtJS是一个基于JavaScript的开源UI库,提供了一套完整的组件模型,用于构建富客户端应用。它包含各种预定义的控件和布局,如表格、按钮、面板、表单等,能够创建出高度定制的用户界面。 **2. .Net框架** .Net是由...

    ExtJS与.NET结合开发实例

    ExtJS与.NET结合开发实例ExtJS与.NET结合开发实例

    FCKeditor结合extjs实例

    标题 "FCKeditor结合extjs实例" 描述的是一个实际项目中使用的技术组合,涉及到的主要是两个前端富文本编辑器库:FCKeditor 和 ExtJS。这个实例表明在开发企业级网站时,如何将这两者有效地整合以实现复杂的用户界面...

    Highcharts与ExtJs结合使用

    3. **使用ExtJS的Chart组件**: ExtJS提供了一个Chart组件,它是Highcharts的封装,可以直接在ExtJS的应用中使用Highcharts图表。将之前创建的Highcharts配置对象传递给Chart组件。 4. **数据绑定**: 当Store接收到...

    functioncharts与extjs结合,做多折线图

    标题中的"functioncharts与extjs结合,做多折线图"指的是使用FunctionCharts库和ExtJS框架协同工作,创建一个可以展示多个折线图的交互式图表应用。FunctionCharts是一款强大的图表绘制库,它提供了丰富的图表类型,...

    一个extjs 和 thinkphp 结合在一起的一个例子

    ExtJS是一个强大的JavaScript库,主要用于构建富客户端的用户界面,而ThinkPHP则是一个基于PHP的轻量级MVC(模型-视图-控制器)框架,用于后端开发。将两者结合,可以创建功能完善的、交互性极强的Web应用,例如这个...

    extJs3升级extjs4方案

    例如,在 ExtJS3 中,我们可以使用以下代码来定义一个类: ```javascript Ext.ux.PostStore = Ext.extend(Ext.data.Store, { constructor: function(params) { // ... } }); Ext.reg('PostStore', Ext.ux....

    基于PHP MVC与ExtJs结合开发会议预约系统.pdf

    ExtJs还提供了一个强大的事件机制,能够轻松实现桌面应用程序的交互式操作。 在会议预约系统中,我们使用PHP MVC作为后端开发框架, ExtJs作为前端开发框架。通过使用PHP MVC,我们可以快速开发会议预约系统的后端...

    extJs树形框架(一个例子)

    总的来说,这个“ExtJS树形框架”实例提供了一个实际的应用场景,帮助开发者学习如何将ExtJS的交互性与传统的Web开发框架(如Oracle、iBATIS和Struts)相结合,构建出复杂的前端应用。通过研究这个项目,我们可以...

    结合extjs + mxgraph 网络拓扑图的开发

    extJs 跟mxgraph一样都是一种前台框架,可以混着用,这个例子...mxgraph是将html的页面元素当做一个容器(container),并在此容器中画图的,而extJs也是将此容器包装成一个window的,因此页面的容器就是它们的结合点。

    ExtJS和.NEt平台结合

    首先,ExtJS是一个强大的JavaScript库,专注于构建桌面级的Web应用用户界面。它提供了丰富的组件库,如表格、面板、菜单、表单等,以及强大的布局管理,使得开发者可以轻松创建复杂且响应式的页面。ExtJS的MVC...

    ExtJs3.4.0包,含大量样例

    总之,ExtJS 3.4.0是一个强大且灵活的前端开发工具,能够帮助开发者构建出专业级的Web应用,而这个压缩包正是掌握这一技术的起点,包含了所有必要的资源和示例,无论是初学者还是经验丰富的开发者,都能从中受益。

    一个简单的extjs+ssh实例

    SSH(Struts2、Spring、Hibernate)是一个常见的Java Web开发框架组合,用于构建高效、可维护的企业级应用。Struts2是MVC(模型-视图-控制器)架构的一部分,负责处理HTTP请求和展示视图;Spring作为依赖注入容器,...

    Extjs结合Struts版的简单书籍管理系统

    ExtJS是一款强大的JavaScript库,用于构建用户界面,而Struts是Java的一个MVC框架,主要用于后端控制逻辑。本项目是一个将两者结合的简单书籍管理系统,旨在展示如何在实际应用中整合这两种技术。 **ExtJS详解** ...

    domino与EXTJS结合extnd_b4.zip

    《Domino与EXTJS结合应用详解》 ...综上所述,"domino与EXTJS结合extnd_b4.zip"是一个用于探索EXTJS与Lotus Domino深度集成的资源包,通过学习和实践其中的内容,开发者可以提升构建高效、现代的企业级Web应用的能力。

    Extjs5.0 Mini 轻量级 使用方式概述 引用讲解 Extjs5.0 gray

    在5.0版本中,它提供了一个轻量级的版本,称为“Mini”,旨在减少应用的体积,提高加载速度,尤其适合对性能有较高要求或者需要快速开发的项目。在本概述中,我们将深入探讨如何在项目中引入并使用ExtJS 5.0 Mini,...

    EXTJS一个小抽奖例子

    EXTJS 是一个基于JavaScript的富客户端应用框架,主要用于构建企业级的Web应用程序。EXTJS 提供了一套完整的组件模型、数据绑定机制、丰富的用户界面控件以及强大的图表功能,使得开发者能够创建出交互性强、用户...

Global site tag (gtag.js) - Google Analytics