jqGrid是蛮强大的表格控件,例子也很多。这里,记录一下自己使用jqGrid4.1.1版本的实作实例。实作效果图:
选中其中一个条目,点击表格左下脚的铅笔图标,可以编辑此条目:
因为jqGrid升级很快,编码上是否会有所改变,是否还能适应新版本没有去考究。以下实作代码,仅供朋友们参考。
放置表格的html元素:
- <div>
- <table id="jqgajax"></table>
- </div>
- <div id="pjqgajax2"></div>
引入jqGrid的js文件,以及相关依赖的js文件。然后用js脚本构建表格:
- <script type="text/javascript">
- jQuery.jgrid.no_legacy_api = true;
- jQuery.jgrid.useJSON = true;
- </script>
- <script src="<%=rootPath%>/common/jqGrid/js/jquery.jqGrid.min.js" type="text/javascript"></script>
- <script src="<%=rootPath%>/common/jqGrid/js/jquery-ui-1.8.2.custom.min.js" type="text/javascript"></script>
- <script src="<%=rootPath%>/common/jquery.jec/jquery.jec.js" type="text/javascript"></script>
- <script type="text/javascript">
- jQuery(document).ready(function(){
- jQuery("#jqgajax").jqGrid({
- ajaxGridOptions : {type:"POST"},
- serializeGridData : function(postdata) {
- return postdata;
- },
- url:'getFaultInjectConfigJson.action?fiBean.appProfile.id=${fiBean.appProfile.id}',
- datatype: "json",
- colNames:['ID','包名', '递归子包', '类名','方法名','方法描述','方法中调用的方法',
- '故障类型', '异常类型', '延迟时间','千条指令注入故障数'],
- colModel:[
- {name:'fiBean.fic.id',
- index:'id',
- width:30,
- editable:false,
- editoptions:{readonly:true,size:10}},
- {name:'fiBean.fic.packageName',
- index:'packageName',
- width:300,
- editable:true,
- edittype:'text',
- editoptions:{size:60,maxlength:100},
- editrules:{required:true},
- formoptions:{elmprefix:'(*)'}},
- {name:'fiBean.fic.vPackageRecursive',
- index:'packageRecursive',
- width:80,
- editable:true,
- edittype:'select',
- editoptions:{value: "Y:Yes;N:No"}}, // 注意,这里不可以写成:editoptions:{value: "Y:Yes; N:No;"}},
- {name:'fiBean.fic.className',index:'className', width:120, align:"left",
- editable:true,
- edittype:'text',
- editoptions:{size:60,maxlength:100},
- editrules:{required:true},
- formoptions:{elmprefix:'(*)'}},
- {name:'fiBean.fic.methodName',index:'methodName', width:200, align:"left",
- editable:true,
- edittype:'text',
- editoptions:{size:60,maxlength:100},
- editrules:{required:true},
- formoptions:{elmprefix:'(*)'}},
- {name:'fiBean.fic.methodDesc',index:'methodDesc', width:80,
- editable:true,
- edittype:'text',
- editoptions:{size:60,maxlength:100}},
- {name:'fiBean.fic.calledMethod',index:'calledMethod', width:80,
- editable:true,
- edittype:'text',
- editoptions:{size:60,maxlength:100}},
- {name:'fiBean.fic.type',index:'type', width:160,
- editable:true,
- edittype:'select',
- // value部分不要有空格哦,否则,会让你很惊诧的哦!
- editoptions:{value: "组件失效:组件失效;让死锁和线程安全易现:让死锁和线程安全易现;组件拖慢:组件拖慢"}},
- {name:'fiBean.fic.exceptType',index:'exceptType', width:180,
- editable:true,
- edittype:'select',
- // value部分不要有空格哦,否则,会让你很惊诧的哦!
- editoptions:{value: "java.lang.RuntimeException:java.lang.RuntimeException;" +
- "java.lang.NullPointerException:java.lang.NullPointerException;" +
- "java.lang.reflect.InvocationTargetException;" +
- "java.lang.reflect.UndeclaredThrowableException;" +
- "java.lang.ArithmeticException:java.lang.ArithmeticException;" +
- "java.sql.SQLException:java.sql.SQLException;" +
- "java.lang.NumberFormatException:java.lang.NumberFormatException;" +
- "java.lang.StringIndexOutOfBoundsException:java.lang.StringIndexOutOfBoundsException;" +
- "java.io.IOException:java.io.IOException;" +
- "java.io.EOFException:java.io.EOFException;" +
- "java.io.FileNotFoundException:java.io.FileNotFoundException;" +
- "java.lang.IllegalStateException:java.lang.IllegalStateException;" +
- "java.lang.ClassCastException:java.lang.ClassCastException;" +
- "java.lang.SecurityException:java.lang.SecurityException;"}},
- {name:'fiBean.fic.delayTime',index:'delayTime', width:80,
- editable:true,
- edittype:'text',
- editoptions:{size:60,maxlength:100}},
- {name:'fiBean.fic.density',index:'density', width:180,
- editable:true,
- edittype:'text',
- editoptions:{size:60,maxlength:100}}
- ],
- rowNum:10,
- width:1400,
- height:230,
- rowList:[10,20,30],
- pager: '#pjqgajax2',
- sortname: 'name',
- viewrecords: true,
- sortorder: "desc",
- caption:"故障条目",
- editurl: "editFaultInjectConfig.action"
- });
- jQuery("#jqgajax").jqGrid('navGrid','#pjqgajax2',{edit:true,add:false,del:true,search:false},{width:500, top: 300, left: 300,
- "editCaption":"修改故障配置","bSubmit":"提交","bCancel":"取消", "viewPagerButtons":false, "closeAfterEdit":true, "closeOnEscape":true,
- "beforeShowForm":function(formid)
- {
- // get fault inject type value
- var typeval = jQuery("#fiBean\\.fic\\.type",formid).val();
- setControlStateByType(typeval);
- },
- "onInitializeForm":function(formid)
- {
- jQuery("#fiBean\\.fic\\.type",formid).change(function(e) {
- var typeval = jQuery(this).val();
- setControlStateByType(typeval);
- });
- },
- "beforeSubmit" : function (postdata, formid) {
- var typeval = jQuery("#fiBean\\.fic\\.type", formid).val();
- // 提交时进行有效性检查
- if (typeval == '组件失效')
- {
- var exceptType = jQuery("#fiBean\\.fic\\.exceptType").val();
- if (exceptType == '')
- {
- return [false, "必须选择异常类型!", ""];
- }
- }
- else
- {
- var delayTime = jQuery("#fiBean\\.fic\\.delayTime", formid).val();
- if((delayTime == '')||(delayTime.trim() == ''))
- {
- return [false, "必须填写延迟时间!", ""]
- }
- }
- return [true, "", ""];
- }
- },
- {
- top: 0, left: 0
- },
- {
- top: 400, left: 500
- });
- });
- // 对特殊字符'.',需要转义一下
- // 注意:根据W3C规定,HTML文档中属性的值是不能包含有这些个特殊字符(“#”和“.”)的
- // 设置控件的使能
- function setControlStateByType(typeval)
- {
- if (typeval == '组件失效')
- {
- jQuery("#fiBean\\.fic\\.exceptType").attr("disabled",false);
- jQuery("#fiBean\\.fic\\.delayTime").attr("disabled",true);
- }
- else if(typeval == '组件拖慢')
- {
- jQuery("#fiBean\\.fic\\.exceptType").attr("disabled",true);
- jQuery("#fiBean\\.fic\\.delayTime").attr("disabled",false);
- }
- else if(typeval == '让死锁和线程安全易现')
- {
- jQuery("#fiBean\\.fic\\.exceptType").attr("disabled",true);
- jQuery("#fiBean\\.fic\\.delayTime").attr("disabled",false);
- }
- if (typeval == '组件拖慢')
- {
- jQuery("#fiBean\\.fic\\.density").attr("disabled", false);
- }
- else
- {
- jQuery("#fiBean\\.fic\\.density").attr("disabled", true);
- }
- }
- </script>
如果还有一个提交(新增)条目的form,id是saveFiConfigs,那么,新增一条条目后,想要重新载入表格(刷新表格),只要对提交form的行为进行接管,在提交完成后,触发reloadGrid事件即可:
- <script type="text/javascript" class="source below">
- jQuery(document).ready(function(){
- jQuery('#saveFiConfigs').submit(function() {
- // 提交此表单
- jQuery(this).ajaxSubmit(function(message) {
- // 对于表单提交成功后处理,message为提交页面的返回内容
- jQuery("#jqgajax").trigger("reloadGrid");
- });
- // 返回false防止页面跳转
- return false;
- });
- });
- </script>
jqGrid查询时应当返回符合jqGrid要求的json格式的字符串(可以通过浏览器Chrome浏览器或者火狐,按F12获取到demo的请求和应答数据):
- /*
- * 数据格式示例:
- String result = "{\"page\":\"1\",\"total\":2,\"records\":\"13\"," +
- "\"rows\":[{\"id\":\"12\",\"cell\":[\"12\",\"2007-10-06\",\"Client 2\",\"700.00\",\"140.00\",\"840.00\",null]}," +
- "{\"id\":\"10\",\"cell\":[\"10\",\"2007-10-06\",\"Client 2\",\"100.00\",\"20.00\",\"120.00\",null]}," +
- "{\"id\":\"11\",\"cell\":[\"11\",\"2007-10-06\",\"Client 1\",\"600.00\",\"120.00\",\"720.00\",null]}," +
- "{\"id\":\"9\",\"cell\":[\"9\",\"2007-10-06\",\"Client 1\",\"200.00\",\"40.00\",\"240.00\",null]}," +
- "{\"id\":\"13\",\"cell\":[\"13\",\"2007-10-06\",\"Client 3\",\"1000.00\",\"0.00\",\"1000.00\",null]}," +
- "{\"id\":\"8\",\"cell\":[\"8\",\"2007-10-06\",\"Client 3\",\"200.00\",\"0.00\",\"200.00\",null]}," +
- "{\"id\":\"7\",\"cell\":[\"7\",\"2007-10-05\",\"Client 2\",\"120.00\",\"12.00\",\"134.00\",null]}," +
- "{\"id\":\"6\",\"cell\":[\"6\",\"2007-10-05\",\"Client 1\",\"50.00\",\"10.00\",\"60.00\",\"\"]}," +
- "{\"id\":\"5\",\"cell\":[\"5\",\"2007-10-05\",\"Client 3\",\"100.00\",\"0.00\",\"100.00\",\"no tax at all\"]}," +
- "{\"id\":\"4\",\"cell\":[\"4\",\"2007-10-04\",\"Client 3\",\"150.00\",\"0.00\",\"150.00\",\"no tax\"]}]," +
- "\"userdata\":{\"amount\":3220,\"tax\":342,\"total\":3564,\"name\":\"Totals:\"}}";
- */
- public String noTranGetFiConfigDataJson(int appProfileId, int page, int rows) {
- // 查询故障注入配置信息
- String hql = "from FaultInjectConfig where parent_id = ?";
- List<FaultInjectConfig> faultInjectConfigs = faultInjectDAO.findByHql(hql, Arrays.asList(appProfileId));
- int records = faultInjectConfigs.size();
- int total = records/rows + 1;
- StringBuilder sb = new StringBuilder();
- sb.append("{\"page\":").append("\"").append(page).append("\",")
- .append("\"total\":").append("\"").append(total).append("\",")
- .append("\"records\":").append("\"").append(records).append("\",")
- .append("\"rows\":[");
- for(int i=(page-1)*rows; (i<records)&&(i<page*rows); i++) {
- FaultInjectConfig fiConfig = faultInjectConfigs.get(i);
- sb.append(fiConfig.toJson());
- int j = i + 1;
- if ((j<records)&&(j<page*rows)) {
- sb.append(",");
- }
- }
- sb.append("]}");
- return sb.toString();
- }
Action只要写回构造好的json串,jqGrid就会将数据填塞进表格,上面代码的服务端代码展示:
- public String getFaultInjectConfigJson() {
- int appProfileId = fiBean.getAppProfile().getId();
- String result = faultInjectService.noTranGetFiConfigDataJson(appProfileId,
- page, rows);
- writeToClient(result);
- return null;
- }
这里顺带讲一下,jqGrid在请求时,会根据请求不同,携带不同的请求参数。譬如:
- // 这两个参数是jqGrid执行删除操作时需要的参数
- private int id;
- private String oper;
- // 这些是jqGrid执行查询操作时需要的参数
- // 显示第几页
- private int page;
- // 每页显示几条记录
- private int rows;
- // 这些参数暂时没有用到
- //private boolean _search; //为true时,表明此次的动作是搜索行为
- //private String nd;
- // 排序字段
- //private String sidx;
- // 排序方式(asc/desc)
- //private String sord;
- //private String searchField; //for example: packageName
- //private String searchOper; //for example: cn
- //private String searchString; //for example: hi1
上面注释掉的代码,是jqGrid提供高级功能时需要使用到的参数(譬如,搜索、排序等)。
提交编辑时,oper的值是:"edit",删除时,oper的值是:"del",看edit功能的后台代码(可见,修改和删除,在jqGrid的眼里都是edit):
- public String editFaultInjectConfig() {
- // 编辑
- if ("edit".equals(oper)) {
- System.out.println("heeh");
- // 由于jqGrid在传递id时,不会采用id所设定的名字(也许是我们没有深入钻研jqGrid),所以,需要我们将id手动的传递到对象
- fiBean.getFic().setId(id);
- // 将外部表示转换为内部表示
- fiBean.getFic().changeDescToInnerValue();
- // save可能会报这个异常:Caused by: org.hibernate.NonUniqueObjectException
- faultInjectService.mergeFaultInjectConfig(fiBean.getFic());
- } else if ("del".equals(oper)) { // 删除
- System.out.println("enter delFaultInjectConfig(): id: " + id);
- faultInjectService.deleteFaultInjectConfig(id);
- }
- return null;
- }
以上实例是基于jqGrid4.1.1结合Struts2的使用。好了,到这里,实例讲解结束。
转载于:https://blog.51cto.com/memory/1029483