1

我在网上搜索了所有的答案,但找不到答案。我希望有人在处理同样的问题。

我正在开发基于 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?任何帮助表示赞赏。

干杯, 克莱比克

4

1 回答 1

1

我发现出了什么问题。我正在使用 Spring MVC。因此,有一条默认规则说,默认情况下-servlet.xml将加载所有配置文件。

在我的frontcontroller-servlet.xml我有import声明,其中包括 base 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注释发疯了)。

因此,我假设FreemarkerSpring(或 Spring 本身)的内部类发生了一些事情,并且存在两个模型(带有请求参数)。现在 - 当我使用我的问题中的代码时,一切都正确呈现。

于 2012-07-03T12:16:32.630 回答