【问题标题】:struts2 i18ninterceptor return to same page or actionstruts2 i18ninterceptor 返回同一页面或操作
【发布时间】:2012-09-26 18:53:08
【问题描述】:

我为我的问题搜索了 2 小时,但仍然找不到任何解决方案。

我想做什么:

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

  1. 在 JSP 上使用 acutall URL/URI(如“ShowUser.action”)并使用另一个语言环境调用它 -> 找不到在 jsp 中使用参数获取完整 URL 或 URI 的方法。 URL 为我提供了来自磁贴的当前站点(即 /content/site/user.jsp),而 URI 则返回我的磁贴布局(即 /content/layout.jsp)。我试过 request.getRequestUrl() 和 request.getRequestURI()

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

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

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

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

所以,这行得通,但在我看来像是黑暗的一面?解决这个(如我所想的)“小”问题的正确解决方案是什么?感谢您的回答。

最好的问候托马斯:-)

【问题讨论】:

    标签: struts2 internationalization actioncontext


    【解决方案1】:

    我不确定您究竟想从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 中的值对于每个线程都是唯一的。

    您也可以借助 javascript 获取当前 URL。

    【讨论】:

    • 感谢您的回复,但这并不能解决我的问题。是的,使用 JavaScript 我可以获取当前 URL,但我避免在此站点上使用 JS。 ActionContext 的问题是,如果我在我的“LocalesAction”中,我就在错误的上下文中。我将在我的第一篇文章中向您展示我的解决方案。
    【解决方案2】:

    使用&lt;s:url&gt; 标记并将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 中)。

    【讨论】:

    • 就是这样 - 非常感谢,我是瞎子 :-) includeParams="all" 和空值可以解决问题。
    • 但是 struts.xml 中的正确配置是什么?我也有点迷失了这些东西......
    • @aloplop85:您不需要任何特殊的操作配置。如果您仍有问题,请查看更新和评论,如果没有,请投票:)。
    • 在索引页面中:localhost:8080/myApp/?request_locale=en 这不起作用。它需要在“?”之前有一个“.action”。切换语言。
    • @aloplop85:您如何获得无操作的网址?您应该从欢迎文件重定向到某些操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多