【问题标题】:jqGrid with Struts 2jqGrid 与 Struts 2
【发布时间】:2013-07-19 20:34:27
【问题描述】:

我需要显示一个网格,后端有 Struts2。 我有一个代表数据的类Tuple,我在其中创建了一个方法toJson(),它返回JsonObject(使用Google GSON 框架)

在一天结束时,我得到了空网格,如图所示。

详情如下:

public class Tuple implements Serializable{
//other methods here..
 public JsonObject toJson() {
    //create JSON referemce
    jSonRef = new JsonObject();
    jSonRef.add("ProposalId", new JsonPrimitive( m_lngProposalId) );
    jSonRef.add("ProposalLabel",  new JsonPrimitive(m_strProposalLabel) );
    jSonRef.add("AnalysisStatus",  new JsonPrimitive(m_strAnalysisStatus) );


    jSonRef.add("lockedBy", m_strLockedBy!=null? new  
            JsonPrimitive(m_strLockedBy): new JsonPrimitive("") );

         return jSonRef ;
}
//       other stuff here ...
 }//end of the class

jSonRef是类的成员变量。

struts.xml是这样的:

 <action name="JsonGetter" class="com.bvn.ecost.framework.actions.JSonGetterAction">
<result name="success" type="json"/>
 </action>

动作类是:

package com.bvn.ecost.framework.actions;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import com.google.gson.JsonArray;
import com.opensymphony.xwork2.Action;


 public class JSonGetterAction extends SuperAction{ //extends SuperAction
private static final Logger log = LogManager.getLogger(ReportDealAction.class);
private String results = null ;

public String execute() {
      JsonArray propsArray = loadProposalsJson() //method from superclass, returning 
                                                 //JsonArray
  results = propsArray.toString() ;

  return Action.SUCCESS ;
}

public String getResults() {
    return results;
}

public void setResults(String results) {
    this.results = results;
}   
 }

JSP 页面:

