在ump系统的那半个多月-jqGrid
2012.04统一监控平台项目打酱油的日子
系统介绍:
目标,致力于服务于公司内部的所有系统,对所有接入监控的系统进行监控,包括系统监控,URL存活监控,端口存活监控,方法监控等。
作为打酱油的我,没有接触到上面的编码,主要作为小组间的支持过去。项目中有一块系统管理类的东西,需要添加部门信息之类的,我就去做这个了。
了解需求之类的就不在多说了,也不是我要将的主题,主题是:jqGrid插件。
先来看一看运行的界面吧,还是有点爽的,不管是当时看着,还是现在看。
那接下来,我们来讲讲怎么做的。
要做出这么一个列表,我们需要知道他的数据格式是什么?以及需要哪些页面元素等。
详解一下:
<table class="" id="list2"></table>
<div id="noticepage"></div> </div>
需要这两个页面元素,jqgrid通过这两个标签的id来渲染页面,jqGrid定义的模板如下:
//初始化
var $thisGrid = jQuery("#list2");
$thisGrid.jqGrid({
url:umpsetting.funcrootpath +'/menu/queryMenu.action',
datatype: "json",
mtype:"POST",
colNames:['菜单编号','菜单名称','菜单父ID','操作人','操作时间','状态','URL','操作'],
colModel:[
{name:'id',index:'id',align:"center",sortable:false,hidden:true},
{name:'name',index:'name',align:"center",sortable:false},
{name:'pid',index:'pid',align:"center",sortable:false},
{name:'creator',index:'creator',align:"center",sortable:false},
{name:'createTime',index:'createTime',align:"center",sortable:false,formatter:function(cellval){if(cellval == null || cellval == "")return "";return cellval.replace("T"," ");}},
{name:'status',index:'status',align:"center",sortable:false,formatter:function(cellval){if(cellval=="1")return "有效";if(cellval=="0")return "无效";}},
{name:'url',index:'url',align:"center",sortable:false},
{name:'des',index:'id',align:"center",sortable:false,formatter:currencyFmatter}
],
width:800,
height:250,
rowNum:20,
rowList:[15,20,30],
pager: '#noticepage',
sortname: 'id',
rownumbers:true,
viewrecords: true,
rownumbers:true,
sortorder: "desc",
caption:"",
jsonReader:{
root: "rows",
page: "page",
total: "total",
records: "records",
repeatitems: false,
id: "0"
}
}).jqGrid('navGrid','#noticepage',{edit:false,add:false,del:false,search:false});
数据结构如下:
具体数据:
突然感觉这些都不是重点,重点是官方没有给出java版的demo,这里的重点的整合struts吧,大家觉得呢?
Js,html这些在官方demo中都有,那我们直接从Action的代码开始讲
public String queryMenu() throws Exception {
Map<String, Object> initMap = new HashMap<String, Object>();
result = menuService.queryByPage(page, rows, queryParam == null ? initMap : parseQueryParam(queryParam));
if (result.isSuccess()) {
jsonGrid = (SimplePage<Menu>) result.get("menuList");
}
return JSON_GRID;
}
InitMap就是组装查询参数而已,不需要重点了解。我们进一步来了解result里放了什么?从这一行代码里可以看出
jsonGrid = (SimplePage<Menu>) result.get("menuList");
SimplePage<Menu>
对象,那这个对象具体是怎样的呢?再往下看
public Result queryByPage(int page, int rows, Map<String, Object> map) {
Result result = new Result(false);
List<Menu> resultList = getMenus(page,rows);
SimplePage<Menu> sp = new SimplePage<Menu>(page, rows, menus.size(), resultList);
result.addDefaultModel("menuList", sp);
result.setSuccess(true);
return result;
}
可以看出,是通过这样一行代码创建了它
SimplePage<Menu> sp = newSimplePage<Menu>(page, rows, menus.size(), resultList);
那SimplePage内部的结构呢?用一张图来看吧
加个注解,可以格式化你想要的json里的key键
@JSON(name = "records")
public int getTotalCount() {
return totalCount;
}
那返回这个对象,struts在什么地方处理的呢?接下来,看一看struts里的配置情况:
<package name="json-protected-default" extends="ump-default">
<result-types>
<result-type name="json" class="org.apache.struts2.json.JSONResult" />
</result-types>
<interceptors>
<interceptor name="json"
class="org.apache.struts2.json.JSONInterceptor" />
</interceptors>
<global-results>
<result name="jsonObject" type="json">
<param name="root">jsonObject</param>
</result>
<result name="jsonGrid" type="json">
<param name="root">jsonGrid</param>
</result>
<result name="jsonMap" type="json">
<param name="root">jsonMap</param>
</result>
</global-results>
</package>
至于为什么要配置这个JSONResult有篇文章可以推荐给大家读读。
http://www.cnblogs.com/ini_always/archive/2011/10/15/2213404.html
我们这里返回的是jsonGrid,断点运行来看看结果吧
主要在这两段代码:
protected Object findRootObject(ActionInvocation invocation) {
Object rootObject;
if (this.root != null) {
ValueStack stack = invocation.getStack();
rootObject = stack.findValue(root);
} else {
rootObject = invocation.getStack().peek(); // model overrides action
}
return rootObject;
}
protected String createJSONString(HttpServletRequest request, Object rootObject) throws JSONException {
String json = JSONUtil.serialize(rootObject, excludeProperties, includeProperties, ignoreHierarchy, enumAsBean, excludeNullProperties);
json = addCallbackIfApplicable(request, json);
return json;
}
从值栈ValueStack里找到root=jsonGrid所对应的值,也就是我们放的SimplePage<Menu>对象。
最后createJSONString创建所要的值:
在页面中,jqgrid的配置ajax调用一下,就ok了,数据就展示出来了。
需要注意的是,正确的引入js,css等
把这两个用上
jquery-ui-redmond/jquery-ui-1.8.10.custom.min.js
jquery-ui-redmond/jquery-ui-1.8.10.custom.css
对那弹出框的处理
来看新增吧
function add() {
$("#name").val("");
$("#addOpt").dialog("open");
}
页面元素:
<div id="addOpt" class="modal">
<div class="moadalCon">
<table class="fakeGrid mt10">
<tr>
<td class="valignT w100 textR">
<label class="necessaryL">菜单名称:</label>
</td>
<td class="textL">
<input type="text" name="name" id="name" class="textField28"/>
<div class="errorItem"></div>
</td>
</tr>
<tr>
<td class="valignT w100 textR">
<label class="necessaryL">菜单父ID:</label>
</td>
<td class="textL">
<input type="text" name="pid" id="pid" class="textField28"/>
<div class="errorItem"></div>
</td>
</tr>
<tr>
<td class="valignT w100 textR">
<label class="necessaryL">菜单URL:</label>
</td>
<td class="textL">
<input type="text" name="url" id="url" class="textField28"/>
<div class="errorItem"></div>
</td>
</tr>
</table>
</div>
</div>
用dialog("open")方法,打开一个窗口,或者叫对话框。把这个div放到对话款里。那同学们一定很关心是怎么保存的吧,
看下面的代码:
//创建弹出页面
$("#addOpt").dialog({
title:"新增菜单信息",
autoOpen: false,
width: 500,
resizable:false,
height: 300,
modal: true,
buttons: {
"确定": function() {
jQuery.ajax({
type: "post",
cache: false,
url:umpsetting.funcrootpath + "/menu/addMenu.action",
data: {
"menu.name":encodeURIComponent($("#name").val()),
"menu.url":encodeURIComponent($("#url").val()),
"menu.pid":$("#pid").val()
},
dataType: "json",
success: function (data) {
if(data=="EXIST"){
alert("报警分类信息已经存在!");
}else{
if(data==true){
gridReload();
}else{
alert("新增报警分类信息出错!");
}
}
}
});
$(this).dialog("close");
},
'关闭': function() {
$(this).dialog("close");
}
},
close: function() {
}
});
可以看出,是通过ajax异步去保存的,成功之后还gridReload();重新加载grid。
方法如下:
/**reload grid*/
window.gridReload = function(){
var name = $('#queryName').val();
$thisGrid.setGridParam({
postData:{
/*此次写的默认查询参数*/
"queryParam.name":encodeURIComponent(name)
}
}).trigger("reloadGrid");
};
好了,所有的分享就到这里,有什么疑问,可以随时提哦。
在ump系统的那半个多月-jqGrid的更多相关文章
- Qt开源作品38-无边框窗体方案(无抖动,支持win、linux、mac等系统,侧边半屏顶部全屏)
一 前言 不知道各位程序员有没有遇到过这样一种困惑,好不容易在开源网站找到了类似的想要的项目代码,结果down下来一编译,我勒个去,几百个错误,根本没法用,熟悉的人还好可以直接阅读代码进行修改(有些只 ...
- UMP系统架构
- UMP系统架构 Controller服务器
- UMP系统架构 LVS
- UMP系统架构 Zookeeper
- UMP系统架构 RabbitMQ
- UMP系统架构 Mnesia
- 洛谷P1474 [USACO 2.3]货币系统 Money Systems [2017年4月计划 动态规划04]
P1474 货币系统 Money Systems 题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1 ...
- Linux系统时间与RTC时间【转】
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3637782 Linux的RTC驱动相对还是比较简单的,可以将它作为一个普通的字符 ...
随机推荐
- bzoj 3295 树套树
比较裸,可以有好多的优化,比如根本没有删除的点没有加在树套树中的必要,预处理 出来每个不会被删除的值可以减少不少时间,也可以写成树状数组套平衡树,都会快很多 /******************** ...
- hdu 3879 Base Station 最大权闭合图
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3879 A famous mobile communication company is plannin ...
- 2014ACM/ICPC亚洲区北京站 上交命题
A http://acm.hdu.edu.cn/showproblem.php?pid=5112 输入n个时刻和位置,问那两个时刻间速度最快. 解法:按照时间排序,然后依次求相邻两个之间的速度,速度= ...
- 关于High-Resolution Timer(了解)
如果一个系统包含高精度性能计数器(HRPC,high-resolution performance counter)则此系统提供高精度定时器.你可以使用API函数QueryPerformanceFre ...
- iOS开发之runtime的运用-获取当前网络状态
之前写过runtime的一些东西,这次通过runtime获取一些苹果官方不想让你拿到的东西,比如,状态栏内部的控件属性.本文将通过runtime带你一步步拿到状态栏中显示网络状态的控件,然后通过监测该 ...
- Keil中的code关键字
一般说来,我们在C语言中定义的每一个变量初始化后都会占用一定的内存(RAM)空间.但是在keil中提供了一个特殊的关键字“code”,这个关键字在标准C中是没有的.其语法举例如下: unsigned ...
- .NET设计模式(13):享元模式(Flyweight Pattern)(转)
摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价.那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面 ...
- iOS-CALayer实现简单进度条
/** * 用CALayer定制下载进度条控件 * 1.单独创建出CALayer * 2.直接修改CALayer的frame值,执行隐式动画,实现进度条效果 * 3.用定时器(NSTimer) ...
- iOS16进制设置颜色
UIColor+Hex.h // // UIColor+Hex.h // 16进制颜色类别 // // Created by apple on 15-4-3. // Copyright (c) 201 ...
- Ehcache使用
http://www.360doc.com/content/14/0423/17/16946725_371472946.shtml http://www.myexception.cn/web-appl ...