2017-05-16 156 views
0

我在我的web應用程序中顯示html表格的json響應時出現了一些問題。jQuery DataTable + Spring MVC + JSP + Json

我使用Spring引導,Bootstrap,JSP查看和jQuery DataTable以表格形式顯示數據。

數據處理是正確的:我有一個導航欄,所以我點擊這個,顯示一個表格來查詢數據庫,選擇參數並點擊「搜索」。 在此之後,在主頁面的正確的div(我們不'想要改變頁面,而只是重新加載主頁的div),我可以正確地看到頭表(隱藏之前點擊搜索按鈕),如果我點擊CTRL在Firefox上+ shift + k並在網絡中看到我可以獲得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中定義的方法類從數據庫中獲取防火牆列表及其數據。

我在做什麼錯?

編輯:爲問,這是JSON響應,我可以在點擊後ctrl在Firefox上看到的片段+ shifr + K:

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> 

現在,當我開始我的應用程序我得到這個消息:數據表警告:表ID = firewalldata - 阿賈克斯錯誤。有關此錯誤的更多信息,請參閱http://datatables.net/tn/7

並且當我檢查時,我在/getfirewall.jsp上發生了404錯誤;然後,當我嘗試使用搜索表單時,我只能看到1行,「加載」和「顯示0條目的0到0」。

Edit3:我正在繼續糾正這個問題。問題仍然存在,但我有新的分析:因爲我得到了/ getfirewall.json上的4o4錯誤,我試圖在我的酒吧數字,我有一個空白頁;如果我分析它,我可以認爲這個身體是真實的。但是,如果我回到主頁面,在表單提交之後,我在響應部分中以Json格式很好地形成了數據。

什麼,我不明白是兩兩件事:

1)爲什麼頁面/getfirewall.json是空的,沒有數據,但如果我在申請頁面提交表單我能得到JSON響應?

2)我得到了錯誤,當我打開瀏覽器,啓動應用程序後,我得到了錯誤。但爲什麼?如果我必須在表單提交後收集數據,爲什麼我的應用程序立即搜索它們?

編輯4,19/05/2017

好吧,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數據表頁上看到了Json響應: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

我已閱讀您的編輯,再次感謝。首先,我忘記頁面開始聲明使用數據表: 然後,我跟着你的解決方案,還有一個在這裏:http:///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

感謝您的迴應,首先。試過了,但問題與我的第二次編輯相同。 –