使用Spring WebFlow过渡刷新视图

时间:2010-10-28 10:12:38

标签: spring jsf internationalization spring-webflow

我正在尝试将本地化添加到我的Web应用程序中,该应用程序是使用Spring WebFlow和facelets构建的。我想增加对英语和法语的支持。我创建了两个messages_fr.properties和messages_en.properties文件。

我用于所有jsf页面的模板具有以下代码来定义消息包和两个在法语和英语之间切换的链接。

<f:loadBundle basename="messages" var="msg" />
...
<h:commandLink id="changeLocaleFr" action="changeLocale"
class="flag fr">
    <f:param name="ln" value="fr" />
</h:commandLink>
<h:commandLink id="changeLocaleEn" action="changeLocale"
class="flag en">
    <f:param name="ln" value="en" />
</h:commandLink>

我已经设置了一个会话本地解析器

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

和本地更改拦截器

<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="ln" />
</bean>

我添加到我的流程处理程序映射

<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
    <property name="flowRegistry" ref="flowRegistry" />
    <property name="interceptors">
        <list>
            <ref bean="localeChangeInterceptor"></ref>
        </list>
    </property>
    <property name="order" value="0" />
</bean>

在我的流程中,我有一个changeLocale的全局转换

<global-transitions>
    <transition on="changeLocale" />
</global-transitions>

这一切几乎都在发挥作用。当我单击其中一个链接时,区域设置会发生变化。但我没有立即看到更改,我必须手动刷新或导航到另一个视图,以使用新的语言重新呈现页面。如何在点击链接后立即显示更改?

1 个答案:

答案 0 :(得分:1)

我的猜测是,这与处理changeLocale操作时根本没有改变的JSF视图根有关。 在处理区域设置更改时尝试添加类似的代码:

FacesContext context = FacesContext.getCurrentInstance();
context.setViewRoot(context.getApplication().getViewHandler().createView(context, context.getViewRoot().getViewId()));

这样JSF就会被迫刷新所有组件的状态。