我为我的问题搜索了 2 个小时,但仍然找不到任何解决方案。
我想做的事:
我将 struts2 用于国际应用程序,所以我需要多语言支持。因此,我发现 i18n-Interceptor 只需通过一个参数即可更改语言环境(非常酷!)。现在我想在我的应用程序中的任何时候更改语言环境,以便用户可以更改语言并被转发到他来自的同一页面或操作。这似乎并不容易。我已经尝试了以下在谷歌上找到的东西,但对我不起作用:
使用 JSP 上的 acutall URL/URI(如“ShowUser.action”)并使用另一个语言环境调用它 -> 无法找到在 jsp 中使用参数获取完整 URL 或 URI。URL 为我提供了来自磁贴的当前站点(即 /content/site/user.jsp),而 URI 则返回我的磁贴布局(即 /content/layout.jsp)。我试过 request.getRequestUrl() 和 request.getRequestURI()
使用 actionContext 获取 JSP 的完整 URL -> 找不到..
在我的 "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
所以,这行得通,但在我看来像黑暗的一面?解决这个(如我所想的)“小”问题的正确解决方案是什么?感谢您的回答。
最好的问候托马斯:-)