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> getRules() {
		return rules;
	}
	public void setRules(List<SearchRule> rules) {
		this.rules = rules;
	}
 
}

查询的工具类

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> rules = new ArrayList<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;
		}
 
	}
}

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

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


3 Responses to “jqGrid基础学习:11jqGrid的查询时和后台的交互”

  1. jsonUtil.java的问题 说:

    谢谢华水给的例子,不过有点小问题,如下
    jsonUtil.java 的函数我这里运行不起,
    后改为以下代码,就可以了,麻烦确定下原来的代码是没有问题的么.

    public static FilterSearch getDTOList(String jsonString, Class clazz, Map map) {

    setDataFormat2JAVA();
    JSONObject jsOBJ = JSONObject.fromObject(jsonString);
    FilterSearch bean = (FilterSearch)JSONObject.toBean( jsOBJ, clazz, map );

    return bean;
    }

  2. yuk 说:

    通用的过滤方法只能过滤字符串类型,如果过滤含有日期,浮点数什么的该如何编写通用程序?

  3. fly 说:

    你好 能否把你这个jqGrid基础学习的例子发一下参考啊 xianaofei123@126.com 谢谢

Post a Comment