【问题标题】:output JSON array in a html table(a jsp page)在 html 表中输出 JSON 数组(一个 jsp 页面)
【发布时间】:2010-09-20 11:43:54
【问题描述】:

如题所示,如何在 JSP 页面的表格中正确输出 JSON 数组?

现在,每当我使用 <c:out value="${jsonArray}"/> 显示 JSON 数组对象时,它只是以 JSON 字符串显示它的全部内容,即 {name: hello, address: baker street },但我想要做的是以某种方式解析它并像这样适当地显示信息:

**name**      **address**
hello     baker street
spring    java
tim       sun 

在 JSTL 中可以吗?我是 JSTL 的新手。

package com.kc.models;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.SQLException;

import org.hibernate.Hibernate;

public class FileObject {

    private String filename;
    private String type;
    private double size;
    private Blob file;
    private int id;
    private String os;
    private String description;

    public FileObject() {

    }

    /**
     * Constructor for use in returning just the list of files without the
     * actual content
     * 
     * @param name
     * @param size
     * @param id
     * @param type
     */
    public FileObject(String name, double size, int id, String type) {
        this.filename = name;
        this.type = type;
        this.size = size;
        this.id = id;

    }

    /**
     * Constructor used to create a fileObject with all its properties assigned
     * 
     * @param name
     * @param size
     * @param id
     * @param type
     * @param file
     */
    public FileObject(String name, double size, int id, String type, Blob file,
            String os, String description) {
        this.filename = name;
        this.type = type;
        this.size = size;
        this.id = id;
        this.file = file;
        this.os = os;
        this.description = description;

    }

    public FileObject(String description){
        this.description = description;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFilename() {
        return filename;
    }

    public void setFilename(String fileName) {
        this.filename = fileName;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public double getSize() {
        return size;
    }

    public void setSize(double size) {
        this.size = size;
    }

    public Blob getFile() {
        return file;
    }

    public void setFile(Blob file) {
        this.file = file;
    }

    public String getOs() {
        return os;
    }

    public void setOs(String os) {
        this.os = os;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }


}



@Override
    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        // TODO call a method that returns a list of Mobile Apps.


        String fileType = ServletRequestUtils.getRequiredStringParameter(request, "fileType");


        //testAddingSomeFilesToDb();
        return new ModelAndView("" + "testJsonResponse", "jsonArray",
                getFileList(fileType) );

    } 

/**
 * Get file list from sql server based on type
 * @return file list in json
 */ 
private JSONArray getFileList(String type) {
    // TODO: Get request parameter that states what type of file extensions
    // the client wants to recieve

    ctx = new ClassPathXmlApplicationContext("zang-file-service.xml");
    FileHelper file = (FileHelper) ctx.getBean("fileHelper");

    return file.getFileList(type);
}




public JSONArray getFileList(String type) {

        return constructJsonArray(dbFileHelper.getFileList(type));
    }

    private JSONArray constructJsonArray(List<FileObject> fileList) {

        JSONArray mJsonArray = new JSONArray();
        JSONObject mJsonFileObject = new JSONObject();

        for (int i = 0; i < fileList.size(); i++) {
            mJsonFileObject.put("FileObject", fileList.get(i));
            System.out.println("File ID = " + fileList.get(i).getId());
            System.out.println("fileName = " + fileList.get(i).getFilename());
            System.out.println("type = " + fileList.get(i).getType());
            System.out.println("size = " + fileList.get(i).getSize());
            mJsonArray.add(mJsonFileObject);

        }

        return mJsonArray;
    }

这是我的jsp页面:

<%@ include file="/WEB-INF/jsp/include.jsp" %>
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Test</title>
        <script src="http://code.jquery.com/jquery-latest.min.js"></script>
        <script>
            var files = "${jsonArray}";
            $(document).ready(function() {
                var table = $('<table/>').appendTo($('#somediv'));
                $(files).each(function(i, file) {
                    $('<tr/>').appendTo(table)
                        .append($('<td/>').text(file.filename))
                        .append($('<td/>').text(file.id))
                        .append($('<td/>').text(file.type))
                        .append($('<td/>').text(file.size))
                        .append($('<td/>').text(file.os));
                });
            });
        </script>
    </head>
    <body>
        <div id="somediv"></div>
    </body>
</html>

编辑:这是我的 json 输出:

  var files = [{"FileObject":{"description":"","file":null,"filename":"ACG Simulator(firefox).jpg","id":6,"os":"","size":172,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"car.jpg","id":11,"os":"","size":152,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"contacts highlighted.jpg","id":13,"os":"","size":47,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"contacts highlighted2.jpg","id":14,"os":"","size":49,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"contacts options.jpg","id":15,"os":"","size":49,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"edit contact view.jpg","id":17,"os":"","size":52,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"fileObject.jpg","id":20,"os":"","size":30,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"groups.jpg","id":27,"os":"","size":31,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"inside contacts.jpg","id":31,"os":"","size":49,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"Music highlighted.jpg","id":37,"os":"","size":47,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"music options view.jpg","id":38,"os":"","size":46,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"music phone view.jpg","id":39,"os":"","size":51,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"music vault view.jpg","id":40,"os":"","size":48,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"nice.jpg","id":41,"os":"","size":225,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"photo highlighted.jpg","id":42,"os":"","size":47,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"photo options view.jpg","id":43,"os":"","size":48,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"photo preview view.jpg","id":44,"os":"","size":46,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"photos phone view.jpg","id":45,"os":"","size":51,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"photos vault view.jpg","id":46,"os":"","size":49,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"svn error.jpg","id":54,"os":"","size":35,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"Video Highlighted.jpg","id":55,"os":"","size":47,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"Videos options view.jpg","id":56,"os":"","size":47,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"videos phone view.jpg","id":57,"os":"","size":50,"type":"jpg"}},{"FileObject":{"description":"","file":null,"filename":"videos Vault view.jpg","id":58,"os":"","size":49,"type":"jpg"}}]

【问题讨论】:

