2013-07-19 80 views
1

我需要顯示一個網格,後端有Struts2。 我有一個類Tuple表示數據,其中我創建了一個方法toJson()即返回JsonObject(使用谷歌GSON框架)jqGrid with Struts 2

在這一天結束時,我得到空網,看到的畫面。

下面是詳細信息:

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); 
} 
%> 

我得到完整的頁面,但空網格:

empty grid

線 「的console.log(」 數據 - >結果: 「+ 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

回答

1

您正通過json插件獲取JSON對象,該json插件序列化所有操作屬性,這可能不是獲取網格模型所必需的。爲什麼不創建網格模型對象並通過指定結果的root參數將其返回到JSON序列化。無論如何,誤解JSON和JSON對象的字符串化版本之間的差異不會讓您將JSON對象應用於網格。在results字段中,您已獲得需要解析爲像$.parseJSON(data);這樣的JSON對象的字符串化JSON,然後將其應用於網格模型。

沒有必要,如果您使用的是Struts 2,爲什麼不使用struts2-jquery-plugin並使柵格更容易,如描述的here

This問題也可能有助於解決此問題。

+0

謝謝羅馬。到目前爲止,這是迄今爲止我發現的最佳答案或建議解決方案。我爲此選擇了Struts,因爲我已經在我的J2EE中暴露了它,但似乎很難找到可用的整合知識。你會建議一個很好的資源嗎?我選擇了「Struts2 in action」這本書,當需要快速解決少數問題時,這是完全正確的,但還是足夠的。 –

+1

@DimaR。如果你能快速解決,那麼對你有好處,每一個解決方案都是因爲努力工作,任何資源都是有益的,這個網站是偉大的,書籍對學習有好處,互聯網是大的。所以,祝你好運,如果你喜歡這個答案,不要忘了標記這個答案爲可接受的。 –

0

我一直在爲此苦苦掙扎了好一陣子,認爲我遇到的問題是由於不理解Jquery/gqgird/javascript等等。 雖然這可能仍然是這樣,但我解決了顯示問題數據,只需不使用谷歌gson庫,並序列化映射到我的數據的自定義java bean對象。 也許有人可以找到這個有用的,並且不必花費太多時間:

我得到的錯誤是由於事實,即Struts json插件使用反射來查找要序列化的對象上的屬性。因此,由於JsonObject從谷歌庫中擴展了JsonElement,因此struts會看到它認爲被序列化的一堆getter方法。 所有方法

getAsBigDecimal() 
getAsString(..) 
etc.. 

被解釋爲屬性

asBigDecimal 
asString 
asBoolean 
etc.. 

,預期在JSON對象被發現。當然,他們並沒有在我的自定義數據,最初添加到JSONObject的使用

addProperty() 

方法發現,深深地埋在struts-JSON的插件有JsonException抓,涉及到的InvocationTargetException。

謝謝,無論誰試圖幫忙。