2012-07-02 303 views
1

我已经搜索了所有寻找答案但无法找到答案的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

+0

'$ {myCustomIdFromView!'默认'}'打印'默认'但'$ {myCustomIdFromView}'不会抛出异常?这是错误的...我希望Spring MVC不会像这样配置FreeMarker。另外,我相信'RequestParameters'指的是HTTP请求查询字符串和表单参数,而不是请求对象属性(我相信这些是Request.theAttributeName)。什么“我收到Freemarker的空值未定义”。“无论如何呢? – ddekany

+0

我写得不是很清楚 - 我收到标准消息:'freemarker.core.InvalidReferenceException:表达式myCustomIdFromView未定义' – Chlebik

+0

最后一个示例仍然没有意义。它是否打印'6666'?这会很奇怪(除非你有一个查询参数或称为'myCustomIdFromView'的表单字段)。即使如此,该示例可以简化为'$ {RequestParameters.myCustomIdFromView!''}'。 – ddekany

回答

1

我发现了什么是错误的。我正在使用Spring MVC。因此默认规则是,所有-servlet.xml配置文件都将默认加载。

在我的frontcontroller-servlet.xml我有进口声明,其中包括基地applicationContext.xml。在这个文件中,我有另外3个导入(支持配置文件的碎片整理 - 配置为DB,控制器等)。

但在西澳的web.xml 提供什么:

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:applicationContext*</param-value> 
</context-param> 

而且这两个东西结合的结果是标准的Spring bean的双创作。当我开始与Spring Security集成时,它突然出现了 - 突然我的应用程序无法部署 - 并且例外情况指出存在双重bean(@Autowire注释变得疯狂)。因此,我假设Spring(或在Spring本身)中发生了类Freemarker类,并且存在两个模型(使用请求参数)。现在 - 当我使用我的问题中的代码时,一切都呈现正确。