2017-01-25 11 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>, содержащего N число <td> за module итерация.

Модель:

public static class SummaryTable { 
    private String rowData; 

    public String getRowData() { 
     return rowData; 
    } 

    public void setRowData(String rowData) { 
     this.rowData = rowData; 
    } 
} 

Выход:
Actual:
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>, содержащего N число <td> за module итерация.

Модель:

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: 
    "," 
    ">" 

линия 100 указуют на <#list summaryTable as summaryTable.rowData>

Надеется, что вы можете помочь.

+0

Я рекомендую прочитать весь «быстрый старт», который вы связали. В этом случае см. Раздел о '# list' в http://freemarker.org/docs/dgui_quickstart_template.html. Практически все, что вы делаете в типичных шаблонах, это '$ {...}' '# if/# elseif/# else' и' # list' (и его спутники, '# items' /' # else' и '#sep '). – ddekany

ответ

0

Успели получить эту работу. Кончик Рробби помог, но его ответ был не совсем таким.

шаблона (Синтаксис):

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

шаблона (Actual):

<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 summaryTable как строку> $ {row}'. – rrobby86

 Смежные вопросы

  • Нет связанных вопросов^_^