ユーザーからいくつかのパラメーターを受け取るアクションがあります (日付など)。このアクションはさまざまなレポートを生成するため、さまざまな方法があります。すべてのメソッドの前に、これらのパラメーターを調整する (時刻を午前 0 時に設定する)必要があります。prepare
パラメータがバインドされる前にメソッドが実行されます。それを可能にする他のインターセプターまたはその他の規則はありますか?
2 に答える
もう 1 つの方法 (今コーディングしている場合は安価であり、既にすべてをコーディングしている場合は高価です) は、実行する必要があるすべてのアクションを 1 つの Struts2 アクションでモジュール化することです。
次に、の代わりに をBaseReportAction
使用して共有されるすべての一般的な属性とメソッドを含む のようなものがあり、パラメーターの調整とメソッドの一般的な操作を行います。protected
private
execute()
そして、BaseReportAction を拡張するレポートごとに 1 つのアクションとしましょう。
ExcelReportAction、PdfReportAction など...
また
MinimalReportAction、CompleteReportAction など...
またはまた
DailyReportAction、MonthlyReportAction など...
唯一の要件はsuper.execute();
、すべての子アクションのexecute()
メソッドの最初のステートメントとして使用することです。
このように、継承を利用して、多くのメソッドを持つ 1 つの巨大なアクションの代わりに、より小さくてクリーンな (最終的に複数のサブパッケージにパッケージ化された) アクションを多数持つことができます。
いくつかのレポートで使用されるすべてのユーティリティ メソッドは、それらのレポートでのみ使用でき、他のすべてのレポートでは使用できません (たとえば、PDF や XLS のものとしましょう)...
さまざまなアクションに対しても XML 検証を利用できます (レポートによって別のレポートとは異なる入力が必要になる場合があります)。
最後に、チューニング コードはスレッド セーフになります (アクションはスレッド セーフですが、インターセプターはそうではありません)。
しかし、前述のように、これはコード作成前の段階により適した実装の選択です (Web アプリケーションのサイズに応じて、リファクタリングがそれほど難しくなくても...)。
使用<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"))