我用我的问题搜索了2个小时,但仍然无法找到任何溶剂。
我想做什么:
我正在将struts2用于国际应用程序,因此我需要多语言支持。因此我发现i18n-Interceptor只用一个参数来改变语言环境(非常酷!)。现在,我想在应用程序的任何位置更改语言环境,以便用户可以更改语言并转发到他来自的同一页面或操作。这似乎并不那么容易。我已经尝试过在谷歌上发现的以下内容,但对我不起作用:
在JSP上使用acutall URL / URI(如“ShowUser.action”)并使用其他语言环境调用它 - >找不到带有参数的jsp中的完整URL或URI。 URL为我提供了tile中的当前站点(即/content/site/user.jsp),URI返回了我的tiles-layout(即/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
所以,这是有效的,但在我看来像黑暗的一面?什么是解决这个问题的正确解决方案(我认为)“小”问题?谢谢你的回答。
最好的问候托马斯: - )
答案 0 :(得分: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
中)。
答案 1 :(得分: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
的最好的事情是本地线程,这意味着存储在{{1}}中的值对于每个线程都是唯一的。
另外,您也可以在javascript的帮助下获取当前网址。