我创建了一个从属性文件中加载查询的应用程序,例如SELECT * FROM DATA。然后,每次在每行中加载所有这些数据。我们第一次采取id,name,phone,bday和division这样的行,并将其放入名为标题的列表中。然后我们将它自己的数据放入一个名为记录的列表中。在那之后,我们看过头条新闻,只是将我们的数据继续加载到我们的记录列表中。
当我们使用wicket为我们显示表中的数据时,结果如下: http://i.imgur.com/d0Gsnr2.png
如您所见,它只打印出包含所有数据的整行。根据头条新闻,我们希望所有数据都有单独的列。所以它应该类似于:
ID - NAME - PHONE - BDAY - DIVISION
123 - JOE - 10351053 - 20-12-2012 - EAST。
我们如何设法做到这一点?我们的代码如下:
public class DataHandlerImpl implements DataHandler {
private final DataService dataService = new DataService();
private final List<Object> records = new ArrayList<>();
@Override
public String getPropertyValue() {
Properties prop = new Properties();
String propFileName = "sqlQuery.properties";
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(propFileName);
loadInputStreamCatchIOException(prop, inputStream);
fileNotFoundException(inputStream, propFileName);
String result = prop.getProperty("sqlQuery");
return result;
}
@Override
public Data getKeysAndValues() {
String queryFromPropertyFile = getPropertyValue();
List<HashMap<String, Object>> sqlQuery = dataService.getSqlQuery(queryFromPropertyFile);
List<String> headlines = new ArrayList<>(sqlQuery.get(0).keySet());
Collections.reverse(headlines);
createListOfRecords(sqlQuery, headlines);
return new DataImpl(headlines, records);
}
@Override
public int numberOfRecords() {
return getKeysAndValues().getRecords().size();
}
private void loadInputStreamCatchIOException(Properties prop, InputStream inputStream) {
try {
prop.load(inputStream);
} catch (IOException ex) {
Logger.getLogger(DataHandlerImpl.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void fileNotFoundException(InputStream inputStream, String propFileName) {
if (inputStream == null) {
try {
throw new FileNotFoundException("property file '" + propFileName + "
' not found in the classpath");
} catch (FileNotFoundException ex) {
Logger.getLogger(DataHandlerImpl.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private void createListOfRecords(List<HashMap<String, Object>>
sqlQuery, List<String> headlines) {
for (HashMap<String, Object> values : sqlQuery) {
List<Object> newRow = new ArrayList<>();
for (String record : headlines) {
newRow.add(values.get(record));
}
records.add(newRow);
}
}
}
和
public class SimpleDataView extends SimpleDataViewPage {
IModel ldm;
public SimpleDataView() {
ldm = new LoadableDetachableModel<Data>() {
@Override
protected Data load() {
DataHandlerImpl dataHandler = new DataHandlerImpl();
return dataHandler.getKeysAndValues();
}
};
add(new Label("size", "Number of records: " + getData().getRecords().size()));
add(new Label("headlines", new Model<String>() {
@Override
public String getObject() {
return getData().getHeaders().toString();
}
}));
add(new Label("records", new Model<String>() {
@Override
public String getObject() {
return getData().getRecords().toString();
}
}));
}
}
和
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<head>
<meta charset="utf-8" />
<title>Data presentation</title>
</head>
<body>
<h3>Data</h3>
<h4 wicket:id="size"></h4>
<table border="1">
<tbody>
<thead>
<td><a wicket:id="headlines" href="#">NAME</a></td>
</thead>
<td wicket:id="records">
</td>
</tbody>
</table>
</body>
</html>
如果需要进一步的信息,请不要犹豫。
答案 0 :(得分:2)
您可以使用DataTable,如下例所示:Wicket DataTable
DataTable可以包含任何列数,这些列作为列列表传递给DataTable。您可以定义每个列显示的内容。