jqGrid与Struts2的结合应用(三) —— 使用自定义表单对话框编辑Grid数据

jqGrid dialog例子 运用了jqGrid实现数据的展示,分页,运用dialog弹出层进行增删改,弹出层代码分页写,用了ajax传值,同时也是MVC的运用。调用数据库则用的是linq 立即下载

原文地址:http://blog.youkuaiyun.com/gengv/article/details/5719053

如不能转载,请联系博主,我马上删除。

上一篇中的最后一点提到了,如果在服务器端出现异常,没能完成预期的操作,那么客户端(浏览器)中的jqGrid还继续更新数据吗?

这一篇就来说说服务器端的操作。

首先看一下服务器端的代码,我将查看行数据和操作行数据放在了两个Action类里面:ViewContactAction和ContactConsoleAction。

package cn.gengv.struts2ex.jqGrid;  
import java.util.List;  
import com.byzl.hare.model.Contact;  
import com.byzl.hare.model.PatentCase;  
import com.byzl.hare.service.ContactService;  
import com.opensymphony.xwork2.ActionSupport;  
@SuppressWarnings("serial")  
public class ViewContactAction extends ActionSupport {  
    private Contact contact;      
    private List<PatentCase> patentCases;  
      
    private ContactService contactService;  
      
    private String ajaxResult;  
      
    public String viewContact() {  
          
        int id = contact.getId();  
          
        contact = contactService.queryById(contact.getId());  
          
        if (contact == null) {  
            ajaxResult = "未能找到ID为 " + id + " 的联系人";  
            return ERROR;  
        }  
          
        ajaxResult = SUCCESS;  
        return SUCCESS;  
    }  
      
    public Contact getContact() {  
        return contact;  
    }  
    public void setContact(Contact contact) {  
        this.contact = contact;  
    }  
    public String getAjaxResult() {  
        return ajaxResult;  
    }  
    public void setAjaxResult(String ajaxResult) {  
        this.ajaxResult = ajaxResult;  
    }  
    public void setContactService(ContactService contactService) {  
        this.contactService = contactService;  
    }  
    public List<PatentCase> getPatentCases() {  
        return patentCases;  
    }  
    public void setPatentCases(List<PatentCase> patentCases) {  
        this.patentCases = patentCases;  
    }  
}  

package cn.gengv.struts2ex.jqGrid;  
import com.byzl.hare.model.Contact;  
import com.byzl.hare.service.ContactService;  
import com.opensymphony.xwork2.ActionSupport;  
@SuppressWarnings("serial")  
public class ContactConsoleAction extends ActionSupport {  
    private ContactService contactService;  
    private Contact contact;  
      
    private String ajaxResult;  
      
    // 创建新的Contact   
    public String createContact() {  
        try {  
            contact.setId(this.contactService.addNew(contact));  
              
            ajaxResult = SUCCESS;  
            return SUCCESS;  
        } catch (Exception e) {  
            e.printStackTrace();  
            this.addActionError(e.getMessage());  
            ajaxResult = "创建新联系人失败!" + e.getMessage();  
            return ERROR;  
        }  
          
    }  
      
    // 更新Contact信息   
    public String updateContact() {  
        try {  
            this.contactService.update(contact);  
        } catch (Exception e) {  
            e.printStackTrace();  
            this.addActionError(e.getMessage());  
            ajaxResult = "更新联系人信息失败!" + e.getMessage();  
            return ERROR;  
        }  
        ajaxResult = SUCCESS;  
        return SUCCESS;  
    }  
    // 删除Contact   
    public String deleteContact() {  
        try {  
            this.contactService.delete(contact);  
        } catch (Exception e) {  
            e.printStackTrace();  
            this.addActionError(e.getMessage());  
            ajaxResult = "删除联系人失败!" + e.getMessage();  
            return ERROR;  
        }  
        ajaxResult = SUCCESS;  
        return SUCCESS;  
    }  
    public Contact getContact() {  
        return contact;  
    }  
    public void setContact(Contact contact) {  
        this.contact = contact;  
    }  
    public String getAjaxResult() {  
        return ajaxResult;  
    }  
    public void setAjaxResult(String ajaxResult) {  
        this.ajaxResult = ajaxResult;  
    }  
    public void setContactService(ContactService contactService) {  
        this.contactService = contactService;  
    }  
}  


说明:

  • 因为客户端会和Server进行ajax交互,所以我在类里面加入了一个成员变量ajaxResult,用来保存操作实际的结果。当action产生json类型的result时,这个成员变量也会被串行化进json结果中,发送到客户端。客户端的javascript代码会解析这个值,以执行相应操作。
  • 这两个类都是用了Object-backed Action的方式来传递数据(关于Object-backed Action可以参考《Struts2 in Action》一书的3.4节)。

 

在配置文件中,按如下配置Action:

<action name="viewContact"  
    class="cn.gengv.struts2ex.jqGrid.ViewContactAction" method="viewContact">  
    <result name="success" type="json">  
        <param name="includeProperties">  
            contact.*, ajaxResult  
            </param>  
        <param name="noCache">true</param>  
        <param name="ignoreHierarchy">false</param>  
        <param name="excludeNullProperties">true</param>  
    </result>  
</action>  
      
<action name="createContact"  
    class="cn.gengv.struts2ex.jqGrid.ContactConsoleAction" method="createContact">  
    <result name="success" type="json">  
        <param name="includeProperties">  
            contact/.id, ajaxResult  
            </param>  
        <param name="noCache">true</param>  
        <param name="ignoreHierarchy">false</param>  
    </result>  
</action>  
      
<action name="updateContact"  
    class="cn.gengv.struts2ex.jqGrid.ContactConsoleAction" method="updateContact">  
    <result name="success" type="json">  
        <param name="includeProperties">  
            contact/.id, ajaxResult  
            </param>  
        <param name="noCache">true</param>  
        <param name="ignoreHierarchy">false</param>  
    </result>  
</action>  
      
<action name="deleteContact"  
    class="cn.gengv.struts2ex.jqGrid.ContactConsoleAction" method="deleteContact">  
    <result name="success" type="json">  
        <param name="includeProperties">  
            contact/.id, ajaxResult  
            </param>  
        <param name="noCache">true</param>  
        <param name="ignoreHierarchy">false</param>  
    </result>  
</action>  


说明:

  • 请注意result的类型为json,而且includeProperties属性中包括ajaxResult这个成员变量名;
  • 由于添加contact时,id属性值是由后台自动生成的,因此需要将这个值传回客户端作为Grid的行id值。

服务器端的代码似乎没有什么更多需要说明的地方了,应该一目了然。

 

 

 

 

下面看看客户端部分,这里面似乎有不少值得说明一下的部分。

首先看一下html的完整代码:

