我在我的项目中使用。当我有更少的专栏的时候,它运行得很好。但是当它超过18列时,它拒绝应用排序和合并功能。我的当前代码如下所示。
<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做到这一点吗?
发布于 2017-01-08 16:58:57
您可以动态显示JSON数据,但并不是那么容易,也不一定是表格式的。如果您确信它遵循特定的模式--例如,一个没有嵌套对象的对象数组,并且每个对象都具有相同的属性,那么我想您可以通过遍历数组,然后遍历对象中的每个属性,在列中显示每个属性,以表格格式显示它:
例如,这里有一段使用Jackson API的示例代码--它不是JSP,但在JSP中使用大致相同的逻辑并不难:
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对象树或其他类型的模式,那么将其表示为表并不容易。
https://stackoverflow.com/questions/41519308
复制相似问题