Может ли FTL изменить объект запроса, установив атрибут?

Я знаю, что FTL — это чисто механизм рендеринга, и это должно быть сделано в контроллере, но в моем сценарии мне нужно предоставить несколько представлений одних и тех же данных.

Я могу легко написать FTL, который отображает XML, а затем преобразуется в JSON, если это необходимо, с помощью специального фильтра. Однако у нас есть тонны FTL, чтобы сделать. Модель данных будет универсальной. Хотя подход XML является вариантом, я не хотел бы повторять снова и снова одни и те же элементы XML (разные члены команды, пишущие XML-элементы ручной работы, являются рецептом ошибок, мы должны быть уверены, что разметка одинакова и т. д.)

Однако мне было интересно, могу ли я просто заполнить объект в моем FTL

// Предположим, что FreMarkerResolver представил мою выходную метамодель как часть модели someObject.addRecords(Records)

// здесь немного логики request.setAttribute("data",someObject);

Итак, мой фильтр сервлета просто преобразует объект данных в JSON, xml, YAML или во что угодно.

Я где-то читал, что, например, сессия не может быть изменена из FTL, но как насчет запроса? Можем ли мы хотя бы установить новый атрибут?

Спасибо


person mahou5x    schedule 17.11.2012    source источник


Ответы (1)


Сам FreeMarker ничего не знает о сервлетах или HTTP. Даже когда вы можете просто прочитать объекты запроса или сеанса, это уже делает платформа веб-приложений более высокого уровня. Это полностью зависит от Web Application Framework, если и как вы видите эти объекты из шаблонов, и поэтому от него зависит, есть ли методы для их изменения. Теперь я предполагаю, что в вашем случае их нет.

Вы можете создать TemplateDirectiveModel, который инкапсулирует Request и делать с ним то, что вы хотите, и поместить его в модель данных, скажем, с именем storeInRequest, чтобы вы могли сделать что-то вроде <@storeInRequest data=someObject /> в шаблоне. Или вы можете придумать что-то еще, что лучше выражает то, что вы хотите от этого приложения. Дело в том, что, поскольку TemplateDirectiveModel реализован на Java, у вас есть возможность делать что угодно внутри него. (Точно так же вы можете реализовать функциональные вещи с TemplateMethodModelEx, но если вам нужен побочный эффект вместо возвращаемого значения, тогда TemplateDirectiveModel лучше. Плюс у него есть именованные параметры...)

person ddekany    schedule 17.11.2012