<!DOCTYPE html  
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" lang="zh-CN">  
    <head>  
        <title>jqGrid03</title>  
        <link rel="stylesheet" type="text/css" media="screen" href="../css/themes/aero/jquery-ui-1.8.1.custom.css" mce_href="css/themes/aero/jquery-ui-1.8.1.custom.css" />  
        <link rel="stylesheet" type="text/css" media="screen" href="../css/themes/aero/ui.jqgrid.custom.css" mce_href="css/themes/aero/ui.jqgrid.custom.css" />  
        <link href="../css/genericFormTable.css" mce_href="css/genericFormTable.css" rel="stylesheet" type="text/css" />  
          
        <mce:script type="text/javascript" src="../js/jquery-1.4.2.min.js" mce_src="js/jquery-1.4.2.min.js"></mce:script>  
        <mce:script src="../js/jquery-ui-1.8.1.custom.min.js" mce_src="js/jquery-ui-1.8.1.custom.min.js" type="text/javascript"></mce:script>  
        <mce:script src="../js/i18n/grid.locale-zh-CN.js" mce_src="js/i18n/grid.locale-zh-CN.js" type="text/javascript"></mce:script>  
        <mce:script src="../js/jquery.jqGrid.min.js" mce_src="js/jquery.jqGrid.min.js" type="text/javascript"></mce:script>  
          
        <mce:script src="js/jqGrid03.js" mce_src="js/jqGrid03.js" type="text/javascript"></mce:script>    
    </head>  
    <body>  
        <h3>  
            jqGrid测试 03  
        </h3>  
        <div>  
            <table id="gridTable"></table>  
            <div id="gridPager"></div>  
        </div>  
          
        <br />  
          
        <div>  
            <button onclick="openDialog4Adding()">添加联系人</button>  
            <button onclick="openDialog4Updating()">修改联系人</button>  
            <button onclick="openDialog4Deleting()">删除联系人</button>  
        </div>  
          
        <div id="consoleDlg">  
            <div id="formContainer">  
                <form id="consoleForm">  
                    <input type="hidden" id="selectId"/>  
                    <table class="formTable">  
                        <tr>  
                            <th>姓:</th>  
                            <td>  
                                <input type="text" class="textField" id="lastName" name="lastName" />  
                            </td>  
                        </tr>  
                        <tr>  
                            <th>名:</th>  
                            <td>  
                                <input type="text" class="textField" id="firstName" name="firstName" />  
                            </td>  
                        </tr>  
                        <tr>  
                            <th>国籍:</th>  
                            <td>  
                                <input type="text" class="textField" id="nationality" name="nationality" />  
                            </td>  
                        </tr>  
                        <tr>  
                            <th>身份证号:</th>  
                            <td>  
                                <input type="text" class="textField" id="idCardNo" name="idCardNo" />  
                            </td>  
                        </tr>  
                        <tr>  
                            <th>电子邮箱:</th>  
                            <td>  
                                <input type="text" class="textField" id="email" name="email" />  
                            </td>  
                        </tr>  
                        <tr>  
                            <th>电话:</th>  
                            <td>  
                                <input type="text" class="textField" id="telNo" name="telNo" />  
                            </td>  
                        </tr>  
                        <tr>  
                            <th>地址:</th>  
                            <td>  
                                <input type="text" class="textField" id="address" name="address" />  
                            </td>  
                        </tr>                       
                    </table>  
                </form>  
            </div>  
        </div>  
    </body>  
</html>  


相比较之前的例子,这个例子最重要的变化是添加了一个id为consoleDlg的<div>块。在javascript的页面初始化部分我将使用jQuery UI的API将这个div生成为一个模态对话框,用作编辑数据的界面。

 

虽然jqGrid也提供了表单格式的编辑数据的界面,但是我个人感觉那个界面太基础,适用于简单的数据编辑情况,对于复杂的情况,可能还是自己写点代码更加灵活。

 

另一个项目中,我自己实现的相对复杂的表单界面:


 

 

 

回到本例中,上面的“对话框”div中,有一个form,其中有一个<input type="hidden" id="selectId"/>(当准备修改或者删除一行记录的时候,这行的id将被保存在这里,以备后用),以及若干个<input type="text">。

 

 

再来看看javascript部分,javascript部分主要功能分成几块:

  • 初始化表格;
  • 初始化对话框;
  • 添加记录时打开对话框;
  • 执行添加操作;
  • 载入行数据到对话框;
  • 修改记录时打开对话框;
  • 执行修改操作;
  • 删除记录时打开对话框;
  • 执行删除操作。

先看一下完整代码,然后逐块分析:

1. 初始化Grid表格:

这一部分的代码,和上一篇中的例子完全相同,不再赘述。