    标签: java json jsp


    【解决方案1】:

    您的问题太模糊,无法给出合适的答案,所以我将涵盖所有可能的情况:

    1. 您将其作为 JavaScript 变量,如下所示:

      var persons = [
          { "name": "John Doe", "address": "Main Street 1" },
          { "name": "Jane Doe", "address": "Baker Street 1" },
          { "name": "Jack Doe", "address": "Church Street 1" }
      ];
      

      我建议使用jQuery 来创建一个HTML 表格。这是一个SSCCE,你可以复制'n'paste'n'运行它:

      <!DOCTYPE html>
      <html lang="en">
          <head>
              <title>Test</title>
              <script src="http://code.jquery.com/jquery-latest.min.js"></script>
              <script>
                  var persons = [
                      { "name": "John Doe", "address": "Main Street 1" },
                      { "name": "Jane Doe", "address": "Baker Street 1" },
                      { "name": "Jack Doe", "address": "Church Street 1" }
                  ];
                  $(document).ready(function() {
                      var table = $('<table/>').appendTo($('#somediv'));
                      $(persons).each(function(i, person) {
                          $('<tr/>').appendTo(table)
                              .append($('<td/>').text(person.name))
                              .append($('<td/>').text(person.address));
                      });
                  });
              </script>
          </head>
          <body>
              <div id="somediv"></div>
          </body>
      </html>
      
    2. 您将它作为 Java 字符串变量,如下所示:

      String jsonPersons = "["
              + "{ \"name\": \"John Doe\", \"address\": \"Main Street 1\" },"
              + "{ \"name\": \"Jane Doe\", \"address\": \"Baker Street 1\" },"
              + "{ \"name\": \"Jack Doe\", \"address\": \"Church Street 1\" }"
          + "]";
      

      然后我建议使用 JSON 解析器从中获取 List&lt;Person&gt;,例如 Google Gson

      List<Person> persons = new Gson().fromJson(jsonPersons, new TypeToken<List<Person>>() {}.getType());
      

      Person 类如下所示:

      public class Person {
          private String name;
          private String address;
          // Add or generate getters/setters.
      }
      

      让servlet把它放在请求范围内,然后转发给JSP显示,如下所示:

      request.setAttribute("persons", persons);
      request.getRequestDispatcher("/WEB-INF/persons.jsp").forward(request, response);
      

      在 JSP 中,使用 JSTL &lt;c:forEach&gt; 对其进行迭代:

      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
      ...
      <table>
          <c:forEach items="${persons}" var="person">
              <tr>
                  <td>${person.name}</td>
                  <td>${person.address}</td>
              </tr>
          </c:forEach>
      </table>
      
    3. 同2),你把它作为一个Java变量,但是你想通过JSP中的Ajax来获取它。然后创建一个 Servlet 类,在 doGet() 方法中执行以下操作:

      response.setCharacterEncoding("UTF-8");
      response.setContentType("application/json");
      response.getWriter().write(jsonPersons);
      

      并通过 jQuery Ajax 调用它,并带有与 1) 相同的回调。

      $(document).ready(function() {
          var table = $('<table/>').appendTo($('#somediv'));
          $.getJSON('url/to/servlet', function(persons) {
              persons.each(function(i, person) {
                  $('<tr/>').appendTo(table)
                      .append($('<td/>').text(person.name))
                      .append($('<td/>').text(person.address));
              });
          });
      });
      

    【讨论】:

    • 是的,我正在从 POJO 构造我的 json 数组字符串。原因是因为我有两个客户。一个想要它作为 json 字符串格式,而另一个(网站)想要它作为一个带有结果列表的表格。我会更新我的 OP。检查我的 POJO 类
    • 然后选择选项 3。使用 Gson 将 List&lt;Person&gt; 转换为 JSON,如 String json = new Gson().toJson(persons); 并将其写入 servlet 响应。在 JSP 页面中,只需使用 jQuery(或纯 Javascript)从中创建一个 HTML 表格。
    • 在浏览器中右键单击页面并选择查看源代码。 JSON 语法看起来有效吗?我敢打赌不是。至少,去掉那些双引号。
    • 酷好再次查看我的新编辑。这次展示了我的 json 输出的样子
    • 您以错误的方式访问 JSON(或 JSON 以错误的格式构造)。 JSON 数组包含具有属性 FileObject 的对象,该属性又包含另一个表示文件的对象。你需要用file.FileObject.xxx而不是file.xxx替换你的jQuery代码来访问文件属性。
    【解决方案2】:

    假设:

    jsonArray = [ {name: 'hello', address: 'baker street'},  ... ];
    

    一种方法是在 Javascript 代码中构造 html,如下所示:

     var myHTMLStr = '<table>';
     for(var i in jsonArray) {
     myHTMLStr+='<tr><td>' + jsonArray[i]['name'] + '</td><td>' + jsonArray[i]['address'] + '</td></tr>';
    
    }
    myHTMLStr+='</table>';
    

    现在显示 HTML 字符串:

    document.getElementById('tableOutput').innerHTML = myHTMLStr;
    

    【讨论】:

      猜你喜欢
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多