Java8デザインパターンのベストプラクティス-デザインパターンの概要(7日目の調査記録)

FrontControllerパターンの説明

Java EEの世界では
、通常、javaeeの世界で同様の複雑なプロジェクトを持つ複雑なプロジェクト
を処理します。通常、同様の特性の機能とプロセスがあります。さまざまなコントローラーを使用して要求を処理することが、
関数とプロセスである場合があります。異なる処理要求コントローラーを使用することは、複数のエンドポイントで構成する必要があり、複数のエンドポイントで構成する必要があり、作成に莫大なコストかかるため、間違った方法で大きなコストが発生する
ため、悪い習慣である場合があります。したがって、要求を処理するための中心点を作成することは、作成と保守です。したがって、リクエストを処理するための中央ポイントを作成することは、リクエストのすべてまたはグループを管理するための1つのポイントを作成し、次に、リクエストのすべてまたはグループを管理するための1つのポイントを作成してから送信するため非常に優れたソリューションです。正しいプロセスへのこの要求。その後、すべてに共通するすべてのポイントを処理できます。






このリクエストを正しいプロセスに送信してください。その後、我々はすべての一般的な処理できる
機能をプロセスに要求を送信一般的ではありません質問治療するための
機能を、そして珍しい問題に対処するためのプロセスに要求を送信し
、すべてのが、1つの機能に固有のものです。いくつかの構成では、そのような
だけasセッションの1つの機能は特定のものです。セッション
構成、リクエスト、Cookie、ヘッダーの最大サイズ制限などの一部の構成は、すべての
構成に共通です。つまり、リクエスト、Cookie、ヘッダーの最大サイズ制限は、すべての
リクエストに共通であり、中心点から構成する必要があり、中心点
から構成できます。
セントラルマネージャーを処理
するCreatesAのパターン作成されたすべてのFrontControllerパターン
は、アプリケーションのすべてのモード要求または要求グループに対処し、1つの特定の
要求またはアプリケーション要求グループに要求を送信する中央マネージャーです。次に、特定のにリクエストを送信します
プロセス(通常はコマンド)このパターンは、一般的なプロジェクトプロセス(通常はコマンド)ではめったに使用されません
このモードは
、現在いくつかの既製のソリューションがあるため、一般的なプロジェクトではめったに使用されません。このパターンの実装は
、今日いくつかの既製のソリューションがあるためですが、このモードを実現することは
通常不要です。このパターンは、Asなどのフレームワークで使用されます。 JSF、Spring MVC、および
通常は必要ありません。このモードは、JSF、springmvc、および
strutsです。次の図は、このパターンを示してい
ます。次の図は、このパターンを示しています。

ここに画像の説明を挿入

前の図には、FrontController、AbstractCommand、Command1があり、前の図には、FrontController、AbstractCommand、Command1
、および
Command2があります。FrontControllerは、すべての要求を受け取り、Command2のいくつかの共通点を処理します
FrontControllerはすべてのリクエストを受信し、リクエストを処理して、
このリクエストをマッチングコマンドに送信します。AbstractCommandはリクエストであり、このリクエストをマッチングコマンドに送信します
AbstractCommandは、
コマンドの抽象クラスです。Command1とCommand2は、コマンドのサブクラスであり、コマンド
の抽象クラスですCommand1とCommand2は
、対応するロジックを実装するcommandのサブクラスであり、対応するロジックを実装し
ます。
この場合、ホームページとログインページの2つのページがあります。この場合、ユーザーがログインし
いる場合は、ホームページとログインページの2つのページがありますユーザーがログインしている場合
リクエストが送信されると、アプリケーションはログインページを起動し
リクエストが送信されると、アプリケーションはログインページ、
ホームページ、ホームページの順に起動します

FrontControllerの実装

Here, we have an implementation of MyAppController, which is a FrontController to treat all the requests of an application:

package com.gary.book.chapter01;

import com.rhuan.action.Command.AbstractCommand;
import com.rhuan.action.Command.HomeCommand;
import com.rhuan.action.Command.LoginCommand;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "MyAppController", urlPatterns = "/myapp/*")
public class MyAppController extends HttpServlet {
    
    
    private static Logger logger =
            LogManager.getLogger(MyAppController.class);
    private final String PAGE_ERROR = "/pageError.jsp";

    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response) throws ServletException, IOException {
    
    
        processRequest(request, response);
    }

    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response) throws ServletException, IOException {
    
    
        processRequest(request, response);
    }

    protected void processRequest(HttpServletRequest
                                          request, HttpServletResponse response)
            throws ServletException, java.io.IOException {
    
    
        String resultPage;
        AbstractCommand command = null;
        try {
    
    
            //Create a correspondent Command.
            if (request.getSession().getAttribute("USER") == null)
                command = new LoginCommand();
            else command = new HomeCommand();
            //Execute the Command that return a page.
            resultPage = command.execute();
        } catch (Exception e) {
    
    
            logger.error(e.getMessage());
            resultPage = PAGE_ERROR;
        }
        //Dispatch to correspondent page.
        getServletContext().getRequestDispatcher(resultPage)
                .forward(request, response);
    }
}