$(function(){  
    // 配置jqGrid组件   
    $("#gridTable").jqGrid({  
        url: "jqGrid03.action",  
        datatype: "json",  
        mtype: "GET",  
        height: 350,  
        width: 600,  
        colModel: [  
              {name:"id",index:"id",label:"编码",width:40},    
              {name:"lastName",index:"lastName",label:"姓",width:80,sortable:false},  
              {name:"firstName",index:"firstName",label:"名",width:80,sortable:false},  
              {name:"email",index:"email",label:"电子邮箱",width:160,sortable:false},  
              {name:"telNo",index:"telNo",label:"电话",width:120,sortable:false}  
        ],  
        viewrecords: true,  
        rowNum: 15,  
        rowList: [15,50,100],  
        prmNames: {search: "search"},  
        jsonReader: {  
            root:"gridModel",  
            records: "record",  
            repeatitems : false  
        },  
        pager: "#gridPager",  
        caption: "联系人列表",  
        hidegrid: false,  
        shrikToFit: true  
    });  
      
    // 配置对话框   
    $("#consoleDlg").dialog({  
        autoOpen: false,      
        modal: true,    // 设置对话框为模态(modal)对话框  
        resizable: true,      
        width: 480,  
        buttons: {  // 为对话框添加按钮   
            "取消": function() {$("#consoleDlg").dialog("close")},  
            "创建": addContact,  
            "保存": updateContact,  
            "删除": deleteContact  
        }  
    });  
});  
var openDialog4Adding = function() {  
    var consoleDlg = $("#consoleDlg");  
    var dialogButtonPanel = consoleDlg.siblings(".ui-dialog-buttonpane");  
    consoleDlg.find("input").removeAttr("disabled").val("");  
    dialogButtonPanel.find("button:not(:contains('取消'))").hide();  
    dialogButtonPanel.find("button:contains('创建')").show();  
    consoleDlg.dialog("option", "title", "创建新联系人").dialog("open");  
};  
var openDialog4Updating = function() {  
    var consoleDlg = $("#consoleDlg");  
    var dialogButtonPanel = consoleDlg.siblings(".ui-dialog-buttonpane");  
      
    consoleDlg.find("input").removeAttr("disabled");  
    dialogButtonPanel.find("button:not(:contains('取消'))").hide();  
    dialogButtonPanel.find("button:contains('保存')").show();  
    consoleDlg.dialog("option", "title", "修改联系人信息");  
      
    loadSelectedRowData();  
}  
var openDialog4Deleting = function() {  
    var consoleDlg = $("#consoleDlg");  
    var dialogButtonPanel = consoleDlg.siblings(".ui-dialog-buttonpane");  
      
    consoleDlg.find("input").attr("disabled", true);  
    dialogButtonPanel.find("button:not(:contains('取消'))").hide();  
    dialogButtonPanel.find("button:contains('删除')").show();  
    consoleDlg.dialog("option", "title", "删除联系人");  
      
    loadSelectedRowData();  
}  
var loadSelectedRowData = function() {    
    var selectedRowId = $("#gridTable").jqGrid("getGridParam", "selrow");  
    if (!selectedRowId) {  
        alert("请先选择需要编辑的行!");  
        return false;  
    } else {  
        var params = {  
            "contact.id" : selectedRowId  
        };  
        var actionUrl = "viewContact.action";  
        // 从Server读取对应ID的JSON数据   
        $.ajax( {  
            url : actionUrl,  
            data : params,  
            dataType : "json",  
            cache : false,  
            error : function(textStatus, errorThrown) {  
                alert("系统ajax交互错误: " + textStatus);  
            },  
            success : function(data, textStatus) {  
                // 如果读取结果成功,则将信息载入到对话框中                   
                var rowData = data.contact;  
                var consoleDlg = $("#consoleDlg");  
                consoleDlg.find("#selectId").val(rowData.id);  
                consoleDlg.find("#lastName").val(rowData.lastName);  
                consoleDlg.find("#firstName").val(rowData.firstName);  
                consoleDlg.find("#certificateNo").val(rowData.certificateNo);  
                consoleDlg.find("#email").val(rowData.email);  
                consoleDlg.find("#telNo").val(rowData.telNo);  
                consoleDlg.find("#address").val(rowData.address);  
                consoleDlg.find("#idCardNo").val(rowData.idCardNo);  
                consoleDlg.find("#nationality").val(rowData.nationality);  
                  
                // 根据新载入的数据将表格中的对应数据行一并更新一下   
                var dataRow = {  
                        id : rowData.id,  
                        lastName : rowData.lastName,  
                        firstName : rowData.firstName,  
                        email : rowData.email,  
                        telNo : rowData.telNo  
                    };  
                  
                $("#gridTable").jqGrid("setRowData", data.contact.id, dataRow);  
                      
                // 打开对话框   
                consoleDlg.dialog("open");  
            }  
        });  
          
    }  
};  
var addContact = function() {  
    var consoleDlg = $("#consoleDlg");  
          
    var pLastName = $.trim(consoleDlg.find("#lastName").val());  
    var pFirstName = $.trim(consoleDlg.find("#firstName").val());  
    var pEmail = $.trim(consoleDlg.find("#email").val());  
    var pTelNo = $.trim(consoleDlg.find("#telNo").val());  
    var pAddress = $.trim(consoleDlg.find("#address").val());  
    var pIdCardNo = $.trim(consoleDlg.find("#idCardNo").val());  
    var pNationality = $.trim(consoleDlg.find("#nationality").val());  
      
    var params = {  
        "contact.lastName" : pLastName,  
        "contact.firstName" : pFirstName,  
        "contact.email" : pEmail,  
        "contact.telNo" : pTelNo,  
        "contact.address" : pAddress,  
        "contact.idCardNo" : pIdCardNo,  
        "contact.nationality" : pNationality  
    };  
      
    var actionUrl = "createContact.action"  
      
    $.ajax( {  
        url : actionUrl,  
        data : params,  
        dataType : "json",  
        cache : false,  
        error : function(textStatus, errorThrown) {  
            alert("系统ajax交互错误: " + textStatus);  
        },  
        success : function(data, textStatus) {  
            if(data.ajaxResult == "success") {  
                var dataRow = {  
                    id : data.contact.id,   // 从Server端得到系统分配的id  
                    lastName : pLastName,  
                    firstName : pFirstName,  
                    email : pEmail,  
                    telNo : pTelNo  
                };  
                  
                var srcrowid = $("#gridTable").jqGrid("getGridParam", "selrow");  
                  
                if(srcrowid) {  
                    $("#gridTable").jqGrid("addRowData", data.contact.id, dataRow, "before", srcrowid);  
                } else {  
                    $("#gridTable").jqGrid("addRowData", data.contact.id, dataRow, "first");  
                }  
                consoleDlg.dialog("close");  
                  
                alert("联系人添加操作成功!");  
                  
            } else {  
                alert("添加操作失败!");  
            }  
        }  
    });  
};  
var updateContact = function() {  
    var consoleDlg = $("#consoleDlg");  
      
    var pId = $.trim(consoleDlg.find("#selectId").val());  
    var pLastName = $.trim(consoleDlg.find("#lastName").val());  
    var pFirstName = $.trim(consoleDlg.find("#firstName").val());  
    var pEmail = $.trim(consoleDlg.find("#email").val());  
    var pTelNo = $.trim(consoleDlg.find("#telNo").val());  
    var pAddress = $.trim(consoleDlg.find("#address").val());  
    var pIdCardNo = $.trim(consoleDlg.find("#idCardNo").val());  
    var pNationality = $.trim(consoleDlg.find("#nationality").val());  
    var params = {  
        "contact.id" : pId,  
        "contact.lastName" : pLastName,  
        "contact.firstName" : pFirstName,  
        "contact.email" : pEmail,  
        "contact.telNo" : pTelNo,  
        "contact.address" : pAddress,  
        "contact.idCardNo" : pIdCardNo,  
        "contact.nationality" : pNationality  
    };  
    var actionUrl = "updateContact.action";  
    $.ajax( {  
        url : actionUrl,  
        data : params,  
        dataType : "json",  
        cache : false,  
        error : function(textStatus, errorThrown) {  
            alert("系统ajax交互错误: " + textStatus);  
        },  
        success : function(data, textStatus) {  
            if (data.ajaxResult == "success") {  
                var dataRow = {  
                    id : data.contact.id,  
                    lastName : pLastName,  
                    firstName : pFirstName,  
                    email : pEmail,  
                    telNo : pTelNo  
                };  
                $("#gridTable").jqGrid("setRowData", data.contact.id, dataRow, {color:"#FF0000"});  
                  
                alert("联系人信息更新成功!");  
                  
                consoleDlg.dialog("close");  
                  
            } else {  
                alert("修改操作失败!");  
            }  
        }  
    });  
};  
var deleteContact = function() {  
    var consoleDlg = $("#consoleDlg");  
      
    var pId = $.trim(consoleDlg.find("#selectId").val());  
    var params = {  
        "contact.id" : pId  
    };  
    var actionUrl = "deleteContact.action";  
    $.ajax({  
        url : actionUrl,  
        data : params,  
        dataType : "json",  
        cache : false,  
        error : function(textStatus, errorThrown) {  
            alert("系统ajax交互错误: " + textStatus);  
        },  
        success : function(data, textStatus) {  
            if (data.ajaxResult == "success") {  
                $("#gridTable").jqGrid("delRowData", pId);  
                  
                consoleDlg.dialog("close");  
                alert("联系人删除成功!");  
            } else {  
                alert("删除操作失败!");  
            }  
        }  
    });  
};  


