Dorado 9 : 简单查询 1(sample-center)

简述

本例的页面效果如下:

这是一个具有简单查询功能的页面,且具有数据导航操作功能,包括翻页等。

准备后台数据服务

@DataProvider
public void query(Page<Order> page, Map<String, Object> parameter) {
	Criteria criteria = orderDao.createCriteria();
	if (parameter != null) {
		if (parameter.get("orderDate1") != null) {
			criteria.add(Restrictions.ge("orderDate", parameter
					.get("orderDate1")));
		}
		if (parameter.get("orderDate2") != null) {
			criteria.add(Restrictions.le("orderDate", parameter
					.get("orderDate2")));
		}
		if (parameter.get("customer") != null) {
			criteria.add(Restrictions.eq("customer", parameter
					.get("customer")));
		}
		if (parameter.get("employee") != null) {
			criteria.add(Restrictions.eq("employee", parameter
					.get("employee")));
		}
	}
	orderDao.find(page, criteria);
}

@DataProvider

我们在query方法的顶部添加"@DataProvider"标识,开放给客户端。

page参数

由于我们希望实现翻页功能,因此方法中需要包含一个Page参数,这个是dorado的provider提供的一个工具类。
query方法的内部代码较为简单易懂,只要把数据初始化到page对象中即可,本例我们通过orderDao进行初始化.

parameter

我们希望实现查询功能,本例简单设计了一个Map类型的对象parameter,查询时我们只要将相关参数放置在parameter中即可。

通过这个方法我们在服务层准备好了一个数据提供的方法,等候调用吧。

定义数据展现控件

我们用DataGrid展现查询后的数据(忽略其他xml代码):

<DataSet id="dsOrders" dataType="[Order]" dataProvider="orderInterceptor#query" pageSize="10" loadMode="manual" />
<DataGrid dataSet="dsOrders" autoCreateColumns="true" stretchColumnsMode="stretchableColumns" />

在此处我们定义了一个绑定到dsOrders上的DataGrid对象。dsOrders的dataProvider就是绑定到前面定义好的query方法:

dataProvider="orderInterceptor#query"

定义查询元素

配合查询,我们在页面上定义一个表单元素:

<AutoForm id="formCondition">
	<Property name="createPrivateDataSet">true</Property>
	<Property name="layoutConstraint">top</Property>
	<Property name="padding">8</Property>
	<Property name="cols">300,300</Property>
	<Property name="showHint">false</Property>
	<AutoFormElement label="日期(起)" property="orderDate1">
		<Editor>
			<TextEditor dataType="Date" />
		</Editor>
	</AutoFormElement>
	<AutoFormElement label="日期(至)" property="orderDate2">
		<Editor>
			<TextEditor dataType="Date" />
		</Editor>
	</AutoFormElement>
	<AutoFormElement label="客户" property="customer" trigger="ddCustomers" />
	<AutoFormElement label="业务员" property="employee" trigger="ddEmployees" />
</AutoForm>

不需要全部读懂上面的代码,我们大概知道这是一个AutoForm的定义,且其中包含了日期起至的查询以及客户和业务员等编辑框,便于用户输入查询条件。
最后我们还需要定义一个按钮收集这个AutoForm中用户输入的信息,并作为query方法的参数,发起query查询请求:

// @Bind #btnQuery.onClick
!function(){
	var formCondition = view.get("#formCondition");
	var dsOrders = view.get("#dsOrders");
	dsOrders.set("parameter", formCondition.get("entity"));
	dsOrders.flushAsync();
}

AutoForm对象formCondition,如果我们直接通过.get("entity")方法,会自动返回给我们一个JSON对象。我们将这个 JSON对象直接赋值给dsOrders的parameter参数,并调用dsOrders的flushAsync激活Java服务层定义好的query 方法,执行查询。

我们还可以将上述代码优化成如下形式:

// @Bind #btnQuery.onClick
!function(){
	dsOrders.set("parameter", formCondition.get("entity")).flushAsync();
}

其他说明

以上就是本例查询的主要定义过程和运行逻辑,另为了翻页和数据控制操作,本例中还添加了ToolBar和DataPilot对象,他们的用法都比较简单。
另外还有为了查询条件输入方便我们在AutoForm中的客户和业务员编辑器上都定义了trigger属性,这就是这个视图模型中两个DropDown和Dataset存在的原因:
DropDown

<DataSetDropDown id="ddCustomers" dataSet="dsCustomers" dynaFilter="true" />
<DataSetDropDown id="ddEmployees" dataSet="dsEmployees" />

DataSet:

<DataSet id="dsCustomers" dataType="[BaseCustomer]" dataProvider="customerInterceptor#findCustomersByCompanyName" />
<DataSet id="dsEmployees" dataType="[BaseEmployee]" dataProvider="employeeInterceptor#getAll" />

Attachments: