jsp基礎のServlet


Servletはインターフェースですが、インターフェースには具体的な実装がありません。     HttpServletはServletの具体的な実現である。HTTP Servletを作成するには、HTMLフォームのGenericServletのサブクラスを専門的な方法で処理するHttpServletクラスを継承します。
     Servletシステム構造はJavaマルチスレッド機構の上に構築されており、そのライフサイクルはWebコンテナが担当している。クライアントがServletを初めて要求するとき、Servletコンテナは、web.xmlプロファイルに従って、このServletクラスを実装する。新しいクライアントがServletを要求している場合、このServletクラスは一般的にはもう実装されない。すなわち、複数のスレッドがこの例を使用している。Servlet容器は自動的にスレッド池などの技術を使ってシステムの運行をサポートします。servletが複数のservlet-mappingを構成し、servlet-nameの名前が同じであれば、複数のservletを生成する。
    
    servletを作成するには、このインターフェースを実現する5つの方法が必要です。
public class Hello{        public void destroy(){….}         public ServletConfig get ServletConfig(){…}         public String getServletInfo(){…}         public void init(ServletConfig sc)throws Servlet Exception{…}         public void service(Servlet Request req,Servlet Resonse rep)throws                  Sevlet Exception、IOException   {…}
       GenericServlet類は、service法以外の4つの方法を実現しました。私たちはservletを作る時に彼を受け継ぐだけで、serviceを実現する方法を加えてもいいです。public class Hello extens Generanic Servlet{         public void service(Servlet Request greq,Servlet Resonse gresp)throws….{.}
 
      ServletRequestとServletResonseは、コンテナメーカー(tomcatまたはweblogicなど)によってServletRequestインターフェースの定義に従い、コンテナにおいて自動的に実装された要求対象の一つである。このオブジェクトはこのインターフェースで定義された15の方法で操作できる。もちろん生産者によっては、実際の対象が異なってきますが、私たちは違った部分に関心を持っていません。この15の操作方法だけに関心を持っています。
      このservletがどのような機能を実現するかは、このserviceに書いてあります。このようにする最大の利点は、FTP、MAILなど、HTTPに限定されない他のアプリケーションを作成できることである。
     GenericServletクラスの下に、HttpServletクラスがあります。
     私たちはほとんどの場合、HttpServlet類を継承すればいいです。もちろんこの時私達が書くコードは
public class Hello extens HttpServlet{        public void service(HttpServlet Request req,HttpServlet Resonse rep)throws….{.}
 
import java.io.IOException;

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

public class TestServlet extends HttpServlet {

	private int g_count = 0;
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
		g_count ++;
		System.out.println(" doGet====="+ g_count);
	}

	@Override
	protected void doPut(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPut(req, resp);
	}

	/**
	 *         
	 */
	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(arg0, arg1);
		int t_count=0;
		g_count ++;
		System.out.println(" service_g_count====="+ g_count);
		System.out.println(" service_t_count====="+ t_count);
	}

	/**
	 *  destroy          servlet,         servlet  ,
	 *             ,         ...
	 *  
	 */
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		super.destroy();
	}

	/**
	 *  init      httpServlet        ,
	 *     httpServlet            
	 */
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		super.init();
		g_count ++;
		System.out.println(" init====="+ g_count);
	}

}
     初めてのお願いに対してg_countに3を加える。init,service,do*()。
     第二次及び以後の請求に対して毎回2を追加し、   service,do*()
     例えば、ブラウザAを初めて開くと、出力:init===1
                                                service_グラム。count===2
                                                service_tう。count===0
                                                doGet===3
 
            Aブラウザ出力を更新するとき:
                                                service_グラム。count===4
                                                service_tう。count===0
                                                doGet===5
            
             現在のブラウザAを閉じると、ブラウザBを再開します。
                                                service_グラム。count===6
                                                service_tう。count===0
                                                doGet===7
            tomcatを再開したら、ブラウザBを更新します。
                                               init===1
                                                service_グラム。count===2
                                                service_tう。count===0
                                                doGet===3
     注意:現在のブラウザを閉じて、再度ブラウザを開く理由はtomcatがデフォルトでキャッシュクライアントのsessionです。これは設定可能で、異なるtomcatバージョンが異なるかもしれません。tocat 5.0を使ってテストします。
     最初の顧客要求が到着すると、Webコンテナは、プロファイル(web.xml)に従って、対応するServletクラスを見つけ、具体化する。Servletの実行プロセス、つまりServletのライフサイクル:
一、初期化時期
この時期にinit()のメソッドを呼び出し、ServletがServletエンジンにロードされると、次にinit()という方法を実行しますので、この方法を積載して、自分たちの初期化作業を行うことができます。でも忘れずに、自分のinitが終わったら、super.initを呼んでシステムの初期化を完了するようにしてください。
Servletのライフタイムにおいて、init()メソッドは一回のみ実行され、init()メソッドはサーバの実装時のみ実行され、その後、いくらクライアントがこのServletにアクセスしても、init()は繰り返し実行されない。
init()が異常を投げた場合、または所定の時間期間に戻り値がない場合、init()が失敗し、Servletはサーバに読み込めなくなります。
リロードinit()メソッドの基本フォーマットは、
public   void   init(Servlet Config)   config   ローソン   Servlet Exception   {…} 
二、実行時期
Servletがロードされた後、主にservice()方法によって外部に応答し、この方法は同時に、何度もコールされ得る。
HttpServlet類には自分のservice()の方法があるので、HttpServlet類にとっては自分のservice()の方法を使用しています。私たちが一般的に指すservice()の方法もHttpServlet類のservice()の方法を指します。TIOPS要求を受信すると、ACptionが呼び出されます。doTraceメソッドを呼び出すことができます。service()方法は一般的には重載されません。doOption()方法によって、doGet()、doPost()、doPut()、doDelete()などの方法の1つまたは複数が呼出されることが決定される。doOption()方法とdoTrace()方法は通常も重ロードされない。
 
三、終了時期
サーバーがServletをアンマウントすると、destroy()メソッドを呼び出します。この方法は、メモリ、ファイルのハンドル、スレッドなど、制御された任意のリソースをServletにタイミング良くクリアする。もしあなたが終わったら、いくつかの資源を閉鎖してもいいです。この方法は同じです。自分のdestroyが終わったら、super.destroyを呼んでください。