2. 初始化对话框:

$("#consoleDlg").dialog({  
    autoOpen: false,      
    modal: true,    // (1) 设置对话框为模态(modal)对话框  
    resizable: true,      
    width: 480,  
    buttons: {  // (2) 为对话框添加按钮   
        "取消": function() {$("#consoleDlg").dialog("close")},  
        "创建": addContact,  
        "保存": updateContact,  
        "删除": deleteContact  
    }  
});  
<span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="javascript"><span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;">说明</span><span style="background-color: rgb(255, 255, 255); font-family: Arial, Helvetica, sans-serif;">(1)处将modal属性设为true,即将对话框设置为“模态”,当对话框打开状态时,下层的Grid表格式不能被编辑的(注意z-Index的值);</span>

(2)处为对话框添加了4个按钮,因为增、删、查都共用一个对话框,所以添加4个按钮是比较方便的,只要控制它们不同状态下的显隐状态就OK了。点击每个按钮都会执行各自对应的函数。

 

注:jQuery UI的dialog方法可以详细参考jQuery UI的文档。

 

 

3. 添加记录时打开对话框:

var openDialog4Adding = function() {  
    var consoleDlg = $("#consoleDlg");  
    var dialogButtonPanel = consoleDlg.siblings(".ui-dialog-buttonpane");   // (1)  
    consoleDlg.find("input").removeAttr("disabled").val("");    // (2)  
    dialogButtonPanel.find("button:not(:contains('取消'))").hide(); // (3)  
    dialogButtonPanel.find("button:contains('创建')").show(); // (4)  
    consoleDlg.dialog("option", "title", "创建新联系人").dialog("open");  // (5)  
};

说明:

(1)处先获得对话框按钮的父元素;

(2)将所有的input元素解除disabled状态(在打开删除对话框时,会diable这些input元素);

(3)(4)处调整对话框按钮的显示隐藏状态;

(5)更新对话框标题。

 

 

4. 执行添加操作

var addContact = function() {  
    var consoleDlg = $("#consoleDlg");  
          
    // (1)   
    var pLastName = $.trim(consoleDlg.find("#lastName").val());  
    var pFirstName = $.trim(consoleDlg.find("#firstName").val());  
    var pEmail = $.trim(consoleDlg.find("#email").val());  
    var pTelNo = $.trim(consoleDlg.find("#telNo").val());  
    var pAddress = $.trim(consoleDlg.find("#address").val());  
    var pIdCardNo = $.trim(consoleDlg.find("#idCardNo").val());  
    var pNationality = $.trim(consoleDlg.find("#nationality").val());  
      
    var params = {  
        "contact.lastName" : pLastName,  
        "contact.firstName" : pFirstName,  
        "contact.email" : pEmail,  
        "contact.telNo" : pTelNo,  
        "contact.address" : pAddress,  
        "contact.idCardNo" : pIdCardNo,  
        "contact.nationality" : pNationality  
    };  
      
    var actionUrl = "createContact.action"  
      
    $.ajax( {  
        url : actionUrl,  
        data : params,  
        dataType : "json",  
        cache : false,  
        error : function(textStatus, errorThrown) { // (2)  
            alert("系统ajax交互错误: " + textStatus);  
        },  
        success : function(data, textStatus) {  // (3)  
            if(data.ajaxResult == "success") {  // (4)  
                var dataRow = {  
                    id : data.contact.id,   // (5) 从Server端得到系统分配的id  
                    lastName : pLastName,  
                    firstName : pFirstName,  
                    email : pEmail,  
                    telNo : pTelNo  
                };  
                  
                var srcrowid = $("#gridTable").jqGrid("getGridParam", "selrow");    // (6)  
                  
                if(srcrowid) {  
                    $("#gridTable").jqGrid("addRowData", data.contact.id, dataRow, "before", srcrowid); // (7)  
                } else {  
                    $("#gridTable").jqGrid("addRowData", data.contact.id, dataRow, "first");    // (8)  
                }  
                consoleDlg.dialog("close");  
                  
                alert("联系人添加操作成功!");  
                  
            } else {    // (9)  
                alert("添加操作失败!");  
            }  
        }  
    });  
};    


说明:

(1)从对话框的表单中读取各个输入项的值;
(2)在$.ajax()方法遇到error时,会提示错误(从而让jqGrid不再继续后面的Grid操作);
(3)如果$.ajax()成功,则执行回调函数,但是应当注意这里的“success”,是指ajax请求成功得到response,而不是Struts2 Action的“success”。当Action的result的name为“error”、“input”、“login”等的时候,只要它能够给客户端返回一个格式正确的json数据(我们这里定义了需要的是json),那么都会被认为是“success”;
(4)因此通过传回来的json数据中的ajaxResult项的值,来判断逻辑事务操作是否成功;(在正式项目中,我为不同的Action result定义了不同的ajaxResult值,以方便客户端判断,执行相应后续操作。这里为了演示简便,只定义了success一种,Action配置文件中也只定义了success结果,即使出现error或input等其他结果,Struts2也会因为找不到其他result配置,而抛出异常,也就不会向客户端发送json数据。客户端也就认为ajax请求失败了,从而执行$.ajax()中error项定义的回调方法。)
(5)如果执行成功,则根据Action配置文件的定义,json数据中会包括"contact.id":value这段数据;而jqGrid也就应该继续后续操作,更新Grid表格内的数据;
(6)获得最后选中行的行id;
(7)(8)如果最后选中行的行id不为null,则将新数据行插入到这行上面;否则将新数据加入到Grid的顶端;
(9)如果ajaxResult的值不为success,即逻辑实务操作没有成功,jqGrid不再进行后续操作,同时向用户提示操作失败。


 

 

 

5. 载入行数据到对话框:

当修改或者删除某行数据的时候,通常需要先打开这行记录,让用户看到并确认操作。这就需要将行数据载入到对话框中。

