代码之家  ›  专栏  ›  技术社区  ›  Jono

在html表(jsp页面)中输出JSON数组

  •  2
  • Jono  · 技术社区  · 14 年前

    如标题所示,如何从jsp页面正确地在表中输出json数组?

    现在每当我使用 <c:out value="${jsonArray}"/> 但它只是用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"}}]
    
    2 回复  |  直到 11 年前
        1
  •  11
  •   BalusC    14 年前

    你的问题模棱两可,无法给出合适的答案,所以我将介绍所有可能的情况:

    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'粘贴'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<Person> 就这样,就像 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 <c:forEach> 要遍历它:

      <%@ 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));
              });
          });
      });
      
        2
  •  2
  •   Andreas    14 年前

    假设:

    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;