- 浏览: 311876 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
liuyong19832011:
,赞一个
Java通过BufferedWriter追加内容到文件末尾的几种常用方法 -
justjavac:
总结很好,怎么没人支持呢?最近发现iteye踩贴现象很严重。
shell数组的使用
转至:http://blog.csdn.net/gengv/article/details/5725172
作者:gengv
这篇主要讲的是jqGrid的查找功能。
根据官方文档的介绍,jqGrid的查找功能分四种:
- 工具条查询;
- 自定义查询;
- 单条件表单查询;
- 高级表单查询(复杂条件查询);
我个人认为这样划分比较复杂,可以基本分为两大类,即:
表单查询:包括单条件查询和高级查询(复杂条件查询);
工具条查询:包括工具条查询和自定义查询;
而这两大类中,也以表单查询更常用。
现在逐个说明一下(我改变了官方文档的讲解顺序,我觉得自己的这个顺序,更直观,更靠近现实使用)。
1. 单条件表单查询
先从服务器端看起,为了配合jqGrid的查询功能,我们需要在JqGridBaseAction类中添加几个成员变量。成员变量的名字必须和jqGrid的prmNames选项中定义的参数名相对应上(具体参考本系列文章的第一篇)。
改进后的JqGridBaseAction类代码:
- package cn.gengv.struts2ex.jqGrid;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- import com.byzl.hare.dao.impl.Criterion;
- import com.byzl.hare.dao.impl.Criterion.CompareType;
- import com.opensymphony.xwork2.ActionSupport;
- @SuppressWarnings("serial")
- public abstract class JqGridBaseAction<T> extends ActionSupport {
- private List<T> gridModel = Collections.emptyList();
- private Integer rows = 0;
- private Integer page = 0;
- private Integer total = 0;
- private Integer record = 0;
- private String sord;
- private String sidx;
- // (1)添加和查询有关的成员变量search、searchField、searchString、searchOper
- private boolean search;
- private String searchField;
- private String searchString;
- private String searchOper;
- public abstract int getResultSize();
- public abstract List<T> listResults(int from, int length);
- // (2)添加用于根据条件进行查询的方法
- public abstract int getResultSize(List<Criterion> criteria);
- public abstract List<T> listResults(List<Criterion> criteria, int from, int length);
- public String refreshGridModel() {
- try {
- List<Criterion> criteria = Collections.emptyList();
- // (3)如果search值为true,则表明是查询请求
- if(search == true) {
- // (4)通过searchField、searchString、searchOper生成通用的查询条件
- Criterion criterion = this.generateSearchCriterion(searchField, searchString, searchOper);
- criteria = new ArrayList<Criterion>();
- if(criterion != null) {
- criteria.add(criterion);
- }
- }
- int from = rows * (page - 1);
- int length = rows;
- List<T> results = Collections.emptyList();
- if(!criteria.isEmpty()) { // (5)如果criteria列表不为空,则根据条件进行查询
- record = this.getResultSize(criteria);
- results = this.listResults(criteria, from, length);
- } else {
- record = this.getResultSize();
- results = this.listResults(from, length);
- }
- this.setGridModel(results);
- total = (int) Math.ceil((double) record / (double) rows);
- return SUCCESS;
- } catch (Exception e) {
- e.printStackTrace();
- this.addActionError(e.getMessage());
- return ERROR;
- }
- }
- // (6)通过searchField、searchString、searchOper三个参数生成Criterion的方法
- public Criterion generateSearchCriterion(String searchField,
- String searchString, String searchOper) {
- Criterion criterion = null;
- // (7)如果searchField、searchString、searchOper均不为null,且searchString不为空字符串时,则创建Criterion
- if (searchField != null && searchString != null
- & searchString.length() > 0 && searchOper != null) {
- if ("eq".equals(searchOper)) {
- criterion = Criterion.getEqualCriterion(searchField,
- searchString, null);
- } else if ("ne".equals(searchOper)) {
- criterion = Criterion.getCompareCriterion(CompareType.NE,
- searchField, searchString, null);
- } else if ("lt".equals(searchOper)) {
- criterion = Criterion.getCompareCriterion(CompareType.LT,
- searchField, searchString, null);
- } else if ("le".equals(searchOper)) {
- criterion = Criterion.getCompareCriterion(CompareType.LTE,
- searchField, searchString, null);
- } else if ("gt".equals(searchOper)) {
- criterion = Criterion.getCompareCriterion(CompareType.GT,
- searchField, searchString, null);
- } else if ("ge".equals(searchOper)) {
- criterion = Criterion.getCompareCriterion(CompareType.GTE,
- searchField, searchString, null);
- } else if ("bw".equals(searchOper)) {
- criterion = Criterion.getLikeCriterion(searchField,
- searchString + "%", null);
- } else if ("bn".equals(searchOper)) {
- criterion = Criterion.getNotLikeCriterion(searchField,
- searchString + "%", null);
- } else if ("ew".equals(searchOper)) {
- criterion = Criterion.getLikeCriterion(searchField, "%"
- + searchString, null);
- } else if ("en".equals(searchOper)) {
- criterion = Criterion.getNotLikeCriterion(searchField, "%"
- + searchString, null);
- } else if ("cn".equals(searchOper)) {
- criterion = Criterion.getLikeCriterion(searchField, "%"
- + searchString + "%", null);
- } else if ("nc".equals(searchOper)) {
- criterion = Criterion.getNotLikeCriterion(searchField, "%"
- + searchString + "%", null);
- }
- }
- return criterion;
- }
- // getter和setter
- ...
- }
说明:
- (1)处添加了关于查询使用到的成员变量,这些成员变量会接收从客户端jqGrid传来的参数,这些参数的名称都是由jqGrid的prmNames选项定义的;
- (2)处添加了两个方法,用于根据条件列表,进行数据记录查询;(关于条件列表List<Criterion>稍后介绍);
- (3)处判断成员变量search的值,如果是查询请求,jqGrid会发送search值为true的请求;
- (4)(6)(7)通过searchField、searchString、searchOper三个参数生成Criterion的方法;以前在学习Hibernate的时候,里面就介绍过使用Criterion的方式;有的朋友对Hibernate奉若神明,但我一直对Hibernate的灵活度不太满意;不过这种将查询条件抽象出来的思路还是值得借鉴的。因此,我虽然后台使用的是Spring的JdbcTemplate,但为了抽象化Dao内的操作,我自己写了一个Criterion类(具体代码在后面)。使用这个Criterion列表来简化查询条件在各个层的传递。
- (5)如果条件列表不为空,则调用新加入的条件查询方法。
Criterion类的代码:
- package com.byzl.hare.dao.impl;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- public class Criterion {
- public static enum CriterionType {
- EQUAL, LIKE, COMPARE, NOT_LIKE
- }
- public static enum CompareType {
- GT, GTE, LT, LTE, EQ, NE
- }
- private CriterionType criterionType;
- private String tableName;
- private String field;
- private Object value;
- // 将Criteria转换为SQL条件语句
- public static String convertToSql(List<Criterion> criteria) {
- String criteriaString = "";
- StringBuilder sb = new StringBuilder();
- for (Criterion criterion : criteria) {
- String prefix = criterion.getFieldPrefix();
- switch (criterion.getCriterionType()) {
- case EQUAL:
- sb.append(prefix + criterion.getField() + "=? and ");
- break;
- case LIKE:
- sb.append(prefix + criterion.getField() + " like ? and ");
- break;
- case NOT_LIKE:
- sb.append(prefix + criterion.getField() + " not like ? and ");
- break;
- case COMPARE:
- CompareType compareType = ((CompareCriterion) criterion)
- .getCompareType();
- switch (compareType) {
- case EQ:
- sb.append(prefix + criterion.getField() + "=? and ");
- break;
- case NE:
- sb.append(prefix + criterion.getField() + "<>? and ");
- break;
- case GT:
- sb.append(prefix + criterion.getField() + ">? and ");
- break;
- case GTE:
- sb.append(prefix + criterion.getField() + ">=? and ");
- break;
- case LT:
- sb.append(prefix + criterion.getField() + "<? and ");
- break;
- case LTE:
- sb.append(prefix + criterion.getField() + "<=? and ");
- break;
- }
- break;
- }
- }
- int i = -1;
- if ((i = sb.lastIndexOf(" and ")) != -1) {
- criteriaString = sb.substring(0, i);
- }
- return criteriaString;
- }
- // 将Criteria各条件的值转换为List<Object>
- public static List<Object> getCriteriaValues(List<Criterion> criteria) {
- List<Object> criteriaValues = criteria.isEmpty() ? Collections
- .emptyList() : new ArrayList<Object>();
- for (Criterion criterion : criteria) {
- criteriaValues.add(criterion.getValue());
- }
- return criteriaValues;
- }
- public CriterionType getCriterionType() {
- return criterionType;
- }
- public void setCriterionType(CriterionType criterionType) {
- this.criterionType = criterionType;
- }
- public String getField() {
- return field;
- }
- public void setField(String field) {
- this.field = field;
- }
- public Object getValue() {
- return value;
- }
- public void setValue(Object value) {
- this.value = value;
- }
- public static Criterion getCompareCriterion(CompareType compareType,
- String field, Object value, String tableName) {
- CompareCriterion compareCriterion = new CompareCriterion();
- compareCriterion.setCriterionType(CriterionType.COMPARE);
- compareCriterion.setCompareType(compareType);
- compareCriterion.setField(field);
- compareCriterion.setValue(value);
- compareCriterion.setTableName(tableName);
- return compareCriterion;
- }
- public static Criterion getLikeCriterion(String field, Object value,
- String tableName) {
- LikeCriterion likeCriterion = new LikeCriterion();
- likeCriterion.setCriterionType(CriterionType.LIKE);
- likeCriterion.setField(field);
- likeCriterion.setValue(value);
- likeCriterion.setTableName(tableName);
- return likeCriterion;
- }
- public static Criterion getNotLikeCriterion(String field, Object value,
- String tableName) {
- NotLikeCriterion notLikeCriterion = new NotLikeCriterion();
- notLikeCriterion.setCriterionType(CriterionType.NOT_LIKE);
- notLikeCriterion.setField(field);
- notLikeCriterion.setValue(value);
- notLikeCriterion.setTableName(tableName);
- return notLikeCriterion;
- }
- public static Criterion getEqualCriterion(String field, Object value,
- String tableName) {
- EqualCriterion equalCriterion = new EqualCriterion();
- equalCriterion.setCriterionType(CriterionType.EQUAL);
- equalCriterion.setField(field);
- equalCriterion.setValue(value);
- equalCriterion.setTableName(tableName);
- return equalCriterion;
- }
- public static class LikeCriterion extends Criterion {
- }
- public static class NotLikeCriterion extends Criterion {
- }
- public static class EqualCriterion extends Criterion {
- }
- public static class CompareCriterion extends Criterion {
- private CompareType compareType;
- public CompareType getCompareType() {
- return compareType;
- }
- public void setCompareType(CompareType compareType) {
- this.compareType = compareType;
- }
- }
- public String getTableName() {
- return tableName;
- }
- public void setTableName(String tableName) {
- this.tableName = tableName;
- }
- public String getFieldPrefix() {
- return (tableName == null || tableName.length() == 0) ? "" : tableName
- + ".";
- }
- }
简要说明一下:
- 我把Criterion分成4类:EqualCriterion、CompareCriterion、LikeCriterion、NotLikeCriterion。(具体划分方式全为使用方便)
- 另外还有两个静态方法:convertToSql和getCriteriaValues,用来将Criterion列表转化为JdbcTemplate需要的SQL子句和参数列表。
回到ListContactsAction,代码如下:
- package cn.gengv.struts2ex.jqGrid;
- import java.util.Collections;
- import java.util.List;
- import com.byzl.hare.dao.impl.Criterion;
- import com.byzl.hare.model.Contact;
- import com.byzl.hare.service.ContactService;
- @SuppressWarnings("serial")
- public class ListContactsAction extends JqGridBaseAction<Contact> {
- private ContactService contactService;
- @Override
- public String execute() {
- return this.refreshGridModel();
- }
- @Override
- public int getResultSize() {
- return this.contactService.queryResultsCount(null);
- }
- @Override
- public List<Contact> listResults(int from, int length) {
- return this.contactService.queryByPage(null, from, length);
- }
- @Override
- public int getResultSize(List<Criterion> criteria) {
- return this.contactService.queryResultsCount(criteria);
- }
- @Override
- public List<Contact> listResults(List<Criterion> criteria, int from, int length) {
- List<Contact> results = Collections.emptyList();
- results = this.contactService.queryByPage(criteria, from, length);
- return results;
- }
- public void setContactService(ContactService contactService) {
- this.contactService = contactService;
- }
- }
OK,服务器端的工作就先这样了,应对单条件查询已经足够了。再来看看客户端需要什么特别的。
jqGrid的单条件查询和高级查询(复杂条件查询)都是基于表单的查询,使用的都是jqGrid的searchGrid方法:
$("#grid_id").searchGrid( options );
或者
$("#grid_id").jqGrid('searchGrid', options );
注:要想使用searchGrid方法,在下载jqGrid的时候,必须包含Common, Form Edit, Search Plugin的模块。
在Navigator按钮栏中的查询按钮,默认就是调用这个方法。
searchGrid也有很多选项,在language文件(grid.locale-xx.js)中,有关于这些选项的默认值定义。下面介绍一下主要常用的选项:
- afterShowSearch :用于定义每次查询对话框显示之后,要执行的事件函数;
- beforeShowSearch :用于定义每次查询对话框显示之前,要执行的事件函数;
- caption :查询对话框的标题;
- closeAfterSearch :如果设为true,则每次在查询对话框中点击“查询”按钮完成查询后,对话框都会被关闭;默认为false;
- closeAfterReset :如果设为true,则每次在查询对话框中点击“重置”按钮完成查询后,对话框都会被关闭;默认为false;
- closeOnEscape :如果设为true,则当按ESC键的时候,对话框会被关闭;默认为false;
- Find :查询对话框里“查询”按钮上的文本;
- Reset :查询对话框里“重置”按钮上的文本;
- sopt :用来设置通用的查询规则,如['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc'];如果为设置,则使用全部规则;
- odata :用来翻译sopt中规则的对应数组;
- onClose :当查询对话框关闭时,将要执行的事件函数。可以返回true或false;如果返回false,则查询对话框不会被关闭。
- onInitializeSearch :当查询对话框创建时,将要执行的事件函数。
- recreateFilter :如果设置为true,则当动态改变colModel的属性时,重建查询并解除时间绑定。
- sField, sOper, sValue :当提交查询请求时,对应着所包含的有关于查询的参数;默认值分别是'searchField','searchOper','searchString'。
以上这些就是关于单条件查询的选项;关于复杂条件查询的选项稍后介绍。
注意:在searchGrid方法中设定这些选项,和在navGrid方法的prmSearch参数中设置这些选项(参见上一篇),作用效果是相同的。
即
- var singleCriterionSearch = function() {
- $("#gridTable").jqGrid("searchGrid", {
- caption: "查找",
- Find: "Go!",
- closeAfterSearch: true
- });
- };
等同于
- $("#gridTable").jqGrid("navGrid", "#gridPager", {},{},{},{},
- { // 与查询相关的prmSearch参数
- caption: "查找",
- Find: "Go!",
- closeAfterSearch: true
- },{});
当点击查询对话框中的“查询”按钮的时候,jqGrid会向Server提交一个请求,例如:
http://localhost:8085/Hare/jqGridTest/jqGrid05.action?search=true&nd=1278685481936&rows=15&page=1&sidx=&sord=asc&searchField=id&searchString=9000&searchOper=ge
2. 高级查询(复杂条件表单查询)
在上一部分已经提到了,单条件表单查询和高级查询(复杂条件表单查询)都是用的是searchGrid方法,只不过是传入的选项值有所不同而已。其中最重要的一个选项就是multipleSearch。
下面就来详细介绍在searchGrid中,与复杂条件查询相关的主要选项:
- multipleSearch :如果设置为true,则激活复杂条件查询;默认为false。
- groupOps :默认通常为[ { op: "AND", text: "all" }, { op: "OR", text: "any" } ],表示需要满足多重条件的方式,例如满足所有查询条件或者满足任意查询条件。
- sFilter :对应着在复杂查询提交请求时,对应的参数名;默认为filters。
将javascript代码改为:
- $("#gridTable").jqGrid("navGrid", "#gridPager", {},{},{},{},
- { // 与查询相关的prmSearch参数
- caption: "查找",
- Find: "Go!",
- closeAfterSearch: true,
- multipleSearch: true,
- groupOps: [{ op: "AND", text: "全部" }]
- },{});
或者
- var complexCriteriaSearch = function() {
- $("#gridTable").jqGrid("searchGrid", {
- caption: "查找",
- Find: "Go!",
- closeAfterSearch: true,
- multipleSearch: true,
- groupOps: [{ op: "AND", text: "全部" }]
- });
- };
除了选项上的不同以外,客户端的另一个不同之处在于,向Server端传递的参数不同。在第一部分的例子中可以看到,当单条件查询提交请求的时候,传递的参数是:
http://localhost:8085/Hare/jqGridTest/jqGrid05.action?search=true&nd=1278685481936&rows=15&page=1&sidx=&sord=asc&searchField=id&searchString=9000&searchOper=ge
即:
- nd: 1278688214496
- page: 1
- rows: 15
- search: true
- searchField: id
- searchOper: ge
- searchString: 9000
- sidx:
- sord: asc
而复杂条件的查询的参数是下面这种形式:
http://localhost:8085/Hare/jqGridTest/jqGrid05.action?search=true&nd=1278688110637&rows=15&page=1&sidx=&sord=asc&filters=%7B%22groupOp%22%3A%22AND%22%2C%22rules%22%3A%5B%7B%22field%22%3A%22id%22%2C%22op%22%3A%22le%22%2C%22data%22%3A%221500%22%7D%2C%7B%22field%22%3A%22lastName%22%2C%22op%22%3A%22bw%22%2C%22data%22%3A%22LN-3%22%7D%2C%7B%22field%22%3A%22email%22%2C%22op%22%3A%22cn%22%2C%22data%22%3A%22sy%22%7D%5D%7D
即:
- filters: {"groupOp":"AND","rules":[{"field":"id","op":"le","data":"1500"},{"field":"lastName","op":"bw","data":"LN-3"},{"field":"email","op":"cn","data":"sy"}]}
- nd: 1278688110637
- page: 1
- rows: 15
- search: true
- sidx:
- sord: asc
我们可以发现,传递的参数中除了search以外,searchField、searchOper、searchString都不见了,取而代之的是一个filters参数。filters参数查询条件以及复杂条件的匹配方式封装成了json的格式,然后传递给Server。
针对这种格式的参数,继续使用第一个例子中的JqGridBaseAction类的查询方式,显然是无法应对的。我们必须再次改进JqGridBaseAction类。而关键之处就是如何解析这个json格式的filters参数。
为此,我引入了json-lib库(http://json-lib.sourceforge.net/ ),其他的关于json的java库还可以访问http://www.json.org/ 。
在JqGridBaseAction类中添加方法generateSearchCriteriaFromFilters(),来将filters参数解析为Criterion列表。
- public List<Criterion> generateSearchCriteriaFromFilters(String filters) {
- List<Criterion> criteria = new ArrayList<Criterion>();
- JSONObject jsonObject = JSONObject.fromObject(filters);
- JSONArray rules = jsonObject.getJSONArray("rules");
- for(Object obj : rules) {
- JSONObject rule = (JSONObject) obj;
- String field = rule.getString("field");
- String op = rule.getString("op");
- String data = rule.getString("data");
- Criterion criterion = this.generateSearchCriterion(field, data, op);
- if(criterion != null) {
- criteria.add(criterion);
- }
- }
- return criteria;
- }
其余部分的代码:
- package cn.gengv.struts2ex.jqGrid;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- import net.sf.json.JSONArray;
- import net.sf.json.JSONObject;
- import com.byzl.hare.dao.impl.Criterion;
- import com.byzl.hare.dao.impl.Criterion.CompareType;
- import com.opensymphony.xwork2.ActionSupport;
- @SuppressWarnings("serial")
- public abstract class JqGridBaseAction<T> extends ActionSupport {
- private List<T> gridModel = Collections.emptyList();
- private Integer rows = 0;
- private Integer page = 0;
- private Integer total = 0;
- private Integer record = 0;
- private String sord;
- private String sidx;
- private boolean search;
- private String searchField;
- private String searchString;
- private String searchOper;
- public abstract int getResultSize();
- public abstract List<T> listResults(int from, int length);
- // (1)添加filters成员变量
- private String filters;
- public abstract int getResultSize(List<Criterion> criteria);
- public abstract List<T> listResults(List<Criterion> criteria, int from, int length);
- public String refreshGridModel() {
- try {
- List<Criterion> criteria = Collections.emptyList();
- if(search == true) {
- criteria = new ArrayList<Criterion>();
- // (2)将Filter转化为Criterion列表,并加入总的Criterion列表
- if(filters != null && filters.length()>0) {
- criteria.addAll(this.generateSearchCriteriaFromFilters(filters));
- }
- // (3)将searchField、searchString、searchOper转化为Criterion,并加入总的Criterion列表
- Criterion criterion = this.generateSearchCriterion(searchField, searchString, searchOper);
- if(criterion != null) {
- criteria.add(criterion);
- }
- }
- int from = rows * (page - 1);
- int length = rows;
- List<T> results = Collections.emptyList();
- if(!criteria.isEmpty()) {
- record = this.getResultSize(criteria);
- results = this.listResults(criteria, from, length);
- } else {
- record = this.getResultSize();
- results = this.listResults(from, length);
- }
- this.setGridModel(results);
- total = (int) Math.ceil((double) record / (double) rows);
- return SUCCESS;
- } catch (Exception e) {
- e.printStackTrace();
- this.addActionError(e.getMessage());
- return ERROR;
- }
- }
- public Criterion generateSearchCriterion(String searchField,
- String searchString, String searchOper) {
- ...
- }
- public List<Criterion> generateSearchCriteriaFromFilters(String filters) {
- List<Criterion> criteria = new ArrayList<Criterion>();
- JSONObject jsonObject = JSONObject.fromObject(filters);
- JSONArray rules = jsonObject.getJSONArray("rules");
- for(Object obj : rules) {
- JSONObject rule = (JSONObject) obj;
- String field = rule.getString("field");
- String op = rule.getString("op");
- String data = rule.getString("data");
- Criterion criterion = this.generateSearchCriterion(field, data, op);
- if(criterion != null) {
- criteria.add(criterion);
- }
- }
- return criteria;
- }
- //getter和setter
- ...
- }
经过如上修改,JqGridBaseAction类可以接受单条件查询和复杂条件查询请求了。
3. 工具条查询
再来看看工具条查询,工具条查询主要依靠jqGrid的filterToolbar方法:
$("#grid_id").filterToolbar(options);
或者
$("#grid_id").jqGrid('filterToolbar',options);
主要的选项包括:
- autosearch :当在查询工具条的输入框中点击回车,或者select选择框中的值发生改变的时候,search参数将设为true,并触发ajax请求。默认为true。
- beforeSearch :查询前触发的事件函数。如果返回true,则不继续出发查询;在这种情况中,可以自己构建查询参数来查询数据。其他返回类型,都会触发查询。
- afterSearch :查询后触发的事件函数。
- beforeClear :当清理输入值之前触发的事件函数(例如clearToolbar方法(稍后介绍))。如果设为true,则不继续触发清理查询事件;这种情况下,可以自己构建参数来从Server获得数据。其他返回类型,都会触发事件。
- afterClear :当清理输入值之后触发的事件函数(例如clearToolbar方法(稍后介绍))。
- searchOnEnter :如果设为true,就参考autosearch;如果设为false,则输入字符后,立即进行查询。
- stringResult :决定如何发送查询参数,如果设为false,则按key:value对的形式,发送参数;如果设为true,则按照复杂条件查询的方式,发送查询参数(其中包含json格式的filters参数)。
- groupOp :只有stringResult为true时,此选项才有效;其值可以为AND或OR;默认为AND。
注:sopt选项在此方法中不会起作用。
在stringResult不为true的情况下,查询参数是这样的:
- firstName: FN-cjxxxds3
- lastName: LN-3iviu7o
- nd: 1278692114137
- page: 1
- rows: 15
- search: true
- sidx:
- sord: asc
- telNo: TEL-gzbn1w
而当stringResult设为true的情况下,查询参数会按照复杂条件查询的方式发送:
- filters: {"groupOp":"AND","rules":[{"field":"lastName","op":"bw","data":"LN-3iviu7o"},{"field":"firstName","op":"bw","data":"FN-cjxxxds3"},{"field":"telNo","op":"bw","data":"TEL-gzbn1w"}]}
- nd: 1278692302168
- page: 1
- rows: 15
- search: true
- sidx:
- sord: asc
工具条查询相关的附加方法:
- triggerToolbar :当调用此方法,search参数会变为true,并向Server提交ajax请求;
- clearToolbar :当调用此方法,清除输入值,并将search参数设为false,向Server提交ajax请求;
- toggleToolbar :打开/关闭查询工具条。
注意以上三种附加方法的调用方式为:
$("#gridTable")[0].triggerToolbar();
注:一定不能少了“[0]”。
4. 自定义查询
虽然官方文档里将这种查询方式成为自定义查询,但其实就是工具条查询的变种。无非是改变了查询工具条的位置以及构建方式。
首先需要在html页面中建立一个区域,用于存放输入查询条件的表单,例如:
<div id="mysearch"></div>
然后构建查询工具条:
$("#mysearch").filterGrid('#grid_id',options);
或者
$("#mysearch").jqGrid('filterGrid','#grid_id',options);
主要选项:
- gridModel :默认为false;如果设为true,则使用colModel中的name、index、edittype、editoptions、search等属性来构建查询(只有colModel的search属性为true的列会被用来构建查询表单);如果此项被设为false,则应构建一个filterModel数组来处理查询。
- gridNames :默认为false;仅当gridModel为true的时候有效,当此项设为true时,会从jqGrid的colNames选项或得每列的标题。
- filterModel :当gridModel为false是应该使用该属性构建查询表单。(稍后介绍)
- formtype :定义查询表单应该是横向排列的还是纵向排列的。
- autosearch :设为true时,当输入框中回车或select选择框值改变时,触发查询;设为false时,通过按钮触发查询。默认为true。
- formclass/tableclass/buttonclass :应用于表单的样式。
其他选项,可在真正使用时,查询文档。
filterModel: [
…
{label:'LableFild', name: 'colname', stype: 'select', defval: 'default_value', surl: 'someurl', sopt:{optins for the select}},
…
]
注:由于传递查询参数的方式与工具条查询在stringResult不为true的情况下类似,即key:value对的格式,因此这种查询方式对于JqGridBaseAction类来说用处不大。
附加方法:
- triggerSearch :触发查询;
- clearSearch :清除查询表单中的值,并使用空表单或默认值从Server获得数据。
var sg = jQuery("#mysearch").filterGrid(...)[0];
sg.triggerSearch();
sg.clearSearch();
sg.triggerSearch();
发表评论
-
jquery的getJSON重复调用问题
2013-11-07 23:18 900$.getJSON("incomeHeaderJso ... -
【转】JQuery UI AutoComplete 与 Strtus2 结合使用
2013-03-04 23:37 1643http://www.cnblogs.com/dongliya ... -
Struts2.2.1注解方式使用json整合jquery getJson方法
2013-01-10 22:53 01.引入与json相关的jar文件: json-lib ... -
【转】 jqGrid基础学习:jqGrid中在导航条使用按钮
2013-01-10 17:46 11377转至:http://blog.csdn.net/yangbob ... -
【转】 jqGrid进阶教程:qGrid的数据格式化二
2013-01-10 17:46 1760转至:http://blog.csdn.net/yangbob ... -
【转】jqGrid与Struts2的结合应用(十) —— 真正的自定义表单查询
2013-01-08 14:24 1984转至:http://blog.csdn.net/gengv/a ... -
【转】 jqGrid基础学习:jqGrid中使用分页
2013-01-10 17:45 2093转至:http://blog.csdn.net/yangbob ... -
【转】jqGrid与Struts2的结合应用(三) —— 使用自定义表单对话框编辑Grid数据
2013-01-08 14:23 1327转至:http://blog.csdn.net/gengv/a ... -
【转】 jqGrid与Struts2的结合应用(一) —— 显示基本Grid表格
2013-01-08 14:21 1895转至:http://blog.csdn.net/gengv/a ... -
【转】jqGrid与Struts2的结合应用(二) —— 操作Grid数据
2013-01-08 14:21 1299转至:http://blog.csdn.net/gengv/a ... -
【转】 jqGrid与Struts2的结合应用(九) —— 补充细节
2013-01-08 14:23 1140转至:http://blog.csdn.net/gengv/a ... -
【转】 jqGrid与Struts2的结合应用(八) —— 奇妙的subGrid子表格
2013-01-05 22:43 1325转至:http://blog.csdn.net/gengv/a ... -
jqGrid与Struts2的结合应用(七) —— 浅谈排序
2013-01-05 22:41 1973转至:http://blog.csdn.net/gengv/a ... -
【转】jqGrid与Struts2的结合应用(六) —— 使用colModel设置查询功能
2013-01-05 22:40 1182转至:http://blog.csdn.net/gengv/a ... -
【转】jqGrid与Struts2的结合应用(四) —— 丰富多彩的Pager Bar
2013-01-05 22:37 2576转至: http://blog.csdn.net/gengv/ ... -
Jquery dom 事件冒泡处理
2012-12-14 15:14 10811. 什么是冒泡 在页面上可以有多个事件,也可以多个元素响应同 ... -
jquery事件
2012-12-14 14:48 8911.toggle $(document).ready(func ... -
jquery dom 遍历
2012-12-12 14:46 10551. 交替为表格行添加样式 $(document).rea ... -
jquery xpath选择符
2012-12-11 21:59 18711. $('a[@title]') 选择所有带title ... -
jquery工厂函数
2012-12-11 21:42 0工厂函数 标签名:$('p')取得所有p元素 ID: $('# ...
相关推荐
在本项目中,jqGrid 与 Struts2 结合,实现了Web应用中的核心功能——增删改查。以下是关键步骤: 1. **配置 Struts2**:首先,需要在项目的 `struts.xml` 配置文件中设置Action类及其对应的URL映射,以及指定使用...
【jqgrid+三大框架】是将前端数据展示组件jqGrid与经典的Java后端开发框架——Hibernate、Struts和Spring相结合的应用实例。这个项目基于MyEclipse2014开发环境,主要目标是实现数据的查询功能并通过jqGrid进行前端...
学习该项目时,可以结合提供的链接——http://blog.csdn.net/gengv/archive/2010/07/05/5714834.aspx,这个博客文章可能详细讲解了如何将SSH框架与jqGrid集成,包括如何配置Struts2的动作类来处理请求,怎样在Spring...
本主题主要关注的是两个流行的Java开发框架——Hibernate和Struts2,以及用于前端展示的JqGrid。这些技术的结合使用,可以帮助开发者快速构建出功能完善的Web应用程序。 Hibernate是一个强大的对象关系映射(ORM)...
含热电联供的智能楼宇群协同能量管理策略:基于多主体协同与需求响应的热电混合运行策略研究,“基于Stackelberg博弈与需求响应的智能楼宇群热电协同能量管理策略”,MATLAB代码:含热电联供的智能楼宇群协同能量管理 关键词:楼宇能量管理系统;热电联供系统;Stackelberg博弈;需求响应 参考文档:《含热电联供的智能楼宇群协同能量管理》华北电力硕士lunwen 仿真平台:MATLAB 主要内容:本文提出了一种计及热电耦合需求响应的智能楼宇群的多主体协同能量管理策略。 传统热电联供系统采取单一的“以电定热”或“以热定电”运行策略,在实际运用中将无可避免地造成能源的浪费。 针对这一现状,本文采取“热电混合运行”策略对联供系统进行调控,在该运行策略下,运营商可以结合不同时段的价格信息、负荷水平等因素灵活采取使自身收益最大化的运行策略。 在热电协同能量管理层面,以楼宇群运营商的收益以及用户的效益最大化为目标,提出了智能楼宇群内部的优化定价策略,运营商在系统中负责向用户供电与供热,并自主制定电与热价格引导用户进行需求响应;其次,用户具有可平移电负荷以及可削减热负荷,可根据当前的价格信息自
随机规划下的虚拟电厂与微网双不确定性优化调度模型研究:基于MATLAB与CPLEX的仿真平台实现,计及双重不确定性的虚拟电厂微网日前随机优化调度策略——基于MATLAB与CPLEX平台的研究,MATLAB代码:计及源-荷双重不确定性的电厂 微网日前随机优化调度 关键词:电厂 微网 随机优化 随机调度 源-荷双重不确定性 电厂调度 参考文档:《Virtual power plant mid-term dispatch optimization》参考其燃气轮机、以及储能部分模型,另外随机优化算法也是和该文档一致; 仿真平台:MATLAB+CPLEX 主要内容:代码主要做的是一个电厂或者微网单元的日前优化调度模型,考虑了光伏出力和负荷功率的双重不确定性,采用随机规划法处理不确定性变量,构建了电厂随机优化调度模型。 具体来看,首先是基于蒙特卡洛算法,对预测的光伏以及负荷曲线进行场景生成,然后基于快概率距离快速消除法进行削减,直至削减至5个场景,然后采用随机调度的方法,对多场景下的电厂调度策略进行优化,程序实现效果良好,纯程序为本人亲自所写,一行一注释, ,关键词:虚拟电厂; 微网; 随
1、文件内容:rsyslog-mmaudit-8.24.0-57.el7_9.3.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/rsyslog-mmaudit-8.24.0-57.el7_9.3.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用
前端博客系统代码
18考试真题最近的t67.txt
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用
基于Plecs的模块化多电平换流器设计:PMW调制下的小输出电压纹波半桥子模块实现,基于Plecs实现的模块化多电平半桥换流器,采用PWM调制方式实现低电压纹波输出,用plecs实现的模块化多电平流器,调制方式是PMW,输出电压纹波小,子模块是半桥 ,关键词提取结果:plecs;模块化多电平换流器;PWM调制;输出电压纹波小;半桥子模块;,《Plecs模拟模块化半桥式PWM多电平换流器》——输出低纹波电压的研究与应用
## 01、数据简介 股票流动性是指股票在市场上被买卖的容易程度和速度,即投资者能够在不造成显著价格变动的情况下迅速买卖股票的能力。 Amihud指标结果这是一个衡量股票流动性的指标,为股票在一段时间的收益率与交易额的比值的负对数值。如果股票交易量的变动会带来股价的剧烈波动(暴涨暴跌),则Amihud指标越大,股票流动性越差;反之,如果交易量的变化对股价变化的影响越小,则说明股票的流动性较好。由于这是一个计算结果,因此需要根据实际的股票交易数据来计算。 数据名称:上市公司-股票流动性指标 数据年份:2000-2023年 ## 02、相关数据 stkcd、年份、证券代码、Amihud指标结果、交易天数。
Simulink在DSP2833x开发板上的电机控制与通讯模型自动生成代码教程,Simulink在DSP2833x开发板上的电机控制与通讯模型自动生成代码教程,模型开发域控制Simulik自动生成代码 DSP2833x基于模型的电机控制设计 MATLAb Simulik自动生成代码 基于dsp2833x 底层驱动库的自动代码生成 MATLAB Simulink仿真及代码生成技术入门教程 内容为Simulink在嵌入式领域的应用,具体是Simulink在DSP28335这块开发版上的应用模型:包括直流电机、PMSM、步进电机控制模型,还有常见的LED、串口、CAN等通讯相关Simulink模型,模型都有相关解释文件。 ,核心关键词: Simulink应用; DSP2833x开发版; 电机控制模型; 直流电机模型; PMSM模型; 步进电机模型; LED模型; 串口模型; CAN通讯模型; 自动代码生成; 底层驱动库。,MATLAB Simulink在DSP2833x上的嵌入式开发:自动生成代码的模型应用与实践教程
19考试真题最近的t24.txt
protues8.17安装包,无须积分,即可下载
计及电动汽车灵活性的微网三阶段多时间尺度协调调度模型:优化经济调度、实时调整与减少功率波动策略,计及电动汽车灵活性的微网多时间尺度经济协调调度模型,计及电动汽车灵活性的微网多时间尺度协调调度模型 摘要:构建了含有电动汽车参与的微网 电厂多时间尺度协调优化模型,其中包括日前-日内-实时三阶段,日前阶段由于风光出力具有不确定性,结合风光预测值作初步经济调度;日内阶段,风光出力观测的更加准确,通过调节储能、需求响应等单元对调度方案作进一步调整,避免遭受高额的不平衡惩罚;实时阶段,风光出力的预测结果更准确,为了进一步降低微网与上级电网并网功率的波动性,充分利用电动汽车的灵活性,调度电动汽车的充放电以减少功率波动,兼顾调度的安全性与经济性。 ,微网协调调度模型; 电动汽车灵活性; 多时间尺度; 风光出力; 储能需求响应; 实时调整; 经济性,电动汽车灵活性的微网多尺度协调调度模型研究
基于MPC的电动汽车分布式协同自适应巡航控制:上下分层控制与仿真结果展示,基于MPC的电动汽车协同自适应巡航控制:上下分层控制与仿真结果展示,基于MPC的分布式电动汽车协同自适应巡航控制,采用上下分层控制方式,上层控制器采用模型预测控制mpc方式,产生期望的加速度,下层根据期望的加速度分配扭矩;仿真结果良好,能够实现前车在加减速情况下,规划期望的跟车距离,产生期望的加速度进行自适应巡航控制。 ,关键词:MPC(模型预测控制); 分布式电动汽车; 协同自适应巡航控制; 上下分层控制方式; 期望加速度; 扭矩分配; 仿真结果良好; 前车加减速; 跟车距离。,基于MPC的分层控制电动汽车自适应巡航系统,仿真实现前车加减速跟车距离自适应
MATLAB代码实现电-气-热综合能源系统耦合优化调度模型:精细注释与实用模块子程序,MATLAB实现电-气-热综合能源系统优化调度的精细化建模与求解策略利用电网、热网与气网耦合交互的复杂系统特性进行深度调度分析,MATLAB代码:电-气-热综合能源系统耦合优化调度 关键词:综合能源系统 优化调度 电气热耦合 参考文档:自编文档,非常细致详细,可联系我查阅 仿真平台:MATLAB YALMIP+cplex gurobi 主要内容:代码主要做的是一个考虑电网、热网以及气网耦合调度的综合能源系统优化调度模型,考虑了电网与气网,电网与热网的耦合,算例系统中,电网部分为10机39节点的综合能源系统,气网部分为比利时20节点的配气网络,潮流部分电网是用了直流潮流,气网部分也进行了线性化的操作处理,代码质量非常高,保姆级的注释以及人性化的模块子程序,所有数据均有可靠来源 ,关键词:综合能源系统; 优化调度; 电气热耦合; 10机39节点; 比利时20节点; 直流潮流; 线性化处理; MATLAB YALMIP; cplex gurobi。,MATLAB代码:电-气-热综合能源系统耦合优化调度
报告电子元器件手册目录,常见电子元器件的参考资料以及70种电子元器件封装等等,非常适合初学者进行学习和掌握。希望大家都能够在电子领域进行深耕。