var loadSelectedRowData = function() {    
    var selectedRowId = $("#gridTable").jqGrid("getGridParam", "selrow");  
    if (!selectedRowId) {   // (1)  
        alert("请先选择需要编辑的行!");  
        return false;  
    } else {  
        var params = {  
            "contact.id" : selectedRowId  
        };  
        var actionUrl = "viewContact.action";  
        // 从Server读取对应ID的JSON数据   
        $.ajax( {  
            url : actionUrl,  
            data : params,  
            dataType : "json",  
            cache : false,  
            error : function(textStatus, errorThrown) {  
                alert("系统ajax交互错误: " + textStatus);  
            },  
            success : function(data, textStatus) {  
                // 如果读取结果成功,则将信息载入到对话框中                   
                var rowData = data.contact;  
                var consoleDlg = $("#consoleDlg");  
   
                // (2)   
                consoleDlg.find("#selectId").val(rowData.id);  
                consoleDlg.find("#lastName").val(rowData.lastName);  
                consoleDlg.find("#firstName").val(rowData.firstName);  
                consoleDlg.find("#certificateNo").val(rowData.certificateNo);  
                consoleDlg.find("#email").val(rowData.email);  
                consoleDlg.find("#telNo").val(rowData.telNo);  
                consoleDlg.find("#address").val(rowData.address);  
                consoleDlg.find("#idCardNo").val(rowData.idCardNo);  
                consoleDlg.find("#nationality").val(rowData.nationality);                 
   
                // (3) 根据新载入的数据将表格中的对应数据行一并更新一下   
                var dataRow = {  
                        id : rowData.id,  
                        lastName : rowData.lastName,  
                        firstName : rowData.firstName,  
                        email : rowData.email,  
                        telNo : rowData.telNo  
                    };                
                $("#gridTable").jqGrid("setRowData", data.contact.id, dataRow);  
                  
                consoleDlg.dialog("open");  // (4)  
            }  
        });  
          
    }  
};  


说明:

(1)如果没有行被选中,则提示用户;

(2)如果成功地从Server得到行数据,则将行数据的内容置入对话框表单中;

(3)根据新载入的数据将表格中的对应数据行一并更新一下;

(4)数据载入完毕后,打开对话框。

 

注:其实(3)是可选的部分,我的考虑是既然已经将最新的数据从Server取回来了,干脆就将Grid表格中的数据也更新一下。不论修改或删除操作是否被用户提交,更新一下数据总是好的,也不太费事。既然用户选择了这行数据,说明这行应该是用户关心的,有可能用户打开Grid页面一段时间了,而这行数据实际已经被其他用户更新了。当前用户通过打开对话框,也能得到最新的数据,即便没有修改或者删除,也不算无“功”而返啊。这主要也是从用户体验的角度出发。


 6. 修改记录时打开对话框:

var openDialog4Updating = function() {  
    var consoleDlg = $("#consoleDlg");  
    var dialogButtonPanel = consoleDlg.siblings(".ui-dialog-buttonpane");  
      
    consoleDlg.find("input").removeAttr("disabled");  
    dialogButtonPanel.find("button:not(:contains('取消'))").hide();  
    dialogButtonPanel.find("button:contains('保存')").show();  
    consoleDlg.dialog("option", "title", "修改联系人信息");  
      
    loadSelectedRowData();  // (1)   
}  


说明:

前几行的代码与添加记录是打开对话框时的过程相似,不再赘述;(1)处即在打开对话框之前,将对应行数据载入对话框。

 

 

 

7. 执行修改操作:

var updateContact = function() {  
    var consoleDlg = $("#consoleDlg");  
      
    var pId = $.trim(consoleDlg.find("#selectId").val());  
    var pLastName = $.trim(consoleDlg.find("#lastName").val());  
    var pFirstName = $.trim(consoleDlg.find("#firstName").val());  
    var pEmail = $.trim(consoleDlg.find("#email").val());  
    var pTelNo = $.trim(consoleDlg.find("#telNo").val());  
    var pAddress = $.trim(consoleDlg.find("#address").val());  
    var pIdCardNo = $.trim(consoleDlg.find("#idCardNo").val());  
    var pNationality = $.trim(consoleDlg.find("#nationality").val());  
    var params = {  
        "contact.id" : pId,  
        "contact.lastName" : pLastName,  
        "contact.firstName" : pFirstName,  
        "contact.email" : pEmail,  
        "contact.telNo" : pTelNo,  
        "contact.address" : pAddress,  
        "contact.idCardNo" : pIdCardNo,  
        "contact.nationality" : pNationality  
    };  
    var actionUrl = "updateContact.action";  
    $.ajax( {  
        url : actionUrl,  
        data : params,  
        dataType : "json",  
        cache : false,  
        error : function(textStatus, errorThrown) {  
            alert("系统ajax交互错误: " + textStatus);  
        },  
        success : function(data, textStatus) {  
            if (data.ajaxResult == "success") {  
                var dataRow = {  
                    id : data.contact.id,  
                    lastName : pLastName,  
                    firstName : pFirstName,  
                    email : pEmail,  
                    telNo : pTelNo  
                };  
                $("#gridTable").jqGrid("setRowData", data.contact.id, dataRow, {color:"#FF0000"});  // (1)  
                  
                alert("联系人信息更新成功!");  
                  
                consoleDlg.dialog("close");  
                  
            } else {  
                alert("修改操作失败!");  
            }  
        }  
    });  
};  


说明:参考执行添加操作的说明,这段应该很好理解。(1)处更新Grid中对应行的数据,并添加CSS样式。

 

 

 

8. 删除记录时打开对话框:

var openDialog4Deleting = function() {  
    var consoleDlg = $("#consoleDlg");  
    var dialogButtonPanel = consoleDlg.siblings(".ui-dialog-buttonpane");  
      
    consoleDlg.find("input").attr("disabled", true);    // (1)  
    dialogButtonPanel.find("button:not(:contains('取消'))").hide();  
    dialogButtonPanel.find("button:contains('删除')").show();  
    consoleDlg.dialog("option", "title", "删除联系人");  
      
    loadSelectedRowData();  
}  

说明:(1)处将所有input全部disable掉,使之不能输入内容。


 

 

9. 执行删除操作:

var deleteContact = function() {  
    var consoleDlg = $("#consoleDlg");  
      
    var pId = $.trim(consoleDlg.find("#selectId").val());  
    var params = {  
        "contact.id" : pId  
    };  
    var actionUrl = "deleteContact.action";  
    $.ajax({  
        url : actionUrl,  
        data : params,  
        dataType : "json",  
        cache : false,  
        error : function(textStatus, errorThrown) {  
            alert("系统ajax交互错误: " + textStatus);  
        },  
        success : function(data, textStatus) {  
            if (data.ajaxResult == "success") {  
                $("#gridTable").jqGrid("delRowData", pId);  
                  
                consoleDlg.dialog("close");  
                alert("联系人删除成功!");  
            } else {  
                alert("删除操作失败!");  
            }  
        }  
    });  
};  


以上就是实际应用中,使用自定义表单对话框编辑Grid数据的过程。下一篇说一下排序与搜索。


$(function(){  
    // 配置jqGrid组件   
    $("#gridTable").jqGrid({  
        url: "jqGrid03.action",  
        datatype: "json",  
        mtype: "GET",  
        height: 350,  
        width: 600,  
        colModel: [  
              {name:"id",index:"id",label:"编码",width:40},    
              {name:"lastName",index:"lastName",label:"姓",width:80,sortable:false},  
              {name:"firstName",index:"firstName",label:"名",width:80,sortable:false},  
              {name:"email",index:"email",label:"电子邮箱",width:160,sortable:false},  
              {name:"telNo",index:"telNo",label:"电话",width:120,sortable:false}  
        ],  
        viewrecords: true,  
        rowNum: 15,  
        rowList: [15,50,100],  
        prmNames: {search: "search"},  
        jsonReader: {  
            root:"gridModel",  
            records: "record",  
            repeatitems : false  
        },  
        pager: "#gridPager",  
        caption: "联系人列表",  
        hidegrid: false,  
        shrikToFit: true  
    });  
      
    // 配置对话框   
    $("#consoleDlg").dialog({  
        autoOpen: false,      
        modal: true,    // 设置对话框为模态(modal)对话框  
        resizable: true,      
        width: 480,  
        buttons: {  // 为对话框添加按钮   
            "取消": function() {$("#consoleDlg").dialog("close")},  
            "创建": addContact,  
            "保存": updateContact,  
            "删除": deleteContact  
        }  
    });  
});  
var openDialog4Adding = function() {  
    var consoleDlg = $("#consoleDlg");  
    var dialogButtonPanel = consoleDlg.siblings(".ui-dialog-buttonpane");  
    consoleDlg.find("input").removeAttr("disabled").val("");  
    dialogButtonPanel.find("button:not(:contains('取消'))").hide();  
    dialogButtonPanel.find("button:contains('创建')").show();  
    consoleDlg.dialog("option", "title", "创建新联系人").dialog("open");  
};  
var openDialog4Updating = function() {  
    var consoleDlg = $("#consoleDlg");  
    var dialogButtonPanel = consoleDlg.siblings(".ui-dialog-buttonpane");  
      
    consoleDlg.find("input").removeAttr("disabled");  
    dialogButtonPanel.find("button:not(:contains('取消'))").hide();  
    dialogButtonPanel.find("button:contains('保存')").show();  
    consoleDlg.dialog("option", "title", "修改联系人信息");  
      
    loadSelectedRowData();  
}  
var openDialog4Deleting = function() {  
    var consoleDlg = $("#consoleDlg");  
    var dialogButtonPanel = consoleDlg.siblings(".ui-dialog-buttonpane");  
      
    consoleDlg.find("input").attr("disabled", true);  
    dialogButtonPanel.find("button:not(:contains('取消'))").hide();  
    dialogButtonPanel.find("button:contains('删除')").show();  
    consoleDlg.dialog("option", "title", "删除联系人");  
      
    loadSelectedRowData();  
}  
var loadSelectedRowData = function() {    
    var selectedRowId = $("#gridTable").jqGrid("getGridParam", "selrow");  
    if (!selectedRowId) {  
        alert("请先选择需要编辑的行!");  
        return false;  
    } else {  
        var params = {  
            "contact.id" : selectedRowId  
        };  
        var actionUrl = "viewContact.action";  
        // 从Server读取对应ID的JSON数据   
        $.ajax( {  
            url : actionUrl,  
            data : params,  
            dataType : "json",  
            cache : false,  
            error : function(textStatus, errorThrown) {  
                alert("系统ajax交互错误: " + textStatus);  
            },  
            success : function(data, textStatus) {  
                // 如果读取结果成功,则将信息载入到对话框中                   
                var rowData = data.contact;  
                var consoleDlg = $("#consoleDlg");  
                consoleDlg.find("#selectId").val(rowData.id);  
                consoleDlg.find("#lastName").val(rowData.lastName);  
                consoleDlg.find("#firstName").val(rowData.firstName);  
                consoleDlg.find("#certificateNo").val(rowData.certificateNo);  
                consoleDlg.find("#email").val(rowData.email);  
                consoleDlg.find("#telNo").val(rowData.telNo);  
                consoleDlg.find("#address").val(rowData.address);  
                consoleDlg.find("#idCardNo").val(rowData.idCardNo);  
                consoleDlg.find("#nationality").val(rowData.nationality);  
                  
                // 根据新载入的数据将表格中的对应数据行一并更新一下   
                var dataRow = {  
                        id : rowData.id,  
                        lastName : rowData.lastName,  
                        firstName : rowData.firstName,  
                        email : rowData.email,  
                        telNo : rowData.telNo  
                    };  
                  
                $("#gridTable").jqGrid("setRowData", data.contact.id, dataRow);  
                      
                // 打开对话框   
                consoleDlg.dialog("open");  
            }  
        });  
          
    }  
};  
var addContact = function() {  
    var consoleDlg = $("#consoleDlg");  
          
    var pLastName = $.trim(consoleDlg.find("#lastName").val());  
    var pFirstName = $.trim(consoleDlg.find("#firstName").val());  
    var pEmail = $.trim(consoleDlg.find("#email").val());  
    var pTelNo = $.trim(consoleDlg.find("#telNo").val());  
    var pAddress = $.trim(consoleDlg.find("#address").val());  
    var pIdCardNo = $.trim(consoleDlg.find("#idCardNo").val());  
    var pNationality = $.trim(consoleDlg.find("#nationality").val());  
      
    var params = {  
        "contact.lastName" : pLastName,  
        "contact.firstName" : pFirstName,  
        "contact.email" : pEmail,  
        "contact.telNo" : pTelNo,  
        "contact.address" : pAddress,  
        "contact.idCardNo" : pIdCardNo,  
        "contact.nationality" : pNationality  
    };  
      
    var actionUrl = "createContact.action"  
      
    $.ajax( {  
        url : actionUrl,  
        data : params,  
        dataType : "json",  
        cache : false,  
        error : function(textStatus, errorThrown) {  
            alert("系统ajax交互错误: " + textStatus);  
        },  
        success : function(data, textStatus) {  
            if(data.ajaxResult == "success") {  
                var dataRow = {  
                    id : data.contact.id,   // 从Server端得到系统分配的id  
                    lastName : pLastName,  
                    firstName : pFirstName,  
                    email : pEmail,  
                    telNo : pTelNo  
                };  
                  
                var srcrowid = $("#gridTable").jqGrid("getGridParam", "selrow");  
                  
                if(srcrowid) {  
                    $("#gridTable").jqGrid("addRowData", data.contact.id, dataRow, "before", srcrowid);  
                } else {  
                    $("#gridTable").jqGrid("addRowData", data.contact.id, dataRow, "first");  
                }  
                consoleDlg.dialog("close");  
                  
                alert("联系人添加操作成功!");  
                  
            } else {  
                alert("添加操作失败!");  
            }  
        }  
    });  
};  
var updateContact = function() {  
    var consoleDlg = $("#consoleDlg");  
      
    var pId = $.trim(consoleDlg.find("#selectId").val());  
    var pLastName = $.trim(consoleDlg.find("#lastName").val());  
    var pFirstName = $.trim(consoleDlg.find("#firstName").val());  
    var pEmail = $.trim(consoleDlg.find("#email").val());  
    var pTelNo = $.trim(consoleDlg.find("#telNo").val());  
    var pAddress = $.trim(consoleDlg.find("#address").val());  
    var pIdCardNo = $.trim(consoleDlg.find("#idCardNo").val());  
    var pNationality = $.trim(consoleDlg.find("#nationality").val());  
    var params = {  
        "contact.id" : pId,  
        "contact.lastName" : pLastName,  
        "contact.firstName" : pFirstName,  
        "contact.email" : pEmail,  
        "contact.telNo" : pTelNo,  
        "contact.address" : pAddress,  
        "contact.idCardNo" : pIdCardNo,  
        "contact.nationality" : pNationality  
    };  
    var actionUrl = "updateContact.action";  
    $.ajax( {  
        url : actionUrl,  
        data : params,  
        dataType : "json",  
        cache : false,  
        error : function(textStatus, errorThrown) {  
            alert("系统ajax交互错误: " + textStatus);  
        },  
        success : function(data, textStatus) {  
            if (data.ajaxResult == "success") {  
                var dataRow = {  
                    id : data.contact.id,  
                    lastName : pLastName,  
                    firstName : pFirstName,  
                    email : pEmail,  
                    telNo : pTelNo  
                };  
                $("#gridTable").jqGrid("setRowData", data.contact.id, dataRow, {color:"#FF0000"});  
                  
                alert("联系人信息更新成功!");  
                  
                consoleDlg.dialog("close");  
                  
            } else {  
                alert("修改操作失败!");  
            }  
        }  
    });  
};  
var deleteContact = function() {  
    var consoleDlg = $("#consoleDlg");  
      
    var pId = $.trim(consoleDlg.find("#selectId").val());  
    var params = {  
        "contact.id" : pId  
    };  
    var actionUrl = "deleteContact.action";  
    $.ajax({  
        url : actionUrl,  
        data : params,  
        dataType : "json",  
        cache : false,  
        error : function(textStatus, errorThrown) {  
            alert("系统ajax交互错误: " + textStatus);  
        },  
        success : function(data, textStatus) {  
            if (data.ajaxResult == "success") {  
                $("#gridTable").jqGrid("delRowData", pId);  
                  
                consoleDlg.dialog("close");  
                alert("联系人删除成功!");  
            } else {  
                alert("删除操作失败!");  
            }  
        }  
    });  
};  

