简述
本例的页面效果如下:
这是一个具有简单查询功能的页面,且具有数据导航操作功能,包括翻页等。
准备后台数据服务
@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" />