• 在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}
    			],
    		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,
    	 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");
    };
    

    好了,所有的分享就到这里,有什么疑问,可以随时提哦。


  • 相关阅读:
    [译]MongoDB 3.0发布说明
    [译]MongoDb生产环境注意事项
    关于MongoDb Replica Set的故障转移集群——实战篇
    关于MongoDb Replica Set的故障转移集群——理论篇
    MongoDb 2.4 beta新特性——全文索引
    MongoDb Replica Set中使用的地址
    Eval is Devil-MongoDB master/slave上运行Eval遇到的问题
    ss
    SEO
    GruntJs
  • 原文地址:https://www.cnblogs.com/james1207/p/3262701.html
Copyright © 2020-2023  润新知