サーブレットの動作フレーム


参考:Javaサーブレット技術の概要
概要
アクションフレームワークとは,サービスレット(リクエストエントリ)を作成し,リクエストを解析するURIがアクション名を取得し,ユーザリクエストを処理するアクションクラスを呼び出し,リクエストアクセスを完了することである.動作の実行が完了すると、結果を表すJSPへのURL(テンプレートエンジンでも可)が返される.MVCを勉強したことのある学生はここで一つ一つ対応することができます.サーブレットはActionFactoryを呼び出すことでルーティングの役割を果たし,ユーザの動作クラスを処理するのがControllerであり,ControllerはModelを呼び出してタスク処理を完了させ,処理が完了すると戻るURIが指すJSPは表示のためのViewである.大まかなフレーム図は以下の通りです.
詳しく述べる
ここでは,動作フレームを実現するために必要な部品の機能や構成を具体的に詳しく述べ,各部をできるだけ明確にする目的を達成している.
Servlet
「一意」のサーブレット.すべてのリクエストのエントリは、HttpServeretから継承され、アクション名が解析され、アクションファクトリActionFactoryによって具体的なアクションオブジェクトが得られ、アクションを実行するperformメソッドが実行され、最後に要求が返されたURLに転送される.例:
package com.example;

import java.io.IOException;
import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.example.actions.Action;

public class actionServlet extends HttpServlet {
    private ActionFactory factory = ActionFactory.getSingleton();

    // public void init(ServletConfig config) throws ServletException { ... }

    public void service(HttpServletRequest req, HttpServletResponse res) 
            throws ServletException, IOException {
        //        
        String actionName = getActionName(req);
        //         actionName     
        Action action = factory.create(actionName);
        //     ,     URL
        String url = action.perform(req, res);
        //   url    
        if (url != null)
            getServletContext().getRequestDispatcher(url).forward(req, res);
    }

    // public void destroy() { ... }

    private String getActionName(HttpServletRequest req) {
        String path = req.getServletPath();
        return path.substring(path.lastIndexOf('/'),  path.lastIndexOf('.'));
    }
}

ActionFactory
すべてのアクションを記録し、サーブレットから発行されたアクション名でアクションクラスを取得し、そのクラスをインスタンス化してインスタンスオブジェクトを返します.すべてのアクションを保存し、指定したアクションを検索する目的を果たします.例:
package com.example;

import com.example.actions.*;

import java.util.HashMap;
import java.util.Map;

public class ActionFactory {
    private Map actionsMap = defaultMap();
    private static ActionFactory singleton;

    public static ActionFactory getSingleton() {
        if (singleton == null)
            singleton = new ActionFactory();
        return singleton;
    }

    public Action create(String actionName) {
        Class klass = (Class)map.get(actionName);
        if (klass == null) {
            throw new RuntimeException(getClass() + " was unable to find an action named '" + actionName + "'.");
        }
        Action actionInstance = null;
        try {
            actionInstance = (Action)kalss.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return actionInstance;
    }

    private Map defaultMap() {
        Map map = new HashMap();

        map.put("example1", example1Action.class);
        map.put("example2", example2Action.class);
        // ...

        return map;
 }

Action
アクションクラスは、Actionインタフェースを継承し、リクエストされた各アクションを完了します.他のクラスを呼び出すことでリクエストタスクを完了し、結果を表示するjspのURLを返します.Actionインタフェース
package com.example.actions;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Action {
    public String perform(HttpServletRequest request, HttpServletResponse response);
}

例:
package com.example.actions;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// import ...

public class exampleAction implements Action {
    @Override
    public String perform(HttpServletRequest req, HttpServletResponse res) {
        // do something ...
        return "/example.jsp"
    }
}

web.xml
クラスurlがサーバに到着したときに実行するservletを構成します.例えば、ここでは、.performを接尾辞とするurlをすべて、私たちが前に作成したcom.example.exampleServletで処理します.


<web-app>
    <servlet>
        <servlet-name>exampleservlet-name>
        <servlet-class>com.example.exampleServletservlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>exampleservlet-name>
        <url-pattern>*.performurl-pattern>
    servlet-mapping>
    <servlet-mapping>
        <servlet-name>exampleservlet-name>
        <url-pattern>index.htmlurl-pattern>
    servlet-mapping>
web-app>

体得する
  • 動作フレームワークにより、1つのサーブレットのみを作成してシステムの構築を統括することができ、このサーブレットはエントリでありurlを解析し、ActionFactoryによって動作を得てから動作を実行し、最後に表示結果を返して簡単なリクエストアクセスを完了する.
  • 構築の過程で、動作の作成を分類し、明確でメンテナンスしやすい目的を達成しなければならない.
  • ビジネスとロジックの不混合の原則.論理的な実装に専念するが、servletではなく、単純なjavaで実装され、servletが直接または間接的に呼び出される.

  • 余談
  • 文章の冒頭の参考文章はよく書けていますが、具体的なDemoがありますので、ぜひ行ってみてください.
  • 粗雑な男、书くのが正しくない地方はまたあなたに指摘してもらうことができて、感激します.
  • IDEを覚えていて、最初はSublimeでやってみたいと思っていましたが、最後に崩れてしまいました.大神は無視してください.