私は自分の問題について2時間グーグルで検索しましたが、それでも解決策を見つけることができませんでした。
私がやりたいこと:
私は国際的なアプリケーションにstruts2を使用しているので、多言語サポートが必要です。そのため、i18n-Interceptorは、通過するパラメーターが1つだけでロケールを変更することがわかりました(非常にクールです!)。ここで、アプリケーションの任意の時点でロケールを変更して、ユーザーが言語を変更し、元のページまたはアクションと同じページに転送されるようにします。これはそれほど簡単ではないようです。私はすでにグーグルで見つけた次のことを試しましたが、私にはうまくいきません:
JSPでacutallURL/ 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を解析するにはコードが多すぎます)
3番目のポイントは次のコードで作業することですが、私はより良い解決策を探しています:
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
だから、これは機能していますが、私にはダークサイドのように見えますか?この(私が思ったように)「小さな」問題を解決するための正しい解決策は何ですか?回答ありがとうございます。
よろしくトーマス:-)