@Results({
@Result(name = "success", type = "redirectAction", params = {"namespace", "/tutorials", "actionName", "getTutorialPage", "message", "${bestTutorialSite}"}),
@Result(name = "error", type = "redirectAction", params = {"namespace", "/tutorials", "actionName", "getErrorPage", "message", "${bestTutorialSite}"})
})
public class TutorialAction extends ActionSupport...
注: 依存関係として、struts2 規則プラグインが必要になります。さらなる例とリファレンスについては、http ://struts.apache.org/2.2.3/docs/convention-plugin.html#ConventionPlugin-Actionannotation を参照してください。
編集:コメントで提起されたアクション名の懸念への対処で。
規則では、ハイフンで区切られたアクション名を使用します。つまり、アクションをgetTutorial ではなくget-tutorialと呼びます。
アクションget-tutorialにはアクション クラスが含まれる場合があります。あなたのxmlによると、アクションクラスはルート名前空間にある必要があります。ただし、現在の名前空間はorg.tutorial.struts2.action.TutorialAction
デフォルトの名前空間にはありません。これは、規約がstruts2またはactionを含むパッケージを検索し、階層のさらに下にあるパッケージが struts2 パッケージとして解釈されるためです。
したがって、規則はorg.tutorial.struts2.action.TutorialAction
クラスを/action/tutorial
名前空間にあると解釈します。org.tutorial.myapp.action.GetTutorialAction
この問題を回避するには、パッケージ名を に変更する必要があります。
注: TutorialActionGet
に追加されたため、Struts はアクションを として検索します。/get-tutorial
ビューは、パッケージ名と同様のパターンに従います。現在のアクションでは、ビューを に配置する必要があります/WEB-INF/content/action/tutorial.jsp
(コンベンションでは、ファイル拡張子によってフリーマーカー ビューと速度ビューを識別することもできます)。また、結果の名前をビューに含めることもできます。たとえば/WEB-INF/content/action/tutorial-success.jsp
、/WEB-INF/content/action/tutorial-error.jsp
、 など/WEB-INF/content/action/tutorial-input.jsp
です。したがって、execute が「成功」を返す場合は前者を取得し、「エラー」を返す場合は後者を取得します。もちろん、クラス名は (Java の命名規則に従って) キャメル ケースですが、ビューはすべて小文字になり、単語の間にハイフンが表示されます。
非常に便利な手法は、すべての入力フォームを「*-input.jsp」として作成することです。たとえば、次のように定義されたアンカーを使用して、(アクション クラスをバイパスして) ビューに直接移動できます。
<s:a namespace="/employee" action="person-input">Go to Person Input</s:a>
PersonInput
orというクラスがない場合(最後にActionPersonInputAction
を配置する必要がないことを忘れないでください)、ビューはそのままレンダリングされ、フォームのビューは次のように Person アクションを指します。
フォームの検証が失敗した (入力が返された) 場合、Person アクションは最初に "person-input" を試行し、フォームに戻されます。これは非常に便利です。
規約を使用する場合、注釈の最大の必要性は次のとおりです。
- ビューの再利用
- アクションを実行した後、redirectAction を使用して別の場所に戻します。おそらく更新後のリストです。
- あまり一般的ではない: 別の結果タイプ (json、ストリーム) を使用する
そのため、 @Result および @Results アノテーションが最も一般的です。通常、@Action アノテーションは、慣習に逆らおうとするときに表示されますが、想定から逸脱する場合を除いて、アノテーションを記述する必要はないことを覚えておいてください。つまり、あなたは文字通り自分のために仕事をしているのです。
アクション アノテーションの良い使い方の 1 つは、同じクラスで複数のアクション メソッドを宣言することです (単一のエンティティに対する特定の crud 操作に役立つ場合があります)。私は個人的にはアクションごとに 1 つのクラス戦略を好みますが、このアクション アノテーションの使用法は評価できます。
「getTutorial」などの規則以外のアクションに名前を付けるには、次のようにします。
@Action(value="/getTutorial",
results={
@Result(name = "success", type = "redirectAction", params = {"namespace", "/tutorials", "actionName", "getTutorialPage", "message", "${bestTutorialSite}"}),
@Result(name = "error", type = "redirectAction", params = {"namespace", "/tutorials", "actionName", "getErrorPage", "message", "${bestTutorialSite}"})
})
前述のとおり、これは推奨されません。