首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用java的Datatable服务器端处理

使用java的Datatable服务器端处理
EN

Stack Overflow用户
提问于 2017-01-07 08:09:14
回答 1查看 1.1K关注 0票数 1

我在我的项目中使用。当我有更少的专栏的时候,它运行得很好。但是当它超过18列时,它拒绝应用排序和合并功能。我的当前代码如下所示。

代码语言:javascript
复制
<table id="testTable" class="display nowrap stripe row-border order-column" cellspacing="0" align="center">
<%
    try {
      String a="";
      String acode = "N/A";
      int atp1, id4;
      query = "SELECT * FROM IETMS;";
      stmt = conn.createStatement();
      rs = stmt.executeQuery(query);
      ResultSetMetaData rsmd=rs.getMetaData();
      int columns = rsmd.getColumnCount();
      if(rs.next()) {
%>
  <thead>
    <tr style="background-color: #3f91bd;color:white;">
      <% for (i=1; i<=columns-2; i++) {%>
        <th><%= rsmd.getColumnLabel(i) %></th>
      <%  } %>
    </tr>
  </thead>
  <tfoot>
    <tr class="header">
      <% for (i=1; i<=columns-2; i++) {%>
      <th><%= rsmd.getColumnLabel(i) %></th>
      <%  }%>
    </tr>
  </tfoot>
<%}%>
<tbody stye="border: 2px solid green;">
  <% while(rs.next()){ %>
    <tr class="clickable">
    <%
      for (i=1; i<=columns-2; i++) {
        if(rs.getObject(i) == null)
        {
          a = "N/A";
        } else
          a=""+rs.getObject(i);
    %>
    <td height="15"><%=a%></td>
    <% }%>
    </tr>
  <%}%>
</tbody>
<%
  } catch (Exception ex) {
      out.println(ex);
  }
%>
</table>

我想将实现移到一个使用JSON获取数据的新JSP页面上,但我并不完全熟悉JSON。我看过许多示例,但似乎JSON有一个固定的模式,我希望动态显示返回的任何数据。有什么方法可以用JSON做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-08 16:58:57

您可以动态显示JSON数据,但并不是那么容易,也不一定是表格式的。如果您确信它遵循特定的模式--例如,一个没有嵌套对象的对象数组,并且每个对象都具有相同的属性,那么我想您可以通过遍历数组,然后遍历对象中的每个属性,在列中显示每个属性,以表格格式显示它:

例如,这里有一段使用Jackson API的示例代码--它不是JSP,但在JSP中使用大致相同的逻辑并不难:

代码语言:javascript
复制
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;

public class JsonTable {
    JsonParser parser;

    public JsonTable( String filename ) {
        try {
            JsonFactory f = new JsonFactory();
            InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream( filename );
            parser = f.createParser(stream);
        } catch ( IOException e ) {
            e.printStackTrace();
        }
    }

    public String getTable() throws Exception {
        try {
            StringBuilder builder = new StringBuilder();
            List<String> header = new ArrayList<>();
            if ( parser.nextToken() != JsonToken.START_ARRAY ) {
                throw new RuntimeException( "Expected an array of objects." );
            }
            while ( parser.nextToken().equals(JsonToken.START_OBJECT) ) {
                buildRow(header,builder);
            }
            if ( parser.currentToken() != JsonToken.END_ARRAY ) {
                throw new RuntimeException( "Expected end of JSON array, got: " + parser.currentToken() );
            }
            wrapRowsWithTable(header,builder);
            return builder.toString();
        } finally {
            parser.close();
        }
    }

    private void wrapRowsWithTable( List<String> columns, StringBuilder builder ) {
        StringBuilder header = new StringBuilder();
        header.append("<table><thead><tr>");
        for( String column : columns ) {
            header.append("<th>" + column + "</th>");
        }
        header.append("</tr></thead>");
        builder.insert(0,header.toString());
        builder.append("</table>");
    }

    private void buildRow( List<String> header, StringBuilder builder ) throws IOException {
        int index = 0;
        builder.append("<tr>");
        while(parser.nextToken() != JsonToken.END_OBJECT)
        switch( parser.currentToken() ) {
        case FIELD_NAME:
            if( header.size() > index ) {
                if( !header.get(index).equals( parser.getCurrentName() ) ) {
                    throw new RuntimeException( "Expected field: " + header.get(index) + ", found: " + parser.getCurrentName() );
                }
            } else {
                header.add(parser.getCurrentName());
            }
            index++;
            break;
        case VALUE_NULL:
        case VALUE_TRUE:
        case VALUE_FALSE:
        case VALUE_NUMBER_INT:
        case VALUE_NUMBER_FLOAT:
        case VALUE_STRING:
            builder.append("<td>" + parser.getText() + "</td>");
            break;
        case VALUE_EMBEDDED_OBJECT:
            throw new RuntimeException( "Expecting an array of objects with no nested objects." );
        default:
            throw new RuntimeException( "Unexpected token: " + parser.currentToken() );
        }
    }
}

这要求字段遵循相同的顺序,这可能并不适用于每个场景--您可以对其进行增强,以允许字段以任何顺序出现和/或成为可选的。

如果数据是JSON对象树或其他类型的模式,那么将其表示为表并不容易。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41519308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档