jqgrid 表格的增删改查以及modal弹出框 jqgrid 表格的增删改查4种操作,以及表格分页,还有修改以及添加时候的modal弹出框。代码是个project项目文件,需要自己建个解决方案将项目包含进去。 立即下载

相关推荐

STK传感器配置全攻略:从光学到雷达的7种视场类型详解(附避坑指南)

本文详细解析了STK软件中传感器的7种视场类型,从基础的Simple Conic、Complex Conic到高级的SAR与EOIR,提供了完整的配置步骤与实战避坑指南。重点阐述了雷达、光学等不同物理设备的建模选择逻辑,并针对常见的“No Access”等报错问题给出了系统性的排查方案,帮助工程师高效完成卫星系统设计与任务分析。

weixin_29232507的博客 228

Jqgrid入门-使用模态对话框编辑表格数据(三)

Jqgrid是一个强大的表格插件,它提供了多种方式来编辑数据。这三种方式分别是: Cell Editing——只允许修改某一个单元格内容 Inline Editing——允许在jqGrid中直接修改某一行的数据 Form Editing——弹出一个新的编辑窗口进行编辑和新增 在我做的DEMO中,主要运用的是第三种, 弹出一个新窗口来编辑数...

aichuxia4449的博客 477

python知网爬虫论文pdf下载+立即可用(动态爬虫)

python实现动态爬虫知网论文,搜索+自动翻页+下载 收集数据利器

Braylon的博客 5378

【转】jqGrid与Struts2的结合应用(三) —— 使用自定义表单对话框编辑Grid数据...

转至:http://blog.youkuaiyun.com/gengv/article/details/5719053 作者:gengv     上一篇中的最后一点提到了,如果在服务器端出现异常,没能完成预期的操作,那么客户端(浏览器)中的jqGrid还继续更新数据吗?这一篇就来说说服务器端的操作。首先看一下服务器端的代码,我将查看行数据和操作行数据放在了两个Action类里面:ViewContact...

sobigring的博客 160

基因家族快速鉴定指南:Windows平台下的HMMER实战解析

本文详细解析了在Windows平台下使用HMMER工具进行基因家族快速鉴定的完整实战流程。通过手把手指导,从软件获取、数据准备到模型构建与序列搜索,帮助生物信息学新手无需Linux环境,即可高效完成bZIP转录因子等家族的鉴定工作,大幅降低分析门槛。

weixin_29255731的博客 456

把 ST03 的历史数据留得更久:ABAP Workload 统计保留期设置、原理与落地避坑指南

SAP ST03性能数据保留期配置指南 ST03/ST03N是SAP系统性能分析的核心工具,但默认数据保留期通常较短(3个月左右),难以满足跨季度对比、年度规划等需求。本文详细解析了ST03数据保留期的配置方法及注意事项: 数据存储机制:性能数据存储在监控库中,通过定期重组作业清理过期数据 配置路径:7.0+系统在"Workload Collector Database→Reorganization→Control"中按Profile分别设置 关键限制:保留期最大值建议不超过99,否则可

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 217

jqGrid与Struts2的结合应用(三) ------ 使用自定义表单对话框编辑Grid数据 .

上一篇中的最后一点提到了,如果在服务器端出现异常,没能完成预期的操作,那么客户端(浏览器)中的jqGrid还继续更新数据吗? 这一篇就来说说服务器端的操作。 首先看一下服务器端的代码,我将查看行数据和操作行数据放在了两个Action类里面:ViewContactAction和ContactConsoleAction。 [java] view plaincopyprin

