jqGrid基础学习:11jqGrid的查询时和后台的交互

jqGrid查询时和后台交互是一个比较棘手的问题,因为发送过来的数据不规则。


单字段
我们通过Firefox的firebug来进行调试,我们发现提交搜索请求后,向后台发送的参数如下

单字段同后台交互

单字段同后台交互


由此,我们看出单字段查询,jqGrid向服务器传递的参数是searchField、searchString、searchOper这三个参数。
searchField代表要查询的字段,searchString是查询的内容,searchOper是操作,后台获取到的searchOper的值,对应的是’eq’,'ne’,'lt’,'le’,'gt’,'ge’,'bw’,'bn’,'in’,'ni’,'ew’,'en’,'cn’,'nc’,这些可以再jqGrid设置那些使用,那些不使用。

多字段查询
使用同样的方法,我们可以发现,多字段查询,jqGrid向后台传递的参数为一个json字符串。

jqGrid多字段查询

jqGrid多字段查询


因此,取得这个数据需要进行对json数据进行解析。

同时,我们注意到。不管是单字段查询还是多字段查询,如果前台执行了查询,都会向后台传递一个_search参数,来指明后台是否启用搜索。

其他的就不废话了,直接上源码。
新建一个规则的类

public class SearchRule {
	private String field;   //查询字段
    private String op;      //查询操作
    private String data;    //选择的查询值
	public String getField() {
		return field;
	}
	public void setField(String field) {
		this.field = field;
	}
	public String getOp() {
		return op;
	}
	public void setOp(String op) {
		this.op = op;
	}
	public String getData() {
		return data;
	}
	public void setData(String data) {
		this.data = data;
	}
}

新建一个过滤的类

public class FilterSearch {
	private String groupOp; //多字段查询时分组类型,主要是AND或者OR   

	private List<searchrule> rules; //多字段查询时候,查询条件的集合 

	public String getGroupOp() {
		return groupOp;
	}
	public void setGroupOp(String groupOp) {
		this.groupOp = groupOp;
	}
	public List</searchrule><searchrule> getRules() {
		return rules;
	}
	public void setRules(List</searchrule><searchrule> rules) {
		this.rules = rules;
	}

}

</searchrule>

查询的工具类

public class JqGridHandler {

	private HttpServletRequest request = null;

	private String _search = "false";
	private String searchField;
	private String searchOper;
	private String searchString;
	private String filters;
	private String sidx = "1";
	private String sord = "desc";

	// 存储总体的search
	FilterSearch filterSearch = null;

	public JqGridHandler() {

	}

	public JqGridHandler(HttpServletRequest request) {
		this.request = request;

	}

	public String getWheres(String prefix, boolean isWhere) {
		conditions();
		if(tranToSQL(prefix).trim().equals("")){
			return "";
		}
		if (!isWhere) {
			return new StringBuilder(" where ").append(tranToSQL(prefix))
					.toString();
		}
		return new StringBuilder(" and ").append(tranToSQL(prefix)).toString();
	}

	public String getOrders(String prefix, boolean isOrder) {
		init();
		StringBuilder sb = new StringBuilder();
		if (isOrder) {
			if (null != prefix) {
				sb.append(prefix).append(".");
			}

		} else {
			sb.append(" order by ");
			if (null != prefix) {
				sb.append(prefix).append(".");
			}
		}
		return sb.append(doTables(sidx)).append(" ").append(sord).toString();
	}

	// 根据conditions转换成sql格式
	public String tranToSQL(String prefix) {
		StringBuilder sb = new StringBuilder("");

		if (null != filterSearch) {
			List<searchrule> rules = filterSearch.getRules();
			int count = 0;
			if (null != rules && (count = rules.size()) > 0) {
				for (SearchRule rule : rules) {
					if (null != rule.getField() && null != rule.getData()
							&& null != rule.getOp()) {
						if ("eq".equalsIgnoreCase(rule.getOp())) {

							sb.append(rule.getField()).append(" = ")
									.append("'").append(rule.getData()).append(
											"'");

						} else if ("nq".equalsIgnoreCase(rule.getOp())) {
							if (null != prefix) {
								sb.append(prefix).append(".");
							}
							sb.append(rule.getField()).append(" != ").append(
									"'").append(rule.getData()).append("'");
						} else if ("lt".equalsIgnoreCase(rule.getOp())) {
							if (null != prefix) {
								sb.append(prefix).append(".");
							}
							sb.append(rule.getField()).append(" < ")
									.append("'").append(rule.getData()).append(
											"'");
						} else if ("le".equalsIgnoreCase(rule.getOp())) {
							if (null != prefix) {
								sb.append(prefix).append(".");
							}
							sb.append(rule.getField()).append(" <= ").append(
									"'").append(rule.getData()).append("'");
						} else if ("gt".equalsIgnoreCase(rule.getOp())) {
							if (null != prefix) {
								sb.append(prefix).append(".");
							}
							sb.append(rule.getField()).append(" > ")
									.append("'").append(rule.getData()).append(
											"'");
						} else if ("ge".equalsIgnoreCase(rule.getOp())) {
							if (null != prefix) {
								sb.append(prefix).append(".");
							}
							sb.append(rule.getField()).append(" >= ").append(
									"'").append(rule.getData()).append("'");
						} else if ("bw".equalsIgnoreCase(rule.getOp())) {
							if (null != prefix) {
								sb.append(prefix).append(".");
							}
							sb.append(rule.getField()).append(" like ").append(
									"'").append(rule.getData()).append("%")
									.append("'");
						} else if ("ew".equalsIgnoreCase(rule.getOp())) {
							if (null != prefix) {
								sb.append(prefix).append(".");
							}
							sb.append(rule.getField()).append(" like ").append(
									"'").append("%").append(rule.getData())
									.append("'");
						} else if ("cn".equalsIgnoreCase(rule.getOp())) {
							if (null != prefix) {
								sb.append(prefix).append(".");
							}
							sb.append(rule.getField()).append(" like ").append(
									"'").append("%").append(rule.getData())
									.append("%").append("'");
						} else {

						}
						count--;
						if (count > 0) {
							if (null != filterSearch.getGroupOp()) {
								if (filterSearch.getGroupOp().equals("and"))
									sb.append(" and ");
								else
									sb.append(" or ");
							}

						}
					}

				}
			}
		}
		return sb.toString();
	}

