2017-01-25 4 views
0

私は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; 
    } 
} 

出力:
実際:期待
Actual

Expected

============= ========================================== =========
更新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ポイントは、あなたが助けることができると思います。

+0

あなたがリンクしている「クイックスタート」全体を通して読むことをお勧めします。この場合、http://freemarker.org/docs/dgui_quickstart_template.htmlの '#list'に関するセクションを参照してください。あなたが典型的なテンプレートで行うことは、$ {...} '#if /#elseif /#else'と'#list'(そしてそのコンパニオン、 '#items' /'#else'と '#sep ')。 – ddekany

答えて

0

。 Rrobbyのヒントは助けられましたが、彼の答えは全く完全ではありません。

テンプレート(構文):

<tbody> 
     <#list yourObject as anyVariable> 
     <tr> 
      ${anyVariable.aPropertyOfYourObject} 
     </tr> 
     </#list> 
    </tbody> 

テンプレート(実績):

<tbody> 
     <#list summaryTable as summaryData> 
     <tr> 
      ${summaryData.rowData} 
     </tr> 
     </#list> 
    </tbody> 

コード:

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

モデル:

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

私が間違って#listディレクティブを使用していると私は、ループ内root.put("summaryTable", summaryTable);を配置する必要がありました。

変更後に正しい出力が得られました。助けてくれてくれてありがとう!

1

リストと表については、通常、アイテムをコレクションに入れて、<#list>タグを使って繰り返します(hereを参照)。例えば

:この作業を取得するために管理

<table> 
    <thead>...</thead> 
    <tbody> 
    <#list summaryTable as row> 
     <tr><td>${row.foo}</td><td>${row.bar}</td>...</tr> 
    </#list> 
    </tbody> 
</table> 
+0

チップをありがとう!テンプレートを修正して、いくつかのテストを実行するようにしています。私はそれを把握しようとしている間にコード部分の構文をレイアウトすることができれば本当に感謝します。あなたが与えたリンクはその部分を与えなかった。再度、感謝します! – iamkenos

+0

最近の変更で質問を更新しました。 PS:忍耐力に感謝します。文字通り数時間前にFreeMarkerを使い始めました。 – iamkenos

+0

リストタグの 'as'の後には、単に各行の値のプレースホルダとして機能する単純な変数名(' a.b'のようなものではない)を使うべきです。更新したテンプレートを '<#list summary table as row> $ {row}'に変更する必要があります。 – rrobby86

関連する問題