0

jqGrid は空です。jqGrid ページャーには、「表示するレコードがありません」と表示されます。サーバーは、正しくフォーマットされた JSON 文字列のように見えるものを返しています。JSON 文字列形式に一致するように JSONReader を定義しましたが、それでも空のグリッドが表示されます。どんな助けでも大歓迎です。

サーバーからの JSON 文字列は次のとおりです。

{"JSONObj":{"totalpages":"1","currpage":"1","totalrecords":"1","rows":[{"id":"1","cell":["num1","Vendor1"]}]}}

ソースは次のとおりです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-    strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>JSON Example</title>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <script type="text/javascript" src="jquery.min.js"></script>
    <script type="text/javascript" src="grid.locale-en.js"></script>
    <script type="text/javascript" src="jquery.jqGrid.min.js"></script>
    <link rel="stylesheet" type="text/css" href="jquery-ui-1.9.0.custom.css" />
    <link rel="stylesheet" type="text/css" href="ui.jqgrid.css" />

    <script type="text/javascript">

      jQuery(document).ready(function () {
         jQuery("#vendorGrid2").jqGrid({
             jsonReader : {
                 root:"rows",
                 total: "totalpages",
                 page: "currpage",
                 records: "totalrecords",
                   cell: "cell", 
                   id: "id"
                },
           pager: $("#vendorGrid2_pager"),
           rowNum:1,
           rowList:[10,20,30],
           datatype: "json",
           viewrecords:true,
           url: "getJSONVendorList",  // call the struts2 action in jsonexample.xml
           gridModel:"JSONObj",       // the object that gets returned containing the grid data
           height: 250,
           colNames:['ID', 'Name'],
           colModel:[
               {name:'num',index:'num', width:200, sorttype:"int"},
               {name:'name',index:'name', width:500, sorttype:"string"}
           ],
           multiselect: false,
           height: "100%",
           caption: "Vendor List",
              //loadComplete: function(data){alert('loaded');},
              loadError: function(xhr,status,error){alert(status+" "+error);}, 
       });

         // this works when datatype:"local"
         //jQuery("#vendorGrid2").addRowData("1", {num:"1", name:"Dallas Vendor"});
         //jQuery("#vendorGrid2").addRowData("2", {num:"2", name:"Ft. Worth Vendor"});
     });

    </script>

</head>
<body>

JSON Example

<div id="gridInfo">
    <table id="vendorGrid2"></table>
    <div id="vendorGrid2_pager"></div>
</div>

</body>

</html>
4

1 に答える 1

0

同じ問題を抱えている可能性のある他の人の利益のために、私自身の質問に答えます。

Java クラスは、JSON ライブラリ (jar) を使用して、JSONObj という名前の変数を持つ JSON オブジェクトを構築していました。これを行うと、JSON 文字列内に JSON 文字列が作成されるため、オブジェクトの先頭に「余分な」文字列「JSONObj」が作成されます。これは行くべき道ではありませんでした。
適切な方法は、struts2 JSON プラグイン (struts2-json-plugin-2.1.8.jar) を使用することです。このプラグインは、Java クラス全体を受け取り、それを JSON オブジェクトに変換します。クラスを適切に実装するには、クラス プロパティとパブリック ゲッターおよびセッター (POJO/Java Bean) を使用する必要があります。クラスで JSON オブジェクトを「構築」する必要はありません。これは特定のコードの問題というよりは Java/struts2/JSON の概念ですが、とにかく Java クラスを投稿しました。

package autobasic;

import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import autobasic.beans.VendorBean;
import autobasic.db.DbVendorList;
import autobasic.exception.AutobasicException.AutobasicDBException;
import com.opensymphony.xwork2.ActionSupport;

public class VendorListActionSupport extends ActionSupport
{

   private static final long serialVersionUID = 1L;
   private static Logger log = Logger.getLogger(VendorListActionSupport.class);
   private String currpage = "1";
   private String totalpages = "1"; 
   private String totalrecords = "2"; 
   private ArrayList<ArrayList<String>> rows = new ArrayList<ArrayList<String>>();

   public String returnJSON()
   {
      getVendorList();
      return SUCCESS;
   }

   void getVendorList()
   {
      try
      {
         DbVendorList dbVendorList = new DbVendorList();
         List<VendorBean> vendorList = null;
         vendorList = dbVendorList.getVendorList();  // load the list
         totalrecords = Integer.toString(vendorList.size());

         ArrayList<String> items = null;

         for (VendorBean vb : vendorList)
         {
            items = new ArrayList<String>();
            items.add(vb.getID());
            items.add(vb.getName());
            items.add(vb.getCity());
            items.add(vb.getPhone());
            rows.add(items);
         }
      }
      catch (AutobasicDBException e)
      {
         e.printStackTrace();
      }
   }

   public String getCurrpage()
   {
      return currpage;
   }

   public String getTotalpages()
   {
      return totalpages;
   }
   public String getTotalrecords()
   {
      return totalrecords;
   }

   public ArrayList<ArrayList<String>> getRows()
   {
      return rows;
   }
}
于 2012-12-03T21:22:34.607 に答える