Java Web基礎知識のサーブレット(2):サーブレットに深く入り込む――Httpサーブレット


一、サーブレットの継承構造
サーブレットには、直接実装クラスと間接実装クラスが1つしかありません.次のようになります.
実際、サーブレットはHttpプロトコルのみにサービスできるわけではなく、多くのプロトコルに従って通信できるが、現在実装されているのはhttpプロトコルのみであるが、サーブレットをHttpプロトコルのみにサービスするサーブレットと同等にすることはできない.
私たちは以前、自分のサーブレットを作成するときは、サーブレットインタフェースを直接実装していましたが、毎回すべての方法を実装しなければならないという問題があり、ビジネス上は必要ありません.私たちは要求を受信して応答に戻るだけで、他の方法はあまり注目していません.GenericServiceletを継承することで、リクエストの処理に専念し、ライフサイクルメソッドやその他のパラメータをGenericServiceletに渡すことで、開発作業を大幅に簡素化できます.
GenericServiceletは抽象クラスで、サーブレットの周期メソッドをカプセル化したり、空の実装を与えたりします.また、サーブレットコンフィグやサーブレットContextクラスのいくつかのメソッドとインスタンスを取得する方法をカプセル化しています.その中で最も注目すべきはinit()メソッドの使用です.このクラスでは、2つのinit()メソッドがあります.1つはサーブレットインタフェースの実装であり、1つはカスタムinit(){}であり、1つは空の実装であり、これは私たちにこのメソッドを実装するのにいくつかの困惑をもたらしました.どれを継承すればいいですか.このクラスのインスタンスを使用してサーブレットコンフィグのインスタンスを取得するため、init()を処理しないと、サーブレットコンフィグが空になります.GenericService()メソッドを参照してください.
public void init(ServletConfig config) throws ServletException {
	this.config = config;
	this.init();
}
public void init() throws ServletException {}
は、init(ServertConfig config)でinit()メソッドが呼び出されていることを示します.したがって、GenericServertを継承する際には、次のように処理できます.
  • は、すべての初期化作業がGenericServiceletによって実現されるように、init(ServertConfig config)メソッドを実装しない.
  • はinit()メソッドを実装して私たちの初期化作業を行い、GenericServiceのinit(Service letConfig config)がService letコンテナに呼び出されると、私たち自身のinit()も呼び出されます.
  • はinit(サーブレットコンフィグconfig)メソッドを実装するが、サーブレットコンテナがそれを呼び出すときにsuper.init(config)を介してGenericサーブレットのinit(サーブレットコンフィグconfig)メソッドを呼び出すことでリソースの初期化を完了することもできる.

  • 二、直接にHttpServeretを使用する
    やっと私たちのポイントに来ました.私たちが作成したすべてのウェブプログラムは実際にはHttpServiceを適用しています.私たちのWebプログラムはhttpを通じて通信しているので、HttpServiceを直接使用するよりも直接的で、GenericServiceがHttpService()を使用してリクエストを処理するのではなく、異なるHttpメソッドに対してリクエストを処理します.このクラスでは主に異なるHttpに対する方法処理が実現されており、処理方式は主にサービス()方法を新規作成することによって、ライフサイクル方法servcie()の転送を受信し、以下のようにしている.
    public void service(ServletRequest req, ServletResponse res)
        throws ServletException, IOException
    {
        HttpServletRequest  request;
        HttpServletResponse response;
            
        if (!(req instanceof HttpServletRequest &&
                res instanceof HttpServletResponse)) {
            throw new ServletException("non-HTTP request or response");
        }
    
        request = (HttpServletRequest) req;
        response = (HttpServletResponse) res;
    
        service(request, response);
    }
    は、Httpプロトコルをサポートするために、自分で作成したサービス(HttpServeretRequest req,HttpServeretResponse resp)メソッドを呼び出す.Httpのサポートはget,postなどのリクエストを処理し,応答を返すことにほかならない.
    まず,リクエスト,レスポンスに関する4つのクラスを紹介する.
    まず、サーブレットRequesクラスとサーブレットResponseクラスは、サーブレットコンテナがサービス()メソッドを呼び出す前にコンテナによって作成され、このメソッドに渡されます.
    サーブレットリクエストインタフェースの方法:
    要求パラメータの取得:
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    	System.out.println("service");
    		
    	System.out.println(req.getParameter("user"));
    	System.out.println("------------");
    	System.out.println(Arrays.asList(req.getParameterValues("shop")));
    	System.out.println("------------");
    	Map<String, String[]> params = req.getParameterMap();
    	for(String key: params.keySet()){
    		System.out.println(key + "=" + Arrays.asList(params.get(key)));
    	}
    	System.out.println("------------");
    	Enumeration<String> enums = req.getParameterNames();
    	while(enums.hasMoreElements()){
    		String paramName = enums.nextElement();
    		String paramValue = req.getParameter(paramName);
    		System.out.println(paramName + "=" + paramValue);
     	}
    }
    入力は次のとおりです.
    出力から最後のメソッドgetParameterName()がパラメータ値を返す場合、パラメータが配列である場合、そのメソッドはパラメータの最初の値のみを返すことがわかります.
    サーブレットRequestのサブインタフェースHttpサーブレットRequestには、Httpプロトコルに対する要求の処理方法がたくさんありますが、方法が多すぎると紹介しません.
    サーブレットResponseインタフェースの方法:符号化方式、コンテンツサイズの設定、国際化に必要なものなど、簡単な方法があります.また、OutputStreamとWriterを取得してデータを出力するのに最も役立ちます.
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    	System.out.println("service");
    	res.setContentType("application/msword");
    	res.getWriter().write("from servlet service method");
    }
    上のコードは、戻り値タイプがwordドキュメントであり、データが書き込まれるように設定されています.
    サーブレットResponseのサブインタフェースであるHttpサーブレットResponseにも多くの方法があり、クッキーやセッションなどの具体的な内容については後述しますが、ここでは一つ一つ説明せず、APIドキュメントを直接表示する必要がある場合は説明しません.