<code>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ page language="java" %>
<%@ page import="com.bvn.ecost.*" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.sql.Connection" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
try {

%>`
<!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" >
<HEAD>
<link rel="stylesheet" type="text/css" href="css/mainStyles.css" />
<link type="text/css" href="css/redmond/jquery-ui-1.8.23.custom.css" media="screen" 
rel="stylesheet" />
<link type="text/css" href="css/ui.jqgrid.css" media="screen" rel="stylesheet" />
<link type="text/css" href="css/jquery.loadmask.css" media="screen" rel="stylesheet" />
<link type="text/css" href="css/ui.app.css" media="screen" rel="stylesheet" />
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.23.custom.min.js"></script>
<script type="text/javascript" src="js/grid.locale-en.js"></script>
<script type="text/javascript" src="js/jquery.jqGrid.min.js"></script>
<script type="text/javascript" src="js/jquery.validate.js"></script>
<script type="text/javascript" src="js/jquery.loadmask.js"></script>
<script type="text/javascript" src="js/app-helper.js"></script>
<script type="text/javascript">
    $(document).ready(function (){
        $.getJSON('JsonGetter.action', function(data) {
            alert("Inside .getJson()") ;
            console.log("data->results:  "+data.results) ;
            var this_grid;
            this_grid = $this_app.define_grid("#grid-results", {
                caption: 'Proposal Grid',
                pager: '#pager-results',
                data: $.extend(true, [], data.results),
                datatype: "local",
colModel: [
  { name: 'ProposalId', index: 'ProposalId', width: 120, label: 'Proposal Id' },
      { name: 'ProposalLabel', index: 'ProposalLabel', width: 120, label: 'Label' },
  { name: 'AnalysisStatus', index: 'AnalysisStatus', width: 120, label: 'Status' },
  { name: 'lockedBy', index: 'lockedBy', width: 440, label: 'Locked by' }
],
inline_editing: false,
pager_options: {
  del: false                        
}); 
        }
) <!-- end of getJSon() -->
    });    
</script>
</HEAD>
<BODY>

<table align="center" width="100%"> <!-- Wrapper table -->
<tr>
<td>
<table align="center" width="100%"> <!-- Header image table -->
    <jsp:include page="commonHead.jsp" flush="true" />
    <tr>    
    <td colspan="10" align="center" style="color:#00509e">
    <b><s:property value="statusString"/></b>
    </td>
</tr>                   
</table>
</td>
</tr>
<tr>
<td>
        <table align="center" width="60%">
            <tr align="center">
                <TD align="left">
                    <div id="div-results">
                        <table id="grid-results">

                        </table>
                        <div id="pager-results">
                        <div/>
                    </div>
                    <span id="results-status-message"></span>
                </TD>
            </tr>
        </table>    
    </td>
</tr>
   </table>
   </BODY>
   </HTML>
 <%
}
catch (Exception e) {
    Helper.handleException(e, request, response, out);
}
 %>

我正在获取完整的页面,但网格为空:

"console.log("data->results: "+data.results) ;" 这一行 在浏览器 JavaScript 控制台中显示 Json,如下所示:

data->results:  [{"ProposalId":35145,"ProposalLabel":"US Laminating Corp 1","AnalysisStatus":"WIP","lockedBy":"cost-analyzer-admin"}]

我知道这可能是不正确的,但不知道如何。 另外,我尝试在操作中将结果变量作为 JsonObject (并将其获取值的方式更改为此)

results.add("result", propsArray) ;

然后用指定的数据更改JSP行:就像:

data: $.extend(true, [], data.results.result),

但我在浏览器中得到了某种UnsupportedOperationException

【问题讨论】:

    标签: java jquery json jqgrid struts2


    【解决方案1】:

    您通过序列化所有动作属性的 json 插件获取 JSON 对象,这可能不是获取网格模型所必需的。为什么不创建一个网格模型对象并通过指定结果的root 参数将其序列化为JSON。无论如何误解 JSON 和 JSON 对象的字符串化版本之间的区别不会让您将 JSON 对象应用于网格。使用results 字段,您获得了一个字符串化的 JSON,需要解析为像 $.parseJSON(data); 这样的 JSON 对象,然后将其应用于网格模型。

    没有必要,如果您使用的是 Struts 2,为什么不使用 struts2-jquery-plugin 并像 here 描述的那样使网格更容易。

    This 问题也可能有助于解决此问题。

    【讨论】:

    • 谢谢你,罗曼。到目前为止,这是我迄今为止找到的最好的答案或建议的解决方案。为此我选择了 Struts,因为我在 J2EE 接触中接触过它,但似乎很难找到可用的综合知识。你会建议一个好的资源吗?我拿起了《Struts2 in action》一书,这本书很好,但在需要快速解决一些问题时已经足够了。
    • @DimaR。如果你能快速解决,那么对你有好处,每一个解决方案都是努力工作的结果,任何资源都是有帮助的,这个网站很棒,书籍很适合学习,互联网很大。所以,祝你好运,如果你喜欢这个答案,别忘了把这个答案标记为已接受。
    【解决方案2】:

    我为此苦苦挣扎了很长一段时间,认为我遇到的问题是由于不了解 Jquery/gqgird/javascript 等造成的。 虽然情况可能仍然如此,但我解决了显示数据的问题,只是不使用 google gson 库,并序列化映射到我的数据的自定义 java bean 对象。 也许有人会发现这很有用,而不必花费太多时间:

    我得到的错误是由于 Struts json 插件使用反射来查找要序列化的对象的属性。结果,由于 JsonObject 从 google 库扩展了 JsonElement,struts 看到了它认为要序列化的一堆 getter 方法。 所有方法

    getAsBigDecimal()
    getAsString(..)
    etc..
    

    被解释为属性

    asBigDecimal
    asString
    asBoolean
    etc..
    

    并且预计会在 Json 对象中找到。当然,在我的自定义数据中没有找到它们,最初是使用

    添加到 JsonObject
    addProperty()
    

    方法,这么深埋在struts-json-plugin里面,抓到了JsonException,跟InvocationTargetException有关。

    感谢任何试图提供帮助的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多