我已经搜索了所有寻找答案但无法找到答案的Web。我希望有人在处理同样的问题。使用Spring MVC读取Freemarker模板中的RequestParameters
我正在开发基于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>
这很简单。我没有渲染布局/视图的问题。问题在于Spring Controller并将请求参数写入视图。我最简单的控制器操作如下:
@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导致的问题?任何帮助赞赏。
干杯, Chlebik
'$ {myCustomIdFromView!'默认'}'打印'默认'但'$ {myCustomIdFromView}'不会抛出异常?这是错误的...我希望Spring MVC不会像这样配置FreeMarker。另外,我相信'RequestParameters'指的是HTTP请求查询字符串和表单参数,而不是请求对象属性(我相信这些是Request.theAttributeName)。什么“我收到Freemarker的空值未定义”。“无论如何呢? – ddekany
我写得不是很清楚 - 我收到标准消息:'freemarker.core.InvalidReferenceException:表达式myCustomIdFromView未定义' – Chlebik
最后一个示例仍然没有意义。它是否打印'6666'?这会很奇怪(除非你有一个查询参数或称为'myCustomIdFromView'的表单字段)。即使如此,该示例可以简化为'$ {RequestParameters.myCustomIdFromView!''}'。 – ddekany