nusoftyu的专栏 1176

验证码破解2.0:Python+CV大模型搞定滑块/点选验证

核心创新:基于YOLOv8+SAM CV大模型的端到端验证码破解方案,无需人工设计特征,适配多种验证码类型;核心价值高成功率:滑块验证≥95%,点选验证≥90%,远超传统CV方案;低延迟:单验证码破解≤2秒,满足高并发采集需求;行为模拟:生成符合人类操作的轨迹,绕过行为检测;易扩展:统一架构支持新增验证码类型,仅需少量标注数据微调;技术要点采用YOLOv8实现快速目标检测,SAM实现像素级分割;生成物理规律的人类轨迹,模拟真实操作行为;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1261

jqGrid与Struts2的结合应用(一) —— 显示基本Grid表格

根据jqGrid的文档,要想生成一个jqGrid,最直接的方法就是: $("#grid_id").jqGrid(options); 也就是通过选择符得到一个table的jQuery对象,然后调用jqGrid(options),得到一个jqGrid对象。 重点就在传入的option选项上了,通过这些选项可以得到各种各样的Grid表格。1. jqGrid的重要选项具体的options参考,可以访问jqGrid文档关于option的章节(http://www.trirand.com/jqgrid

GengV - 在Java的世界流浪 5万+

【保姆级教程】基于UNet++&MobileNetv2的语义分割模型从训练到RK3588部署:让边缘AI落地效率提升300%

通过SMP库一键构建encoder_name="mobilenet_v2", # 选择MobileNetv2作为骨干encoder_weights="imagenet", # 加载预训练权重加速收敛in_channels=3, # 输入图像通道数(RGB)classes=29, # Cityscapes数据集类别数activation=None # 输出无激活,便于后续损失计算本教程从“模型设计-训练-转换-边缘部署”全链路拆解了。

m0_71589036的博客 85

SpringBoot整合LangChain4j实现RAG检索实战详解

本文介绍了使用LangChain4j框架在Java生态中构建RAG(检索增强生成)应用的最佳实践。作为最接近Python LangChain的Java实现,LangChain4j提供了文档解析、向量化存储到检索增强的全套组件,并与SpringBoot深度集成。文章通过电商智能客服场景,详细演示了从零搭建RAG系统的完整流程:包括使用PostgreSQL+pgvector作为生产级向量数据库、文档加载与向量化处理、声明式AI服务实现以及查询压缩、结果重排等进阶优化技巧。同时对比了内存模式与生产级向量库的差异,

分享AI、区块链技术及应用,未来已来 432

jqGrid与Struts2的结合应用(二) —— 操作Grid数据

上一篇中,jqGrid已经可以从Server端获得数据,并显示在Grid表格中了。下面说一下,如何操作Grid表格及其数据。jqGrid有很多方法函数,用来操作数据或者操作Grid表格本身。jqGrid的方法有两种调用方式:$("#grid_id").jqGridMethod( parameter1,...,parameterN );或者$("#grid_id").jqGrid('method', parameter1,...,parameterN );首先介绍一下jqGrid的几个最常用的方法函数,具体的

GengV - 在Java的世界流浪 3万+

逆强化学习:从专家示范中学习策略

逆强化学习(Inverse Reinforcement Learning,简称IRL)是强化学习(Reinforcement Learning,简称RL)的一个子领域,它的目标是从专家的行为中学习策略。在传统的强化学习中,智能体通过与环境交互,根据奖励信号来学习一个策略。而在逆强化学习中,我们没有直接的奖励信号,而是通过观察专家的行为来推断出奖励函数,从而学习到一个与专家类似的策略。逆强化学习作为强化学习的一个重要子领域,在许多实际应用场景中都取得了显著的成功。

AI天才研究院 1447

jqGrid与Struts2的结合应用(四) —— 丰富多彩的Pager Bar

在介绍排序与查询之前,先介绍一下Pager、Navigator和自定义按钮。 默认情况下,Pager Bar分为3个部分:页码栏区域(Pager)导航按钮区域(Navigator Buttons)记录信息区域(Record Information)1. Pager和Record Information的常用属性 在jqGrid的options选项中,有许多是专门针对Pager的,之前的例子中已经使用了一个——“pager”选项,用来指明Pager Bar在页面中对应的区域。 主要的属性有:page

GengV - 在Java的世界流浪 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jQuery学习笔记--jqGrid与Struts2集成 讲解

因为公司项目需要,在Hibernate+Struts2的环境下,研究了一下如何使用jqGrid。 说实在的,Struts2+jqGrid不是一个很好的组合。因为jqGrid中很多功能,基本上都使用的是AJAX的访问方式,并且,大家都知道,jqGrid需要的数据,要么是XML格式的,要么是JSON格式。(当然,我说的是一般情况,其实jqGrid还支持本地数据,以及xml字符串、json字符串之类的

Hurry的专栏 3046

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

jqGrid与Struts2的结合应用(八) —— 奇妙的subGrid子表格

jqGrid的一项高级功能就是嵌套子表格,使用起来也非常简单。使用的方式有两种:使用普通的subGrid子表格;使用一个完整jqGrid作为子表格;显然第二种方式更加通用,功能更加强大,因此我主要使用第二种方式。至于第一种方式,可以具体参考官方文档(http://www.trirand.com/jqgridwiki/doku.php?id=wiki:subgrid )。 使用完整jqGrid作为子表格 使用子表格,涉及到jqGrid的三个选项:subGrid :首先必须将jqGrid的subGrid

GengV - 在Java的世界流浪 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jqGrid与Struts2的结合应用(十) —— 真正的自定义表单查询

在网上搜了一下,大多都是引用jqGrid的文档中的filterGrid方法。但这个方法不是真正意义的自定义查询。这篇文章主要讲述一下真正意义的自定义查询,顺便简单聊聊jqGrid源码中查询的实现方法。在这个系列的第五篇中(http://blog.youkuaiyun.com/gengv/archive/2010/07/10/5725172.aspx )曾经讲到了如何进行数据查询。其中提到了一种“自定义查询”,

没长正 2783

【转】jqGrid与Struts2的结合应用(六) —— 使用colModel设置查询功能

转至:http://blog.youkuaiyun.com/gengv/article/details/5730259 作者:gengv   上一篇主要讲述了,如何结合Action类进行查询,以及查询的几种主要方式。在searchGrid方法中,我们传入的options选项,定义了查询所需要的通用属性。举个例子来说吧,当点击查询按钮的时候,弹出的查询对话框里包含Grid中的各个列作为可选的查询条件...

sobigring的博客 138
上一篇: jqGrid与Struts2的结合应用(二) —— 操作Grid数据
下一篇: jqGrid与Struts2的结合应用(四) —— 丰富多彩的Pager Bar
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值