2017-01-07 3 views
1

Ich benutze jquery Datentabelle für mein Projekt. Es funktioniert gut, wenn ich weniger Spalten habe. Wenn es jedoch über 18 Spalten hinausgeht, weigert es sich, Sortier- und Colvis-Funktionalitäten anzuwenden. Mein aktueller Code ist wie folgt.Datatable serverseitige Verarbeitung mit Java

<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> 

Ich möchte die Implementierung einer neuen JSP-Seite verschieben, die Daten unter Verwendung von JSON holt, aber ich bin nicht wirklich so vertraut mit JSON. Ich habe mir viele Beispiele angesehen, aber JSON scheint ein festes Schema zu haben, und ich möchte dynamisch anzeigen, welche Daten zurückgegeben werden. Gibt es eine Möglichkeit, dies mit JSON zu tun?

Antwort

1

Sie können JSON-Daten dynamisch anzeigen, aber es ist nicht so einfach und es ist nicht unbedingt tabellarischer Natur. Wenn Sie sicher sind, dass es einem bestimmten Muster folgt - sagen wir, ein Array von Objekten ohne verschachtelte Objekte und jedes Objekt hat die gleichen Eigenschaften, dann könnten Sie es in einem Tabellenformat anzeigen, indem Sie über das Array iterieren und dann über iterieren Jede der Eigenschaften in den Objekten, die jede Eigenschaft in einer Spalte anzeigen:

Hier ist ein Beispielcode mit der Jackson API zum Beispiel - es ist keine JSP, aber es ist nicht schwer, etwa die gleiche Logik in JSP zu verwenden :

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()); 
     } 
    } 
} 

Dies erwartet, dass die Felder in der gleichen Reihenfolge folgen, die für jedes Szenario könnte nicht funktionieren - Sie können es Felder in beliebiger Reihenfolge und/oder optional sein erscheinen lassen verbessern könnte.

Wenn die Daten eine JSON-Objektstruktur oder eine andere Art von Mustern sind, wird es nicht einfach sein, das als Tabelle darzustellen.

+0

Vielen Dank für die Antwort Mr.Geoffrey. Ich habe viele JSON-Beispiele überprüft. Aber alles, was ich bekomme, sind nur Unterstützungen, wenn die Person die gesuchten Spalten kennt. Es wäre toll, wenn Sie einen für die obige Situation geeigneten Beispielcode hätten? – techhunter

+0

Hat der Code geholfen? –

+0

ja. Vielen Dank. – techhunter

Verwandte Themen