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字符串。
因此,取得这个数据需要进行对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工具类进行。



前辈,可以向您学习站内查询吗/
网上拜师不容易,您就呆呆我吧。我的邮箱是zhuroufanzi@163.com,QQ1330705003.