次のコードスニペットでは
、次のコードフラグメントでurlPatternが使用されていることに注意してください。コンテキストがコントローラーに
送信するリクエスト定義するために使用されているurlPatternに注意してください。これを行う方法は次のとおりです。
コンテキストはAを送信するように定義されていますコントローラへのリクエスト。私たちの方法は次のとおりです。

//Defining the urlPattern to Front Controller
@WebServlet(name = "MyAppController", urlPatterns = "/myapp/*")
public class MyAppController extends HttpServlet {
    
    
 ...
}

urlPatternでは、値は「/ myapp / 」です。前のコードで示したよう
に、urlPatternでは、値は「/ myapp /
」です。前のコード
スニペットに示されているように、このURLパターン( "/ myapp / ")は、myapp URIへのすべてのリクエストが次のようになることを確立し
ますこのURLパターン( "/ myapp /
")は、myappURIへのすべてのリクエストが
コントローラーに送信されることを決定します。たとえば、http:// ip:port / context / myapp / myfuncionalityがコントローラーに
送信されます。たとえば、http:// ip:port / context / myapp / myfunctionality
がコントローラーに送信されます

このパターンを実装するときは、
このモデルを実装するときの使用に注意することが非常に重要
です。サーブレットのすべてのクラス属性はすべてのスレッドと共有されるため、サーブレット属性の使用に注意してください。
サーブレットのすべてのクラス属性は、すべてのスレッド
またはすべての要求、あるいはすべての要求と共有されるため、サーブレットの属性

すべてのGETリクエストまたはPOSTリクエストはprocessRequestメソッドに送信され、
すべてのGETリクエストまたはPOSTリクエストはprocessRequestメソッドに送信されます。このメソッドは
、リクエストをそれぞれのコマンドに送信するロジックを実装し、
実装されたリクエストを適切なコマンドに送信します。ロジックを実行し、
それぞれのロジックを実行します。正​​しいコマンドが設定されると、それぞれのコマンドと
独自のロジックが実行されます。正しいコマンドを設定した後、対応するコマンドを実行すると
ページがディスパッチされます。ここに、コマンドを実行してディスパッチする行があり
ます。ここに、コマンドを実行
し、正しいページにリクエストをディスパッチする行があります。正​​しいページへのリクエスト

//コマンドを実行しますresultPage = command.execute();

対応するページにリクエストをディスパッチします。//対応するページにディスパッチします。getServletContext()。getRequestDispatcher(resultPage).forward(request、response);

コマンドの実装

ここに、1つのexecuteメソッドを持つ抽象クラスであるAbstractCommandがあります。これは抽象コマンドであり、executeメソッドはサブクラスに実装されています。ここに、1つのexecuteメソッドを持つ抽象クラスであるAbstractCommandがあり
ます。これは抽象コマンドであり、executeメソッドはサブクラスに実装されています。

public abstract class AbstractCommand {
    public abstract String execute(); }

次のコードスニペットには、AbstractCommandの実装であるサブクラスHomeCommandがあります。メソッドexecute()は、ホームページ(/home.jsp)へのパスを返します。
次のコードスニペットには、サブクラスHomeCommandがあります。これはAbstractCommandの実装です。メソッドexecute()は、ホームページ(/home.jsp)のパスを返します。

public class HomeCommand extends AbstractCommand {
    
        @Override    public String execute() {
    
            return "/home.jsp";    } } 

ここに、AbstractCommandの実装であるLoginCommandサブクラスがあります。execute()メソッドは、ログインページ(/login.jsp)へのパスを返します。ここに、AbstractCommandの実装であるLoginCommandサブクラスがあり
ます。execute()メソッドは、ログインページ(/login.jsp)のパスを返します。

public class LoginCommand extends AbstractCommand {
    
        @Override    public String execute() {
    
            return "/login.jsp";    } }

おすすめ

転載: blog.csdn.net/Coder_Boy_/article/details/110385512