2017-05-16 312 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

感谢您的回应,首先。试过了,但问题与我的第二次编辑相同。 –