gpt4 book ai didi

struts2 i18ninterceptor 返回同一页面或操作

转载 作者:行者123 更新时间:2023-12-02 16:36:03 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com