3

私は、ユーザーが使用するアカウントを選択し、その後クリックするすべての URL がそのアカウントを参照する webapp に取り組んでいます。現在、アクティブなアカウントはセッションに保存されていますが、それはユーザーのブックマークに含まれていないことを意味し、ユーザーのセッションがタイムアウトすると失われ、ユーザーがリンクを共有すると関連するアカウントが含まれません...

(かなり大きく、まだ成長している) webapp のすべての URL に手動でaccountID追加せずに、すべての URL に含める方法はありますか?

1 つのアプローチは、それをパスの最初の部分にすることです。したがって、すべての URL は次のようになります。

  • /123/discussions/view.do
  • /123/account/edit.do

など、 はどこに123ありますかaccountID

すべてのパスが相対パスであれば、問題なく動作します。しかし、この種のアプローチを Struts 名前空間とうまく連携させる方法がわかりません。

通常、Struts2 taglibs によって生成されるすべてのパスは で始まり、名前空間が一致/するまでアクション ワイルドカードの一致も開始されません。

名前空間部分の後accountIDのパスでどうにかして取得できれば、アクション ワイルドカードを使用して適切なアクションを実行できると思いますが、最初に URL に ID を取得することが難しい部分です。

<s:a>最善の解決策は、 、<s:form>、およびのカスタム バージョンを作成することかもしれません<s:url>が、それがどれほど簡単かはわかりません。

重要

これらの URL を にマップする方法のみに対処するいくつかの回答がありますAction

この問題の難しい部分は、実際にはaccountID、アプリケーション全体で各 URL に手動で追加することなく、すべての URL とフォーム パスに を取得する方法です。

現在、唯一の方法は、URL とフォーム用の Struts JSP タグのカスタム バージョンを作成することだと思われます。したがって、それを行う方法に関する指針は役に立ちます。

4

2 に答える 2

0

ワイルドカード マッピングの名前空間でパラメーターを使用するという選択を検討する必要があります。

Struts 2.1+ から名前空間パターンをリクエスト パラメータとして抽出し、アクションにバインドできます。この機能を有効にするには、次の定数を に設定しますstruts.xml

<constant name="struts.patternMatcher" value="namedVariable"/>

これにより、名前空間の定義には{PARAM_NAME}、リクエスト URL に対して評価され、パラメーターとして抽出されるパターンを含めることができます。次に例を示します。

@Namespace{"/users/{userID}");
public class DetailsAction exends ActionSupport {
 private Long userID;
 public void setUserID(Long userID) {...}
}

2.1+ より前の Struts2 バージョンを実行している場合は、最新バージョンにアップグレードする必要があります。

回避策として、これをUrlRewriteFilterで行うことができます。

コード例については、この回答を確認することもできます。

于 2013-01-02T11:18:54.217 に答える
0

高度なワイルドカード マッピングを確認してください

次のようにアクションを定義する必要があります:/{accountId}/discussion/view.do/
ここに例を示します:

于 2013-01-02T14:31:47.630 に答える