	// 装载
	@SuppressWarnings("unchecked")
	private void conditions() {
		// 初始化,如果request为空,说明是从set进来的。
		init();

		// 分拆,全部写入filersearch
		if (null != _search && "true".equalsIgnoreCase(_search)) {
			// 先写多选择的,一般有多选择就不会有单选择。
			if (null != filters && filters.length() > 0) {
				Map m = new HashMap();
				m.put("rules", SearchRule.class);
				filterSearch = (FilterSearch) JsonUtils.getDTOList(filters,
						FilterSearch.class, m);

			} else {
				if (null != searchOper && null != searchString
						&& null != searchField) {
					SearchRule rule = new SearchRule();
					rule.setData(searchString);
					rule.setOp(searchOper);
					rule.setField(doTables(searchField));
					filterSearch = new FilterSearch();
					filterSearch.setGroupOp(null);
					List</searchrule><searchrule> rules = new ArrayList</searchrule><searchrule>();
					rules.add(rule);
					filterSearch.setRules(rules);
				}
			}
		}

	}

	private  void init() {
		if (request != null) {
			_search = request.getParameter("_search");
			searchOper = request.getParameter("searchOper");
			searchString = request.getParameter("searchString");
			searchField = request.getParameter("searchField");
			filters = request.getParameter("filters");
			sidx = request.getParameter("sidx");
			sord = request.getParameter("sord");
		}
	}

	public HttpServletRequest getRequest() {
		return request;
	}

	public void setRequest(HttpServletRequest request) {
		this.request = request;
	}

	public String get_search() {
		return _search;
	}

	public void set_search(String _search) {
		this._search = _search;
	}

	public String getSearchField() {
		return searchField;
	}

	public void setSearchField(String searchField) {
		this.searchField = searchField;
	}

	public String getSearchOper() {
		return searchOper;
	}

	public void setSearchOper(String searchOper) {
		this.searchOper = searchOper;
	}

	public String getSearchString() {
		return searchString;
	}

	public void setSearchString(String searchString) {
		this.searchString = searchString;
	}

	public String getFilters() {
		return filters;
	}

	public void setFilters(String filters) {
		this.filters = filters;
	}

	public String getSidx() {
		return sidx;
	}

	public void setSidx(String sidx) {
		this.sidx = sidx;
	}

	public String getSord() {
		return sord;
	}

	public void setSord(String sord) {
		this.sord = sord;
	}

	public FilterSearch getFilterSearch() {
		return filterSearch;
	}

	public void setFilterSearch(FilterSearch filterSearch) {
		this.filterSearch = filterSearch;
	}

	private String doTables(String str){
		if(str.startsWith("__")){
			str = str.substring(2);
			return str.replaceAll("_", ".");
		} else {
			return str;
		}

	}
}
</searchrule>

其中,先不要去理睬dotables函数是做什么的。

json工具类参照json工具类进行。

相关日志

  • jqGrid进阶教程:3、jqGrid的数据格式化二
    jqGrid是非常强大的,除了上一讲提到的预置的格式化外,还提供自定义的格式化方法,这种方法也是我比较喜欢的方法。 我们接上面的例子 $("#grid_id").jqGrid({ ... colModel : [ {name:'sex', edittype:'select', editoptions:{value:"1:男;2:女"}} ... ], ... }); ...
  • jqGrid例子文件下载
    最近慵懒了很多,很少来上面博一博,发下jqGrid的例子的全部文件。 jqGrid 由于文件太大,删掉了所有的jar包,jar是整合struts2.1+spring2.5+hibernate3.2...
  • jqGrid进阶教程:1、jqGrid的样式无法正确显示的原因和解决办法
    jqGrid引入后,执行,常常会碰到css无法像官方的demo一样正常显示,特别是字体还有一些弹出框, 例如 [caption id="attachment_407" align="alignnone" width="300" caption="CSS变样"][/caption] 这种问题的原因多半是因为html的标准问题,即其写法为 如果要让样式正常,要采用写法如下 ...
  • jqGrid基础学习:10jqGrid的多字段查询
    多字段查询就是高级查询,在jqGrid中,高级查询的麻烦在于同后台的交互。 [caption id="attachment_379" align="alignnone" width="718" caption="jqGrid多字段查询"][/caption] 启用多条件查询的方法,是加上.searchGrid({multipleSearch:true}); 即可。 ...
  • jqGrid基础学习:8jqGrid中在导航条使用按钮
    jqGrid中可以再导航条上设置按钮,其中jqGrid已经默认设置了一些按钮,此外,用户也可以自定义自己的按钮。 使用默认的方法 系统中默认的按钮主要是对数据进行CRUD的操作的按钮。方法如下 jQuery("#list").jqGrid('navGrid','#pager',{edit:true,add:true,del:true,view:true},{ //这里可以指定edi...

  1. 邹国生 说道:

    前辈,可以向您学习站内查询吗/

  2. 邹国生 说道:

    网上拜师不容易,您就呆呆我吧。我的邮箱是zhuroufanzi@163.com,QQ1330705003.

PO一下