【问题标题】:jQuery DataTable + Spring MVC + JSP + JsonjQuery 数据表 + Spring MVC + JSP + Json
【发布时间】:2017-10-15 04:36:53
【问题描述】:

我在我的网络应用程序中以 html 表的形式显示 json 响应时遇到了一些问题。

我使用 Spring boot、Bootstrap、JSP 进行视图,使用 jQuery DataTable 以表格形式显示数据。

数据处理是正确的:我有一个导航栏,所以我点击这个,显示一个表格来查询一个数据库,选择参数并点击“搜索”。 在此之后,在主页的右侧 div 中(我们不想更改页面,而只是重新加载主页的 div)我可以正确地看到标题表(在单击搜索按钮之前隐藏)并且如果我单击 ctrl+在 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 类中定义的方法即可从数据库中获取防火墙列表及其数据。

我做错了什么?

编辑:如被问及,这是我在点击 ctrl+shifr+k 后可以在 firefox 上看到的 Json 响应的片段:

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>

现在,当我启动我的应用程序时,我收到以下消息:DataTables 警告:表 id=firewalldata - Ajax 错误。有关此错误的更多信息,请参阅http://datatables.net/tn/7

当我检查时,我在 /getfirewall.jsp 上出现 404 错误;然后,当我尝试使用搜索表单时,我只能看到 1 行,带有“正在加载”和“显示 0 到 0 个条目,共 0 个条目”。

Edit3:我正在继续纠正这个问题。问题仍然存在,但我有新的分析:因为我在 /getfirewall.json 上遇到了 4o4 错误,我试图在我的栏中输入数字,但我有一个空白页;如果我分析它,我可以确定身体是空的。但是,如果我回到主页,在提交表单后,我在响应部分中会看到格式良好的 Json 格式的数据。

我不明白的是两件事:

1) 为什么页面 /getfirewall.json 是空的,没有数据,但是如果我在应用程序页面中提交表单,我可以得到 json 响应?

2) 当我打开浏览器,启动应用程序后,我得到了错误,我得到了错误。但为什么?如果我必须在提交表单后获取数据,为什么我的应用程序会立即搜索它们?

编辑 4,2017 年 5 月 19 日

好的,经过审核,这是我的实际代码:

<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 问题;我添加了处理行,因为没有它我得到一个“未找到数据”错误。

其实代码还不完善;提交搜索后,我得到了“找不到匹配的错误”。

最终编辑。

在与一些同事交谈后,我解决了这个问题。问题是“标准”语法不足以为我的页面建模,主要用于在上传 div 的同一页面上进行重定向。我把代码放在这里,希望可以帮助其他程序员解决我同样的问题。

首先,我在 jquery Datatable 页面上的 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>

【问题讨论】:

  • 你能分享你从控制器接收到的 JSON 吗?

标签: javascript jquery json spring jsp


【解决方案1】:

请试试这个

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

【讨论】:

  • 首先感谢您的回复。试过了,但问题和我的第二次编辑一样。
【解决方案2】:

您应该尝试使用类似问题 (https://stackoverflow.com/a/33367053/5789827) 的答案中所示的控制器路径

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

【讨论】:

  • 感谢您的回答。我已经完成了,但问题仍然存在;我认为,从我对 DataTable 的无知来看,问题在于如何将数据提供给函数。在“ajax”参数中,我放置了与控制器相同的路径;但实际上,当我定义“列”时,“数据”并未在其他地方定义。我应该在某个代码点中定义和初始化数据吗?
  • 我已阅读您的编辑,再次感谢。首先,我忘记了在页面开头声明使用数据表: 然后,我遵循了您的解决方案以及此处的解决方案:@987654322 @但他们两个我仍然有问题。可能是我忘记声明或初始化的东西?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 2014-10-14
  • 2011-02-02
  • 1970-01-01
相关资源
最近更新 更多