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>

とても簡単です。レイアウト/ビューのレンダリングに問題はありません。問題は、SpringControllerとリクエストパラメータのビューへの書き込みにあります。私の最も単純なコントローラーアクションは次のようなものです。

@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中には、 base を含むimportステートメントがありました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>

そして、これら 2 つのことを組み合わせた結果、標準の Spring Bean が二重に作成されました。Spring Security との統合を開始したときに出てきました - 突然アプリケーションをデプロイできなくなりました - 例外が存在する二重 Bean を指摘していました (@Autowire注釈が狂った)。

したがって、Spring のクラスの奥深くFreemarker(または Spring 自体) で何かが発生し、2 つのモデルが (要求パラメーターを使用して) 存在したと仮定します。現在、質問のコードを使用すると、すべてが正しくレンダリングされます。

于 2012-07-03T12:16:32.630 に答える