2

つまり、bestTutorialSite というインスタンス変数を持つアクション クラスがあります。この変数は、次のように JSP に渡すことができます。

<package name="tutorial1" namespace="/" extends="struts-default">
    <action name="getTutorial" class="org.tutorial.struts2.action.TutorialAction">
        <result name="success" type="redirectAction">
            <param name="actionName">getTutorialPage</param>
            <param name="namespace">/tutorials</param>
            <param name="message">${bestTutorialSite}</param>
        </result>
        <result name="error" type="redirectAction">
            <param name="actionName">getErrorPage</param>
            <param name="namespace">/tutorials</param>
            <param name="message">${bestTutorialSite}</param>
        </result>
    </action>
</package>

<package name="tutorial2" namespace="/tutorials" extends="struts-default">
    <action name="getTutorialPage">
        <result>/success.jsp</result>
    </action>
    <action name="getErrorPage">
        <result>/error.jsp</result>
    </action>
</package>

XML の方法を使用しても問題ありません。注釈付きのパラメーターには定数式が必要なため、注釈を使用してそれを行うにはどうすればよいですか (インスタンス変数 bestTutorialSite は定数式ではありません)。

詳細情報: success.jsp

<body>
  Success Page!!
<br/>
 <s:property value="$parameters['message']"/>
</body>
4

1 に答える 1

3
@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>

PersonInputorというクラスがない場合(最後に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}"})
})

前述のとおり、これは推奨されません。

于 2013-02-11T06:20:10.193 に答える