3

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

我想做的事:

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

  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

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

最好的问候托马斯:-)

4

2 回答 2

1

使用属性设置为和空属性的<s:url>标签。includeParamsallvalue

<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.

于 2012-10-06T08:28:38.900 回答
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每个线程中的值是唯一的。

或者,您也可以在 javascript 的帮助下获取当前 URL。

于 2012-10-06T03:41:31.323 回答