Struts 2
(最高の MVC フレームワークの 1 つ) が典型的なユーザー登録を処理する方法を次に示します。
Registration Page --Submit-->
Filter Dispatcher (Controller) --Struts-->
Interceptor --Stack--> Validator --Passed-->
Action (Model)
--Invokes--> Service/DAO Layer --Persists--> Database
Result <--returns-- Action
JSP (View) (selected based on result)
Interceptor (any post-processing)
Registration Success HTML
Servlets
実際にはコントローラーを作成しないのとは異なります。を使用して宣言的にフレームワークを構成するだけStruts.xml
で、MVC フロー全体が構成どおりに調整されます。
はController
Interceptor を介して検証を実行し、データベースに永続化するために事前入力および検証済みのデータ オブジェクトをモデルに渡します。
public class UserRegistrationAction {
private User user = new User();
public User getModel() { // Struts Callback
return user; // automatically gets populated with validated values
}
// This will seem incorrect to someone used to Spring's setter injection but
// Struts injects in reverse; pulls the model onto a ValueStack to inject properties
public String execute() {
// already validated; simply persist
UserRegistrationService.getInstance().persist(getUser());
return Action.SUCCESS;
}
...
}
はい、コントローラーに検証を実装することは正しいです。
ただし、そうは言っても、データの処理は常にモデル自体で行う必要があります。Facebook の友達リストまたは GMail の連絡先リストをインポートするかどうかをユーザーに尋ね、同意して必要な詳細を提供したとします。
public String execute() {
user.setContactsList(
thirdPartyService.getInstance(getPartyCode()).fetchContacts(user.getAuthInfo())
);
UserRegistrationService.getInstance().persist(getUser());
return Action.SUCCESS;
}
サード パーティ サービスで認証し、他の詳細をフェッチして User オブジェクトを更新する (永続化する前に) ロジックもモデルに含まれます。これは、これがビジネス ロジックを構成し、コントローラーの実装に使用するテクノロジ (サーブレット、スタット、Spring MVC) に関係なく、スタンドアロンの再利用可能なモデル クラスにカプセル化する必要があるためです。
したがって、理想的には、分野横断的な問題 (検証、認証、キャッシュなど) のみをコントローラーに分解し、コア ビジネス ロジックはモデル内に残します。