struts2 i18ninterceptor返回同一页面或动作

时间:2012-10-05 15:18:33

标签: struts2 internationalization actioncontext

我用我的问题搜索了2个小时,但仍然无法找到任何溶剂。

我想做什么:

我正在将struts2用于国际应用程序,因此我需要多语言支持。因此我发现i18n-Interceptor只用一个参数来改变语言环境(非常酷!)。现在,我想在应用程序的任何位置更改语言环境,以便用户可以更改语言并转发到他来自的同一页面或操作。这似乎并不那么容易。我已经尝试过在谷歌上发现的以下内容,但对我不起作用:

  1. 在JSP上使用acutall URL / URI(如“ShowUser.action”)并使用其他语言环境调用它 - >找不到带有参数的jsp中的完整URL或URI。 URL为我提供了tile中的当前站点(即/content/site/user.jsp),URI返回了我的tiles-layout(即/content/layout.jsp)。我已经尝试过request.getRequestUrl()和request.getRequestURI()

  2. 使用actionContext获取JSP的完整URL - >找不到..

  3. 在我的“ChangeLocale.action”中使用“request.getHeader(”referal“)并将其动态设置为struts.xml中的redirectAction - >工作但过多的代码用参数解析URL等。)

  4. 第三点是使用以下代码,但我正在寻找更好的解决方案:

    struts.xml中的相关部分

      <action name="Locale" class="de.smg.LocaleAction">
         <interceptor-ref name="i18n"/>
         <interceptor-ref name="basicStack"/>
         <result type="redirectAction">${forwardAction}</result>
      </action>
    

    LocaleAction.java:

    public class LocaleAction extends ActionSupport implements ServletRequestAware {
    
    private static final long serialVersionUID = 1L;
    private static final String FALL_BACK_ACTION = "ShowStartPage";
    
    private HttpServletRequest request;
    private String forwardAction = null;
    
    @Override
    public String execute() throws Exception {
        String referer = request.getHeader("referer");
        String action = FALL_BACK_ACTION;
    
        if (referer!=null) {        
            // WeberT: first cut off the protocol, server and port...
            referer = referer.substring(referer.lastIndexOf("/") + 1, referer.length());
    
            // WeberT: then cut of the .action part if available
            int dotPos = referer.indexOf(".");
    
            if (dotPos>0) {
                int qMarkPos = referer.indexOf("?");
                if (qMarkPos> 0 && dotPos < qMarkPos) {         
                    action = referer.substring(0, dotPos) + referer.substring(qMarkPos, referer.length());
                } else {
                    action = referer.substring(0, dotPos);                  
                }               
            }
            forwardAction = action;
        }
        return SUCCESS;
    }
    
    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;     
    }
    
    /**
     * @return the forwardAction
     */
    public String getForwardAction() {
        return forwardAction;
    }
     }  
    

    所以我来自行动:

    http://server:port/ShowUser.action?id=1
    

    在用户网站上我切换到另一种语言,我的LocaleAction将返回forwardAction:

    ShowUser?id=1
    

    所以,这是有效的,但在我看来像黑暗的一面?什么是解决这个问题的正确解决方案(我认为)“小”问题?谢谢你的回答。

    最好的问候托马斯: - )

2 个答案:

答案 0 :(得分:1)

使用<s:url>标记,includeParams属性设置为all,空value属性。

<s:url var="urlen" includeParams="all" value="">
  <s:param name="request_locale">en</s:param>
</s:url>
<s:a href="%{urlen}">English</s:a>

您不需要任何特殊操作配置,但i18n拦截器必须位于拦截器堆栈中(它已包含在defaultStack中)。

答案 1 :(得分:0)

我不确定您希望从ActionContext获得什么,但您可以从ActionContext找到的大部分信息都来自Object action=ActionContext.getContext().getActionInvocation().getAction(); ActionProxy actionProxy=ActionContext.getContext().getActionInvocation().getProxy(); String methodName=actionProxy.getMethod(); String context = actionProxy.getName(); String namespace= actionProxy.getNamespace(); ActionContext.getContext().getParameters() //parameters from the UI

ActionContext

因此,如果您看到几乎所有信息都需要您完成工作。ActionContext是执行操作的上下文。每个上下文基本上都是一个操作需要执行的对象的容器,如会话,参数,语言环境等。

关于ActionContext的最好的事情是本地线程,这意味着存储在{{1}}中的值对于每个线程都是唯一的。

另外,您也可以在javascript的帮助下获取当前网址。