English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

struts2のフローと関連する一連の知識コードの解析

1.クライアントがservletコンテナ(Tomcat)へのリクエストを初期化します;

2.このリクエストは一連のフィルタを通過し、その後FilterDispatcherが呼び出されます;

3.FilterDispatcherはActionMapperに尋ねて、このリクエストがアクションを呼び出すかどうかを決定します;

4.ActionMapperがアクションを呼び出すことを決定した場合、FilterDispatcherはリクエストの処理をActionProxyに委譲し、ActionProはConfigurationManagerに依頼してフレームワークの設定ファイルを確認し、呼び出す必要があるアクションクラスを見つけます。一般的にはstruts.xmlを読み取ります;

5.ActionProxyはActionInvocationのインスタンスを作成し、ActionInvocationインスタンスを使用して名前付きパターンで呼び出します。Actionの呼び出しの前後には、関連するインターセプタの呼び出しが行われます。

6.Actionが実行終了すると、ActionInvocationはstruts.xmlの設定に基づいて対応する返却結果を探します。

例えば以下のコード:

struts2取得した.actionリクエストに基づいて、どのビジネスロジックコンポーネントを呼び出すかを決定します;

struts2アプリケーション内のすべてのActionはstruts.xmlに定義されています;

struts2ユーザーリクエストを処理するActionインスタンスはユーザーが実装したビジネス制御クラスではなく、Actionエージェントです。ユーザーが実装したビジネス制御クラスはServletAPIに結びついていないため、ユーザーリクエストを処理することができません。

<html>
 <head>
  <title>SUCCESS</title>
 </head>
 <body>
  <form action="hello.action" method="post">
    USERNAME:<input type="text" name="name"></<br>
    PASSWORD:<input type="password" name="pass"></<br>
    <input type="submit" value="送信">
  </form>
 </body>
</html>

例えば上記のフォームのhello.action、このaction属性は通常のservletでもなく、動的JSPページでもありません。フォームがhello.actionに送信された場合、Struts2のFilterDispatcherが動作し、ユーザーリクエストが対応するActionに転送されます。

注意してください:Struts2 Actionはデフォルトですべての.actionで終わるリクエストをインターセプトします。フォームをActionに処理させる必要がある場合、フォームのaction属性を.actionの形式に設定する必要があります。

制御クラス

public class HelloAction {
	private String name;
	private String pass;
	public void setName(String name){
		this.name=name;
	}
	public void setPass(String pass){
		this.pass=pass;
	}
	public String execute(){
		if("陽".equals(name) && "1234".equals(pass)){
			return "成功";
		} else{}}
			return "error";
		}
	}
}

前の処理が完了した後は、ページの転送のみが実行され、ユーザーの状態が追跡されていません。ユーザーがログインした後、ユーザーのユーザー名をHTTPセッションの状態情報に追加する必要があります。

Httpsessionインスタンスにアクセスするために、struts2ActionContextクラスが提供されており、getSession()メソッドが提供されていますが、このメソッドの返り値はHttpSession()ではなくMap()です。しかし、Struts2のインターセプタがSession()とHttpSession()の切り替えを担当します。

セッション属性が設定されているかどうかを確認するために、成功した後の画面に以下のように設定できます

<html>
 <head>
  <base href="<%=basePath%>" rel="external nofollow" >
  <title>SUCCESS</title>
 </head>
 <body>
  ようこそ、${sessionScope.user}、ログインしました。
 </body>
</html>

JSPを使用して2.0表現文法でHTTPセッションのuser属性を出力します。

ActionツールクラスはActionSupportを統合しています

ActionSupportクラスはツールクラスであり、Actionインターフェースを実装しています。これに加えて、Validateablezインターフェースも実装しており、データ校验機能を提供しています。

入力データの校验機能を追加するために、Actionに重写的validateメソッドを追加します。

public void validate() {
	if(getName()==null || getName().trim().equals("")){
		addFieldError("name",getText("name.required"));
	}
	if(getPass()==null || getPass().trim().equals("")){
		addFieldError("pass", getText("pass.required"));
	}
}

システムのexecute()メソッドの前に実行される重写的validateメソッドに追加されたデータが校验エラーを含んでいる場合、ActionクラスのfieldErrorにデータ校验エラーが既に含まれていると、リクエストはinputロジックビューに転送されます。したがって、struts.xmlにinputロジックビュー名を追加して、ログインページに遷移させる必要があります。

このvalidateメソッドの欠点は、大量のvalidateメソッドの再書き込みが必要であるため、strutsを使用することができます。2の検証フレームワークで検証を行います。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
  "-//OpenSymphony Group//XWork Validator 1.0.3//EN"
  "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
<!--フォームのnameを確認-->
  <field name="name">
    <field-validator type="requiredstring">
      <message key="name.required">/>
    </field-validator>
  </field>
  <!--フォームのpassを確認-->
  <field name="pass">
    <field-validator type="requiredstring">
      <message key="pass.required">/>
    </field-validator>
  </field>
</validators>

まとめ

これで、この記事についてstrutsの2の流れや関連する知識コードの解説をすべて含む内容です。皆様の助けになることを願っています。興味を持たれた方、このサイトの他の関連テーマもご覧ください。不十分な点があれば、お気軽にコメントしてください。皆様のサポートに感謝します!

声明:この記事の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーによって自発的に貢献し、アップロードされた内容であり、このサイトは所有権を持ちません。また、人間による編集は行われておらず、関連する法的責任も負いません。著作権侵害を疑われる内容が見つかりましたら、以下のメールアドレスにご連絡ください:notice#oldtoolbag.com(メールの際は、#を@に変更してください)で通報し、関連する証拠を提供してください。一旦確認が取れましたら、このサイトは直ちに侵害を疑われる内容を削除します。

おすすめ