MVCモード

12016 ワード

1つのサーブレットまたはJSPのみを使用してビジネスロジック、ビュー、およびレンダリングを処理すると、ロールが過剰に発生し、メンテナンスが困難になります.そこで,この問題を解決するためにMVCモードを用いた.
画像ソース

コントローラとビューの分離


せいぎょそうち


HTTP要求検証パラメータを受信し、ビジネスロジックを実行する.次に、ビューに渡す結果データをクエリーし、モデルに挿入します.

モデル人


出力するデータをビューに含めます.表示する必要があるすべてのデータをモデルに挿入し、渡します.したがって、ビューはビジネスロジックやデータアクセスを理解する必要はなく、レンダリング画面に注目するだけです.

表示


モデル内のデータを使用して、ペイント画面に集中します.HTMLセクションの生成を担当します.

会員がMVCに加入する


購読画面出力

@WebServlet(name = "mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/new-form")
public class MVCMemberFormServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String viewPath = "/WEB-INF/views/new-form.jsp";
        RequestDispatcher requestDispatcher = request.getRequestDispatcher(viewPath);
        requestDispatcher.forward(request, response); // 제어권 넘김
        // 서버안에서 내부적으로 호출하는것이지, 리다이렉트 하는게 아니다.
    }
}
redirect vs forward
redirectは実際のクライアント(Webブラウザ)に応答を失い、クライアントがリダイレクトパスを再要求する.したがって,クライアントは認識でき,URLパスも実際に変更される.逆にfordはサーバ内部の呼び出しであるため,クライアントはまったく知らない.
パスviewpathを指定し、リクエストが来ると自動的にcontrollerからviewに移行します.

購読後の画面出力

@WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {

    private final MemberRepository memberRepository = MemberRepository.getInstance();
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));

        Member member = new Member(username, age);
        memberRepository.save(member);

        //Model에 데이터를 보관한다.
        request.setAttribute("member", member);
        String viewPath = "/WEB-INF/views/save-result.jsp";
        RequestDispatcher requestDispatcher = request.getRequestDispatcher(viewPath);
        requestDispatcher.forward(request, response);
リクエストが受信したparamを各変数に設定し、メンバーを作成して保存し、プロパティに設定してviewに渡し、view論理に従って出力します.

すべてのクエリー

@WebServlet(name = "mvcMemberListServlet", urlPatterns = "/servlet-mvc/members")
public class MvcMemberListServlet extends HttpServlet {
    private final MemberRepository memberRepository = MemberRepository.getInstance();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Member> members = memberRepository.findAll();
        request.setAttribute("member", members);

        String viewPath = "/WEB-INF/views/save-result.jsp";
        RequestDispatcher requestDispatcher = request.getRequestDispatcher(viewPath);
        requestDispatcher.forward(request, response);
同様に、クエリ全体のためにListをArtreviewに設定し、viewに出力します.
しかし、これらのMVCモードには限界がある.

MVC制限


  • 繰り返しviewpath
    もしあなたがjspではなく、胸腺ペプチドなどを交換したら、すべて交換しなければなりません.

  • パブリック冗長性
    powed、viewのような部分は繰り返し、毎回呼び出されます.
  • 共存し難い.
    従って、コントローラを呼び出す前に、汎用機能を扱うことができるFront Controlモードが必要となる.Spring MVCもこのFront Controlにあります.