2017-05-16 12 views
0

私はWebアプリケーションでjson応答をhtmlテーブルの形式で表示することにいくつか問題があります。jQuery DataTable + Spring MVC + JSP + Json

私は、Springのブート、ブートストラップ、ビューのJSP、およびテーブルの形式でデータを表示するためのjQuery DataTableを使用しています。

データ処理は正しいです:私はnavbarを持っていますので、これをクリックして、dbを照会するフォームを表示し、パラメータを選択して "Search"をクリックします。 この後、メインページの右側のdiv(私たちは 'ページを変更したいのではなく、ホームページのdivをリロードする)をすると、ヘッダテーブル(検索ボタンをクリックする前に非表示)が正しく表示され、 Firefoxで+ shift + kを押して、Networkで200のステータスを取得できます。さらに、イベントをクリックしてレスポンスラベルを確認すると、json形式のデータが正しく表示されますが、ページ上にデータが表示されません。 私は自分のエラーが私のDatatableを使用していると思います。

これは私がデータ応答を示さなければならないのjspです:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

<script type="text/javascript" class="init"> 
$(document).ready(function() { 

    $('#firewalldata').DataTable( 
       { 
        "ajax": '../getfirewall.json', 
        "columns": 
        [ 
         { "data": "id" }, 
         { "data": "ip" }, 
         { "data": "info" }, 
         { "data": "name" } 
        ] 
       }); 
     }); 

</script> 


    <div class="container" align="center"> 
      <h1>Firewall List</h1> 
       <table class = "table table-bordered" id="firewalldata"> 
       <thead> 
        <tr> 
         <th>ID</th> 
         <th>IP</th> 
         <th>INFO</th> 
         <th>Name</th> 
        </tr> 
       </thead> 


        <tbody> 
       </tbody>  

       </table> 
    </div> 

そしてこれは、コントローラのメソッドです:あなたが見ることができますどのように

@PostMapping(value="/getfirewall.json") 
    @ResponseBody 
    public ModelAndView listFirewall(ModelAndView model, HttpServletRequest request, 
      @RequestParam(name="id", required=false) String id, 
      @RequestParam(name="info", required=false) String info, 
      @RequestParam(name="ip", required=false) String ip, 
      @RequestParam(name="firewallname", required=false) String name) throws IOException 
    { 


     //First, we compile the list to shown result 
     List<Firewall> listFirewall = firewalls.getFirewall(id, info, ip, name); 

     //Second, we put this list in the model and set the name of the view 
     model.addObject("listFirewall", listFirewall); 

     //Finally, we return the model 
     return model; 
    } 

、コントローラは単に、DAOで定義されたメソッドを呼び出しますクラスを使用して、DBからファイアウォールのリストを取得します。

私は間違っていますか?

EDIT:尋ねたとして、これは私がCTRL + shifr + Kをクリックした後にFirefoxの上で見ることができるJSONレスポンスの断片である:

enter image description here

EDIT2:スクリプト、以下の答えの後、ある今、この:私は私のアプリを起動したとき

<script src="https://code.jquery.com/jquery-1.11.1.min.js"></script> 
<script src="https://cdn.datatables.net/1.10.4/js/jquery.dataTables.min.js"></script> 
<link rel="stylesheet" href="https://cdn.datatables.net/1.10.4/css/jquery.dataTables.min.css"> 

    <script type="text/javascript" class="init"> 
$(document).ready(function() { 

    $('#firewalldata').DataTable( 
      { 
       "processing": true, 
       "ajax":{ 
          "url": "../getfirewall.jsp", 
          dataSrc: '' 
         }, 
       "columns": [ 
        { "data": "id" }, 
        { "data": "ip" }, 
        { "data": "info" }, 
        { "data": "name" } 
       ] 
      }); 
    }); 
</script> 

今、私はこのメッセージを得た:DataTableの警告:テーブルID = firewalldata - Ajaxのエラー。このエラーの詳細については、http://datatables.net/tn/7

を参照してください。検査すると、/getfirewall.jspで404エラーが発生します。検索フォームを使用しようとすると、「読み込み中」と「0エントリの0〜0エントリを表示」という行が1行しか表示されません。

Edit3:この問題を修正し続けます。問題は解決しませんが、私は分析について新しいことがあります。原因は/getfirewall.jsonに4o4エラーがあり、私のバーで数字を表示しようとしましたが、空白のページがあります。私がそれを分析すれば、私は身体が満腹だと見ることができます。しかし、私がメインページに戻ってくると、フォームが提出された後、私は、レスポンスセクションで、データがJson形式でうまく形成されます。ページ/getfirewall.jsonはデータなしで、空のですが、私は、アプリケーションのページにフォームを送信した場合、私はJSONレスポンスを得ることができる理由

1):私は理解していない何

は2つのことがありますか?

2)アプリケーションを起動した後にブラウザを開いたときにエラーが表示され、エラーが発生しました。しかし、なぜ?フォーム送信後にデータを取得する必要がある場合、私のアプリがすぐに検索するのはなぜですか?

編集4、19/05/2017

[OK]を、oterレビューの後、これは私の実際のコードです:ポスト行で

