Я искал весь Интернет в поисках ответа, но не мог его найти. Я надеюсь, что кто-то имел дело с такой же проблемой.
Я разрабатываю приложение на основе Spring MVC (3.1) и Freemarker (2.3.16). Моя конфигурация Freemarker выглядит так:
<!-- FreeMarker parsing -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF" />
<property name="freemarkerSettings">
<props>
<prop key="default_encoding">UTF-8</prop>
<prop key="output_encoding">UTF-8</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="true" />
<property name="prefix" value="/views/" />
<property name="suffix" value=".ftl" />
<property name="requestContextAttribute" value="rc"></property>
<!-- if you want to use the Spring FreeMarker macros, set this property to true -->
<property name="exposeSpringMacroHelpers" value="true" />
<property name="contentType" value="text/html;charset=UTF-8"></property>
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
</bean>
Это довольно просто. У меня нет проблем с рендерингом layout/views. Проблема связана с контроллером Spring и записью параметров запроса. Мое простейшее возможное действие контроллера выглядит так:
@RequestMapping(value={"/simplest/action","/simplest"}, method=RequestMethod.GET)
@Transactional
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ModelAndView mv = new ModelAndView("/simplest/action");
mv.addObject("myCustomIdFromView", "66666" );
return mv;
}
Представление отрисовано успешно. В этом представлении я использую такую конструкцию:
<input type="hidden" name="myCustomIdFromView" id="myCustomIdFromView" value="${myCustomIdFromView}" />
Но с такой конструкцией Freemarker не представляет никакой ценности. Если я изменю свой ввод на:
<input type="hidden" name="myCustomIdFromView" id="myCustomIdFromView" value="${myCustomIdFromView!'default'}" />
Тогда «по умолчанию» отображается правильно. Поэтому я переключился на RequestParameters. И еще одна странность. С конструкциями:
{$RequestParameters.myCustomIdFromView}
{$RequestParameters['myCustomIdFromView']}
Я получаю пустые значения Freemarker 'undefined'.
Я наконец пришел к такому решению.
<#assign myCustomIdFromView = '' />
<#list RequestParameters?keys as key>
<#if key == 'myCustomIdFromView'>
<#assign myCustomIdFromView = RequestParameters[key] />
${myCustomIdFromView}
</#if>
</#list>
И ЭТО РАБОТАЕТ! Может ли кто-нибудь сказать мне, почему у меня проблемы с такой простой вещью, как передача аргумента в ModelAndView и его рендеринг в шаблоне? Значения (как вы можете видеть) находятся в параметрах модели/запроса, но именно Freemarker вызывает проблему? Любая помощь приветствуется.
С уважением, Хлебик
${myCustomIdFromView!'default'}
печатаетdefault
, а${myCustomIdFromView}
не генерирует исключение? Это так неправильно... Я надеюсь, что Spring MVC не настраивает FreeMarker таким образом. Кроме того, я полагаю, чтоRequestParameters
относится к строке запроса HTTP и параметрам формы, а не к атрибутам объекта запроса (я полагаю, что этоRequest.theAttributeName
). Что я получаю пустые значения Freemarker 'undefined'. в смысле все-таки? - person ddekany   schedule 02.07.20126666
? Это было бы странно (если только у вас нет параметра запроса или поля формы с именемmyCustomIdFromView
). Даже в этом случае пример можно было бы упростить до${RequestParameters.myCustomIdFromView!''}
. - person ddekany   schedule 02.07.2012<#list .data_model?keys as k>${k},</#list>
? - person ddekany   schedule 02.07.2012${RequestParameters.myCustomIdFromView}
вообще работает (так ли это?), не знаю, может у него есть откат к модели. Что бы ни. Что я знаю, так это то, что если.data_model
действительно содержитmyCustomIdFromView
, то единственный способ, которым${myCustomIdFromView}
потерпит неудачу, - это если его значение равноnull
(проверьте с${.data_model.myCustomIdFromView!'null'}
), или если где-то что-то присвоитnull
другой переменнойmyCustomIdFromView
, которая находится в текущее пространство имен FreeMarker или является локальной переменной FreeMarker. - person ddekany   schedule 02.07.2012