3

私は自分の問題について2時間グーグルで検索しましたが、それでも解決策を見つけることができませんでした。

私がやりたいこと:

私は国際的なアプリケーションにstruts2を使用しているので、多言語サポートが必要です。そのため、i18n-Interceptorは、通過するパラメーターが1つだけでロケールを変更することがわかりました(非常にクールです!)。ここで、アプリケーションの任意の時点でロケールを変更して、ユーザーが言語を変更し、元のページまたはアクションと同じページに転送されるようにします。これはそれほど簡単ではないようです。私はすでにグーグルで見つけた次のことを試しましたが、私にはうまくいきません:

  1. JSPでacutallURL/ URI( "ShowUser.action"など)を使用し、これを別のロケールで呼び出します->パラメーターを使用してjspで完全なURLまたはURIを取得する方法が見つかりません。URLはタイル(つまり/content/site/user.jsp)から現在のサイトを提供し、URIは私のタイルレイアウト(つまり/content/layout.jsp)を返します。request.getRequestUrl()とrequest.getRequestURI()を試しました

  2. actionContextを使用して、JSPの完全なURLを取得します->方法が見つかりません。

  3. 「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

だから、これは機能していますが、私にはダークサイドのように見えますか?この(私が思ったように)「小さな」問題を解決するための正しい解決策は何ですか?回答ありがとうございます。

よろしくトーマス:-)

4

2 に答える 2

1

属性が空の属性に設定された<s:url>タグを使用します。includeParamsallvalue

<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)。

于 2012-10-06T08:28:38.900 に答える
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スレッドごとに一意であることを意味します。

または、javascriptを使用して現在のURLを取得することもできます。

于 2012-10-06T03:41:31.323 に答える