Struts 2ノート――2.Actionの実現、配置


アクションの実装
Struts 2ではactionがユーザ要求の処理を担当するため,アプリケーション全体のコントローラであり,アプリケーション全体のコアでもある.開発者にとって、actionクラスを大量に提供する必要があります.struts 1に比べてstruts 2の浸入性は低い.なぜなら、actionは親またはインタフェースを継承する必要がなく、通常のPOJOである(ただし、パラメータのないexecuteメソッドを含むべきである).struts 2は通常、http要求パラメータ(username、passwordなどのフォーム内のパラメータとして理解できる)を直接actionを使用してカプセル化する.を参照してください.したがって、対応するactionクラスでは、これらの属性を提供する必要があります.また、action内のインスタンス変数は、処理結果をカプセル化することもできます.次のページでsラベルのproperty属性を使用すると、結果を出力できます(より複雑なラベルを使用して複雑なインスタンス変数を出力することもできます).実際には、どのパッケージ要求、どのパッケージ処理結果を区別することはできません.
ActionインタフェースとActionSupportベースクラス
Actionクラスはクラスを継承する必要はなく、インタフェースを実装する必要はありませんが、Struts 2は、より仕様を開発するためにアクションインタフェースを提供します.このインタフェースは、5つの論理ビューの文字列定数とexecuteメソッドを定義します.このほか、Struts 2はActionインタフェースにActionSupport実装クラスを提供します.このような多くの方法が定義されており、一般的にははexecuteで、SUCCESSを返します.そのため、ActionSupportクラスを直接継承すると、開発が大幅に簡素化されます.
ActionサーブレットAPIへのアクセス
Struts 2のactionはservletと何の結合もないので、actionを単独でテストすることができます.しかし、servletのAPIにアクセスする必要がある場合があります.アクセスAPIとは、request、session、applicationを操作することです.これら3つはJSPの内蔵オブジェクトであり、servletは3つのインタフェースがそれらの3つを表しています.そのためservlet APIにアクセスすることは、操作ですこの3つの組み込みオブジェクトを作成します.Struts 2ではActionContextクラスで操作できます.まずActionContext.getContext()を使用してActionContextインスタンスを取得し、getApplication、getParameters、getSessionを使用してアプリケーションオブジェクト、requestオブジェクト、sessionオブジェクトを取得します.その後、getまたはputメソッドを使用してこれらのオブジェクトを操作します.(jspまたはservletのgetAttributeメソッドまたはsetAttributeメソッドに対応します).
//    ac  ,          Servlet API
	ActionContext ac=ActionContext.getContext();
		
//get      request         。ac    put get     request
	String password1=(String) ac.get("password");
	ac.put("newpassword", "123");
		
//  application session            Map       。
	String password2=(String)ac.getApplication().get("password");
	ac.getApplication().put("newpassword", "123");
		
	String password3=(String)ac.getSession().get("password");
	ac.getSession().put("newpassword", "123");

ActionサーブレットAPIへの直接アクセス
より直接的にアクセスするために、Struts 2は、サーブレットContextAware、サーブレットRequestAware、およびサーブレットResponseAwareのいくつかのインタフェースを提供する.これらのインタフェースのアクションを実現することで、対応するAPIに直接アクセスすることができる.例を挙げると、requestを得るためには、Actionにrequest変数を宣言してから、対応するインタフェースを実現し、インタフェースのパラメータをactionのrequest変に割り当てる量だけでいいです.
public class myaction extends ActionSupport implements ServletContextAware{
	
	private String password;
	private HttpServletResponse response;
	private HttpServletRequest request;
	private ServletContext context;
	
	@Override
	public void setServletContext(ServletContext arg0) {
		// TODO Auto-generated method stub
		this.context=arg0;
	}

サーブレットActionContextを使用したサーブレットへのアクセス API
サーブレットActionContextはツールクラスで、getPageContext、getRequest、getResponse、getServiceletContextなどの静的な方法があります.このアクセス方法は便利ですが、サーブレットと結合しているため、高レベルのデカップリングには不利です.
private HttpServletResponse response;
	private HttpServletRequest request;
	private ServletContext context;
	private PageContext pagecontext;
	
