4

ユーザーからいくつかのパラメーターを受け取るアクションがあります (日付など)。このアクションはさまざまなレポートを生成するため、さまざまな方法があります。すべてのメソッドの前に、これらのパラメーターを調整する (時刻を午前 0 時に設定する)必要があります。prepareパラメータがバインドされる前にメソッドが実行されます。それを可能にする他のインターセプターまたはその他の規則はありますか?

4

2 に答える 2

3

もう 1 つの方法 (今コーディングしている場合は安価であり、既にすべてをコーディングしている場合は高価です) は、実行する必要があるすべてのアクションを 1 つの Struts2 アクションでモジュール化することです。

次に、の代わりに をBaseReportAction使用して共有されるすべての一般的な属性とメソッドを含む のようなものがあり、パラメーターの調整とメソッドの一般的な操作を行います。protectedprivateexecute()

そして、BaseReportAction を拡張するレポートごとに 1 つのアクションとしましょう。

ExcelReportAction、PdfReportAction など...

また

MinimalReportAction、CompleteReportAction など...

またはまた

DailyReportAction、MonthlyReportAction など...

唯一の要件はsuper.execute();、すべての子アクションのexecute()メソッドの最初のステートメントとして使用することです。

このように、継承を利用して、多くのメソッドを持つ 1 つの巨大なアクションの代わりに、より小さくてクリーンな (最終的に複数のサブパッケージにパッケージ化された) アクションを多数持つことができます。

いくつかのレポートで使用されるすべてのユーティリティ メソッドは、それらのレポートでのみ使用でき、他のすべてのレポートでは使用できません (たとえば、PDF や XLS のものとしましょう)...

さまざまなアクションに対しても XML 検証を利用できます (レポートによって別のレポートとは異なる入力が必要になる場合があります)。

最後に、チューニング コードはスレッド セーフになります (アクションはスレッド セーフですが、インターセプターはそうではありません)。

しかし、前述のように、これはコード作成前の段階により適した実装の選択です (Web アプリケーションのサイズに応じて、リファクタリングがそれほど難しくなくても...)。

于 2012-11-21T11:19:43.733 に答える
2

使用<interceptor-ref name="paramsPrepareParamsStack"/>

<!-- An example of the params-prepare-params trick. This stack
    is exactly the same as the defaultStack, except that it
    includes one extra interceptor before the prepare interceptor:
    the params interceptor.

    This is useful for when you wish to apply parameters directly
     to an object that you wish to load externally (such as a DAO
     or database or service layer), but can't load that object
     until at least the ID parameter has been loaded. By loading
     the parameters twice, you can retrieve the object in the
     prepare() method, allowing the second params interceptor to
     apply the values on the object. -->

コンベンションプラグインを使用している場合は、アクションに適用します

@Action(value="action1", interceptorRefs=@InterceptorRef("paramsPrepareParamsStack"))
于 2012-11-21T10:47:06.673 に答える