- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Google 上搜索了 2 个小时来解决我的问题,但仍然找不到任何解决方案。
我想做的事:
我正在将 struts2 用于国际应用程序,因此我需要多语言支持。因此,我找到了 i18n-Interceptor 来更改语言环境,只需要传递一个参数(非常酷!)。现在我想在应用程序中的任何位置更改区域设置,以便用户可以更改语言并转发到他来自的相同页面或操作。这似乎并不那么容易。我已经尝试过在谷歌上找到的以下内容,但对我不起作用:
在 JSP 上使用 acutall URL/URI(如“ShowUser.action”)并使用另一个语言环境调用它 -> 找不到带参数的 jsp 中获取完整 URL 或 URI 的方法。 URL 为我提供了图 block 中的当前站点(即/content/site/user.jsp),而 URI 返回了我的图 block 布局(即/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
所以,这是有效的,但在我看来像是黑暗面?解决这个(正如我所想的)“小”问题的正确解决方案是什么?感谢您的回答。
最诚挚的问候托马斯:-)
最佳答案
使用<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/
我是一名优秀的程序员,十分优秀!