	@Override
	public String execute() throws Exception {
		
		//              
		response=ServletActionContext.getResponse();
		request=ServletActionContext.getRequest();
		context=ServletActionContext.getServletContext();
		pagecontext=ServletActionContext.getPageContext();

		return super.execute();
	}

アクションの設定
Actionクラスが実装されると、フレームワークのどのリクエストがどのActionに対応するかを示すため、struts.xmlで構成する必要があります.
パッケージとネーミングスペース
Struts 2では、action、result、interceptorを管理するためにパッケージを使用します.パッケージ要素ごとに1つのパッケージしか構成できません.パッケージのname属性は、パッケージを参照する一意の表示です.このアウトソーシングに加えて、複数の親パッケージのすべての構成を継承できます(一般的に定義したパッケージはstruts-defaultを継承します)..他のパケットを継承する場合は、extendsプロパティが別のパケットである必要があります.abstractで識別される継承のみに使用される抽象パケットもあります.
1つのWebアプリケーションに複数の名前の同じactionを含める必要があるため、同じactionの名前を省略するとともに、大規模なプロジェクトにおけるactionの重複問題を解決するために、ネーミングスペースの概念を導入した.同じネーミングスペースにおけるactionは重複できないが、異なるネーミングスペースは同じ名前を持つことができる.packageはactionを管理するために使用され、namespaceはをクリックしてアクションを区別します.ネーミングスペースはパッケージのプロパティです.namespaceは/で始まる必要があります.
Struts 2では、個別のActionのネーミングスペースの設定はサポートされていません.パッケージにnamespaceプロパティを指定することで、パッケージの下にあるすべてのActionに共通のネーミングスペースを指定します.パッケージを構成するときにnamespaceプロパティが指定されていない場合、パッケージの下にあるすべてのActionがデフォルトのパッケージスペースの下にあります.つまり、何も書かない場合は、namespaceが「」に相当します.あるパッケージがネーミングスペースを指定した場合、そのパッケージの下にあるすべてのAction処理のURLはネーミングスペース+Action名であるべきである.struts.xmlファイルがロードされるときは上から下の順であるため、親パッケージはサブパッケージの前にあるべきである.デフォルト処理クラスはActionSupportであり、処理結果はsuccessである.methodデフォルトもexecuteである.
<package name="cmaction" extends="struts-default" namespace="/loginrelated">
	<action name="rightuser" class="com.cm.example" method="execute" >
		<result name="success">/WEB-INF/aaa.jsp </result>
		<result name="error">/WEB-INF/error.jsp</result>
	</action>
</package>

ここでresultに対応するビューリソースは、/で始まる必要があります.
Actionの動的メソッド呼び出し
1つのフォームの2つのボタンに異なるaction処理(いずれもsubmitボタン)を使用する場合は、ボタンonclickのときにスクリプトを使用してformのactionプロパティを変更する必要があります.
onclickを使用してactionプロパティを変更する方法は、次のとおりです.
<script type="text/javascript" >
   function lalala(){
   
   targetForm=document.forms[0];
   targetForm.action="loginrelated/rightuser";}
   
   </script>
    
    <form action="loginrelated/rightadsgadsgadguseearr" method="post">
    <input type="submit" value="click me"  onclick="lalala()"/>
    </form>

ワイルドカード:ワイルドカードを使用すると、操作が簡略化され、action構成の数が大幅に減少します.1つの処理クラスに対して、1回だけ構成すればいいです.書き方は以下の通りです.
<action name="*lalala" class="com.cm.example" method="{1}">
	<result name="success">/WEB-INF/aaa.jsp </result>
</action>

{N}式はclass属性、method属性、result属性に使用できます.resultでは${attributeName}を使用してOGLL式でActionクラスの属性の値を参照することもできます.たとえば/${name}.jspです.
デフォルトactionとactionのデフォルト処理クラス
<package name="cmaction" extends="struts-default" namespace="/loginrelated">
    <default-action-ref name="default1"></default-action-ref>
    <default-class-ref class="com.cm.defaultaction"></default-class-ref>
	
	<action name="*lalala" class="com.cm.example" method="{1}">
		<result name="success">/WEB-INF/aaa.jsp </result>
	</action>
	
	<action name="default1" class="com.cm.defaultaction">
		<result>/WEB-INF/defaultpage.jsp</result>
	</action>
</package>

デフォルト処理クラスとデフォルトactionは2つの独立したもので、1つは処理クラスが見つからないときの処理方法であり、もう1つはactionの処理方法が見つからないことです.注意:defaultactionをデフォルトネーミングスペースに構成すると、すべてのリクエストのデフォルトactionとして使用できます.packageはstruts-defaultを継承しているため、デフォルトのaction
本文は“指先が軽く飛ぶ”ブログから出て、転載をお断りします!