私はFreeMarkerを新しくしました。私は報告目的でHTMLファイルを作成しようとしています。
特定の$ {user}変数をオブジェクトに置き換えるなど、基本を理解できます。
問題:
以下のテンプレートを使用してHTMLテーブルを作成しようとしています。 ${summaryTable.rowData}
は、一連の<tr>
で置き換えられます。 1 trはオブジェクトの1インスタンスです。以下のコードを使用してこれを行うことはできません。代わりにループから最後のインスタンスのみを取得します。
私はここで何が欠けていますか?
以下の詳細をご覧ください。
テンプレート:
....
<thead>
<tr id="header">
<td><b>Module</b></font></td>
<td><b>Passed</b></font></td>
<td<b>Failed</b></font></td>
</tr>
</thead>
<tbody>
${summaryTable.rowData}
</tbody>
...
コード:
// Start Building HTML
Map<String, Object> root = new HashMap<String, Object>();
// Header variables
root.put("environment", envDir);
root.put("reportDateTimeStamp", dateDir);
// Summary Table
for (String module : getAllModules(rawResult)) {
SummaryTable summaryTable = new SummaryTable();
int modPassed = getModulePassFailCount(rawResult, module).get(GlobalUtil.reportLabelPassed);
int modFailed = getModulePassFailCount(rawResult, module).get(GlobalUtil.reportLabelFailed);
summaryTable.setRowData(
getSummaryData(module, Integer.toString(modPassed), Integer.toString(modFailed)));
root.put("summaryTable", summaryTable);
}
DetailsTable detailsTable = new DetailsTable();
detailsTable.setRowData(getDetailsData("MOD1", "TC01", "Description 01", "Passed", "00:00:00"));
root.put("detailsTable", detailsTable);
OutputStream outputStream = new FileOutputStream(htmlResultFile);
Writer out = new OutputStreamWriter(outputStream, charSet);
temp.process(root, out);
out.close();
setRowData()
は、単一の文字列を受け付ける - この場合、<tr>
の1つのインスタンスはmodule
当たり<td>
のN番号を含みます繰り返し。
モデル:
public static class SummaryTable {
private String rowData;
public String getRowData() {
return rowData;
}
public void setRowData(String rowData) {
this.rowData = rowData;
}
}
============= ========================================== =========
更新1:
以下のrrobbyの回答に基づいて、テンプレート、コード、モデルの両方を更新しました。
テンプレート:
....
<thead>
<tr id="header">
<td><b>Module</b></font></td>
<td><b>Passed</b></font></td>
<td<b>Failed</b></font></td>
</tr>
</thead>
<tbody>
<#list summaryTable as summaryTable.rowData>
<tr>
${summaryTable.rowData}
</tr>
</#list>
</tbody>
...
コード:
// Start Building HTML
Map<String, Object> root = new HashMap<String, Object>();
// Header variables
root.put("environment", envDir);
root.put("reportDateTimeStamp", dateDir);
// Summary Table
ArrayList<SummaryTable> summaryTable = new ArrayList<SummaryTable>();
for (String module : getAllModules(rawResult)) {
int modPassed = getModulePassFailCount(rawResult, module).get(GlobalUtil.reportLabelPassed);
int modFailed = getModulePassFailCount(rawResult, module).get(GlobalUtil.reportLabelFailed);
summaryTable.add(new SummaryTable(
getSummaryData(module, Integer.toString(modPassed), Integer.toString(modFailed))));
}
root.put("summaryTable", summaryTable);
DetailsTable detailsTable = new DetailsTable();
detailsTable.setRowData(getDetailsData("MOD1", "TC01", "Description 01", "Passed", "00:00:00"));
root.put("detailsTable", detailsTable);
OutputStream outputStream = new FileOutputStream(htmlResultFile);
Writer out = new OutputStreamWriter(outputStream, charSet);
temp.process(root, out);
out.close();
setRowData()
は、単一の文字列を受け付ける - この場合、<tr>
の1つのインスタンスはmodule
当たり<td>
のN番号を含みます繰り返し。
モデル:
public static class SummaryTable {
private String rowData;
public String getRowData() {
return rowData;
}
public void setRowData(String rowData) {
this.rowData = rowData;
}
public SummaryTable(String rowData) {
this.rowData = rowData;
}
}
は、私は例外を取得しています:
freemarker.core.ParseException: Syntax error in template "ReportTemplate.html" in line 100, column 63:
Encountered ".", but was expecting one of:
","
">"
ライン<#list summaryTable as summaryTable.rowData>
から100ポイントは、あなたが助けることができると思います。
あなたがリンクしている「クイックスタート」全体を通して読むことをお勧めします。この場合、http://freemarker.org/docs/dgui_quickstart_template.htmlの '#list'に関するセクションを参照してください。あなたが典型的なテンプレートで行うことは、$ {...} '#if /#elseif /#else'と'#list'(そしてそのコンパニオン、 '#items' /'#else'と '#sep ')。 – ddekany