struts2 i18ninterceptor 返回同一页面或操作

标签 struts2 internationalization actioncontext

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

我想做的事:

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

  1. 在 JSP 上使用 acutall URL/URI(如“ShowUser.action”)并使用另一个语言环境调用它 -> 找不到带参数的 jsp 中获取完整 URL 或 URI 的方法。 URL 为我提供了图 block 中的当前站点(即/content/site/user.jsp),而 URI 返回了我的图 block 布局(即/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

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

最诚挚的问候托马斯:-)

最佳答案

使用<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 中)。

关于struts2 i18ninterceptor 返回同一页面或操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12749251/

相关文章:

java - Struts + JSP中为下拉创建Mysql SELECT语句的逻辑是什么?

java - 如何让struts2只在POST上验证

Java、Spring 国际化(I18N)不工作

php - 如何在 Symfony 2 的每个 URL 中设置 {locale}?

java - Struts 2 中带有 bean 值的自定义日志记录拦截器

select - Struts2 : How to show a tooltip for each dropdown option in a select tag?

java - 在 JBoss 7.1.1 中使用 EJB 3.1 调用 Struts 2 Action 时获得 Struts 报告

sql-server-2005 - 如何将亚美尼亚语字符串插入 SQL Server 数据库

java - Struts2 使用属性标记从 jsp 访问 ActionContext

properties - 如何以编程方式从 .properties 文件中获取 Struts2 值?