<script type="text/javascript" class="init"> 
$(document).ready(function() { 

    $('#firewalldata').dataTable( 
      { 
       "processing": true, 
       "serverSide": true, 
       "ajax":{ 
          url: "../getfirewall.json", 
          type: "post", 
          dataSrc: "" 
         }, 
       "columns": [ 
        { "data": "id" }, 
        { "data": "ip" }, 
        { "data": "info" }, 
        { "data": "name" } 
       ] 
      }); 
    }); 
</script> 

私は404の問題を解決することができます。私はそれがなければ "データが見つかりません"というエラーが発生したため、処理行を追加しました。

実際、コードはまだ完全ではありません。私は、検索を提出した後、「一致するエラーは見つかりませんでした。

FINAL編集。

私はいくつかの同僚と話した後、この問題を解決しました。問題は、「標準」構文では、主にdivをアップロードしている同じページのリダイレクトのために、私のページをモデル化するのに十分ではなかったということです。私はここにコードを入れて、希望は私の同じ問題で他のプログラマーを助けるかもしれない。

まず、jquery DatatableページのJsonレスポンスに表示されるいくつかのコンポーネントをcontrolerに追加しました。recordsTotalとrecordsFilteredです。だから私のコードはなった:

@PostMapping(value="/getfirewall.json") 
    @ResponseBody 
    public ModelAndView listFirewall(ModelAndView model, HttpServletRequest request, 
      @RequestParam(name="id", required=false) String id, 
      @RequestParam(name="info", required=false) String info, 
      @RequestParam(name="ip", required=false) String ip, 
      @RequestParam(name="firewallname", required=false) String name) throws IOException 
    { 


     //First, we compile the list to shown result 
     List<Firewall> listFirewall = firewalls.getFirewall(id, info, ip, name); 

     //Second, we put this list in the model and set properties for jquery datatables 
     model.addObject("recordsTotal", listFirewall.size()); 
     model.addObject("recordsFiltered", listFirewall.size()); 
     model.addObject("data", listFirewall); 


     //Finally, we return the model 
     return model; 
    } 

その後、私はホームページ(私は新しいページで結果を読み込むホームページのdivを更新してはならないことを思い出してください)、jJson応答をシリアル化するために、このスクリプトに追加します。

(function($){ 
     $.fn.serializeObject = function() 
     { 
      var o = {}; 
      var a = this.serializeArray(); 
      $.each(a, function() { 
       if (o[this.name]) { 
        if (!o[this.name].push) { 
         o[this.name] = [o[this.name]]; 
        } 
        o[this.name].push(this.value || ''); 
       } else { 
        o[this.name] = this.value || ''; 
       } 
      }); 
      return o; 
     }; 
    })(jQuery); 

最後に、firewall.jspページにextend要素を追加して、Jacksonから取得したJsonをモデル化します。

<script type="text/javascript" class="init"> 
var DTfirewall = false; 
$(document).ready(function() { 

    DTfirewall = $('#firewalldata').DataTable( 
      { 
       "serverSide": true, 
       "ajax":{ 
          url: "../getfirewall.json", 
          type: "post", 
          "data": function (d) { 
           d = $.extend(d, { 
            firewallname : $('#firewallname').val() 
           }); 
          } 
         }, 
       "columns": [ 
        { "data": "id" }, 
        { "data": "ip" }, 
        { "data": "info" }, 
        { "data": "name" } 
       ] 
      }); 
    }); 
</script> 
+0

をすることができ試してくださいする必要がありますので、スクリプトはこのになりましたコントローラーから受け取ったJSONを共有しますか? –

答えて

0

あなたが同様の質問への答えに示すように、コントローラパスを使用してみてください(https://stackoverflow.com/a/33367053/5789827

$('#firewalldata').DataTable( 
        { 
          "processing": true, 
         "ajax":{ 
            "url": "yourControllerRelativePath", 
            dataSrc: '' 
           }, 
         "columns": [ 
          { "data": "id" }, 
          { "data": "ip" }, 
          { "data": "info" }, 
          { "data": "name" } 
         ] 
        }); 
      }); 
+0

回答ありがとうございます。私はやったけど問題は残っている。私はDataTableに関する私の無知から、データがどのように関数に与えられるのかという問題だと思います。 "ajax"パラメータでは、私はパスを入れます、コントローラと同じです。実際には、私は "列"を定義するとき、 "データ"は他の場所で定義されていません。コードのいくつかの点でデータを定義し初期化する必要がありますか? –

+0

あなたの編集をもう一度読みました。ありがとうございました。まず最初に、データテーブルを使用するためにページの開始時に宣言を忘れた: 次に、 /stackoverflow.com/questions/31516744/datatables-does-not-display-data しかし、両方とも私はまだ問題があります。私は宣言や初期設定を忘れていたかもしれませんか? –

0

この

$('#firewalldata').dataTable( 
        { 
          "processing": true, 
         "ajax":{ 
            "url": "yourControllerRelativePath", 
            dataSrc: '' 
           }, 
         "columns": [ 
          { "data": "id" }, 
          { "data": "ip" }, 
          { "data": "info" }, 
          { "data": "name" } 
         ] 
        }); 
      }); 
+0

まずはお返事ありがとうございます。試しましたが、問題は私の2回目の編集と同じです。 –

関連する問題