Struts2语言环境会话重写

时间:2011-07-01 12:28:10

标签: session java-ee struts2 rewrite locale

我可以在 Struts2 中重写会话属性 WW_TRANS_I18N_LOCALE 吗?我想在cookie中设置语言环境以备将来使用,因为默认会话的超时时间为30分钟,如果用户未使用该站点,则这对于语言环境来说是少量的。我试图根据cookie值设置WW_TRANS_I18N_LOCALE,但没有任何运气,价值保持不变。

我在这里发现了一个类似我的问题,但我的所有jsp都通过了动作https://stackoverflow.com/questions/5291271/struts-2-internationalisation-problem,这不是解决方案..

1 个答案:

答案 0 :(得分:1)

所以你想改变一个动作中的会话值?我不清楚最后一行,但只是实现SessionAware然后它应该是直截了当的。设置值的最佳位置可能是用户登录的位置(如果有的话)。

像...一样的东西。

import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;

public class MyAction extends ActionSupport implements SessionAware{
    Map<String, Object> session;

    @Override
    public String execute(){
        session.put("WW_TRANS_I18N_LOCALE", "fr");
        return SUCCESS;
    }

    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }
}

应该这样做。大多数其他范围都有识别界面,请参见本页顶部:http://struts.apache.org/2.0.11/struts2-core/apidocs/org/apache/struts2/interceptor/package-summary.html

修改: 考虑到这一点,我不建议使用cookie来存储语言首选项。但是如果你这样做...默认的i18n拦截器将检查是否存在名为“request_locale”的参数,并将会话上的值设置为该值。您不希望会话中存储值。但是,由于这是struts2默认处理这个问题的方法,你可以执行以下操作:

  • 创建自己的i18n拦截器,它是现有的i18n拦截器,但删除保存在会话中的语言数据(因此推送到会话中的值实际上只存在于请求持续时间内)。
  • 创建一个javascript函数,添加到每个页面(可能通过一些模板系统),在页面加载后查找所有锚标签和表单标签。在锚标签的情况下,将“request_local”参数添加到它在cookie中找到的值的末尾,并且它将为每个表单添加一个隐藏字段,该字段还将从cookie中设置“request_local”参数。
  • 我可能也会在每个页面上放置一个语言选择下拉列表,它会设置cookie值,然后重新加载当前页面。有关创建此类列表的想法(尽管下拉列表会比链接更好):Tiles2 Struts Switch Locale

有关i18n拦截器的信息:http://struts.apache.org/2.1.2/struts2-core/apidocs/com/opensymphony/xwork2/interceptor/I18nInterceptor.html

对于JS函数,因为我偏爱jQuery,所以我要从这个开始:http://plugins.jquery.com/project/jsper

或者这......

http://plugins.jquery.com/project/Cookie