サーブレット(2)

1.サーブレットのライフサイクル
Javaでは、どのオブジェクトにもライフサイクルがあり、サーブレットも例外ではありません。サーブレットのライフサイクルを図1に示します。
ここに画像の説明を挿入

サーブレットのライフサイクル。サーブレットのライフサイクルは、機能によって大きく分けて、読み込みインスタンス化フェーズ、初期化フェーズ、運用フェーズ[処理要求]、破棄フェーズの4つに分けられます。
1.インスタンス化ステージのロード
サーブレットコンテナが開始されると、プロジェクトのweb.xml構成ファイルがロードされ、構成されたすべてのサーブレットクラスで構成されたパッケージ名+クラス名が解析され、パッケージは次のようになります。名前+クラス名に対応するリフレクションメカニズムサーブレットクラスオブジェクトを介してインスタンス化されます。
2.初期化フェーズで
は、クライアントがサーブレットにアクセスするためにサーブレットコンテナにHTTPリクエストを送信すると、サーブレットコンテナは最初にリクエストを解析し、サーブレットオブジェクトがすでにメモリにあるかどうかを確認します。ある場合は、サーブレットオブジェクトを使用します。そうでない場合は、直接サーブレットインスタンスオブジェクトを作成し、init()メソッドを呼び出してサーブレットの初期化を実装します。サーブレットのライフサイクル全体で、そのinit()メソッドは1回しか呼び出せないことに注意してください。
3.実行フェーズ[リクエストの処理]
これは、サーブレットのライフサイクルで最も重要なフェーズです。このフェーズでは、サーブレットコンテナは、HTTPリクエストを表すServletRequestオブジェクトと、このリクエストのHTTP応答を表すServletResponseオブジェクトを作成します。それらはパラメータとしてサーブレットのservice()メソッドに渡されます。
service()メソッドは、ServletRequestオブジェクトからクライアント要求情報を取得して要求を処理し、ServletResponseオブジェクトを介して応答結果を生成します。
サーブレットのライフサイクル全体で、サーブレットのアクセス要求ごとに、サーブレットコンテナはサーブレットのservice()メソッドを1回呼び出し、新しいServletRequestオブジェクトとServletResponseオブジェクトを作成します。つまり、service()メソッドは次のようになります。サーブレットの存続期間サイクル中に複数回呼び出されます。
4.破棄フェーズ
サーバーがシャットダウンされるか、Webアプリケーションがコンテナーから削除されると、Webアプリケーションが閉じられるときにサーブレットが破棄されます。サーブレットを破棄する前に、サーブレットコンテナはサーブレットのdestroy()メソッドを呼び出して、サーブレットオブジェクトが占有しているリソースを解放できるようにします。サーブレットのライフサイクル全体で、destroy()メソッドを呼び出すことができるのは1回だけです。
サーブレットオブジェクトが作成されると、それはメモリに常駐し、クライアントがそれにアクセスするのを待つことに注意してください。サーブレットオブジェクトは、サーバーがシャットダウンされるか、Webアプリケーションがコンテナから削除されるまで破棄されません。

package com.wangxing.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

public class TestServlet2 extends HttpServlet{
	@Override
	public void init() throws ServletException {
		System.out.println("初始化阶段调用 init() 方法实现 Servlet 的初始化工作");
	}
	@Override
	public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
		System.out.println("运行阶段Servlet 容器都会调用一次 Servlet 的 service() 方法,完成请求处理");
	}
	@Override
	public void destroy() {
		System.out.println("Servlet 容器会调用 Servlet 的 destroy() 方法,以便让 Servlet 对象释放它所占用的资源");
	}
}

ここに画像の説明を挿入

サーブレットの
serviceメソッドとdoGet / doPostメソッドの関係1.serviceメソッドとdoGet / doPostメソッドは、どちらもHttpServletクラスのメソッドです-
1.service(ServletRequest req, ServletResponse resp)サーブレットインターフェイスから
2.service(HttpServletRequest req, HttpServletResponse resp)-self-defined-
3.doGet(HttpServletRequest req, HttpServletResponse resp)self-defined-
4.doPost(HttpServletRequest req, HttpServletResponse resp)self-defined
inリクエストを具体的に処理する場合、サーブレットコンテナはデフォルトでサーブレットインターフェイスから.service(ServletRequest req、ServletResponse resp)メソッドを呼び出してリクエストを行います。HttpServletクラスは、サーブレットインターフェイスからのサービス(ServletRequest req、ServletResponse resp)メソッドを使用して、HttpServlet自体によって定義されたサービス(HttpServletRequest req、HttpServletResponse resp)を呼び出します。これは、要求を処理するときにHttpServlet自体(HttpServletRequest)によって定義されたサービスです。 。req、HttpServletResponse resp)が実行されます。このとき、HttpServletで定義されたサービス(HttpServletRequest req、HttpServletResponse resp)メソッドでHttpServletRequestオブジェクトを使用して水素送信メソッドを取得し、対応するdoGet / doPostメソッドを呼び出して処理します。リクエストの送信方法を判断してリクエストを送信します。

public abstract class HttpServlet extends GenericServlet {
    private static final String METHOD_GET = "GET";
    private static final String METHOD_POST = "POST";
    @Override
	public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
		HttpServletRequest arg0=(HttpServletRequest)req;
		HttpServletResponse arg1=(HttpServletResponse)resp;
		service(arg0,  arg1); 
	}
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		String method=arg0.getMethod();
		if(method.equals("get")){
			doGet(arg0, arg1);
		}
		if(method.equals("post")){
			doPost(arg0, arg1);
		}
	}
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
	}
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
	}
   ..........
}

サーブレット構成仮想パスマッピング
サーブレット複数マッピングとは、同じサーブレットを複数の仮想パスにマッピングできることを意味します。つまり、クライアントは複数のパスを介して同じサーブレットにアクセスできます。サーブレットの複数のマッピングを実装するには、2つの方法があります。
1)複数の要素を構成する

<servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/test3</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/test33</url-pattern>
  </servlet-mapping>

http:// localhost:8080 / TestServlet3 / test3
http:// localhost:8080 / TestServlet3 / test33
上記の2つの異なるパスは、同じサーブレットプログラムにアクセスできます。
2)を設定する複数のサブエレメントは、複数のサブ要素を構成
要素にします

 <servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/test3</url-pattern>
  	<url-pattern>/test33</url-pattern>
  </servlet-mapping>

http:// localhost:8080 / TestServlet3 / test3
http:// localhost:8080 / TestServlet3 / test33
上記の2つの異なるパスは、同じサーブレットプログラムにアクセスできます。
サーブレットマッピングパスでのワイルドカードの使用
実際の開発プロセスでは、開発者は特定のディレクトリ内のすべてのパスが同じサーブレットにアクセスできることを期待する場合があります。現時点では、サーブレットマッピングパスでワイルドカード " "

を使用できますワイルドカード文字には、次の2つの形式があります。1.形式は「 .Extension です。たとえば、*。doは.doで終わるすべてのURLアドレスに一致します。
.helloで終わるすべてのURLアドレスに一致します。

<servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>*.hello</url-pattern>
  </servlet-mapping>

http:// localhost:8080 / TestServlet3 / abc.hello
http:// localhost:8080 / TestServlet3 / hello.hello

2.形式は/です。たとえば、/ abc /は/ abcで始まるすべてのURLアドレスに一致します。
すべてのURLアドレスに一致する

<servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/*</url-pattern>
  </servlet-mapping>

http:// localhost:8080 / TestServlet3 / test3
http:// localhost:8080 / TestServlet3 / test33
http:// localhost:8080 / TestServlet3 / abc
http:// localhost:8080 / TestServlet3 / hello

/ testで始まるすべてのURLアドレスに一致します。

<servlet>
  	<servlet-name>testservlet</servlet-name>
  	<servlet-class>com.wangxing.servlet.TestServlet3</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>testservlet</servlet-name>
  	<url-pattern>/test/*</url-pattern>
  </servlet-mapping>

http:// localhost:8080 / TestServlet3 / test
http:// localhost:8080 / TestServlet3 / test / abc

2つのワイルドカード形式を混在させることはできないことに注意しください。たとえば、/ abc/ *。doは不正です。マッピング道。
さらに、クライアントがサーブレットにアクセスするときに、要求されたURLアドレスが複数の仮想パスに一致する可能性がある場合、Tomcatは最も具体的な一致原理を採用して、要求されたURLに最も近い仮想マッピングパスを見つけます。
たとえば、以下に示すいくつかのマッピング関係の場合:
ここに画像の説明を挿入

リクエストURLが/abc/a.html----/abc/*で、/ *がこのURLと一致
する場合、TomcatはServlet1を呼び出します。リクエストURLが/ abc ---- / 、/ abc /、および/の場合abc両方がこのURLに一致する可能性があり、TomcatはServlet3を呼び出します。
リクエストURLが/abc/a.do-----/の場合、 .doと/ abc /がすべてこのURLと一致する可能性がある場合、TomcatはServlet1を呼び出します。
リクエストURLが/a.do--------/で
.doがこのURLと一致する場合、TomcatはServlet2を呼び出します。
リクエストURLが/xxx/yyy/a.do----の場合
.doと/ *の両方がこのURLと一致する可能性があり、TomcatはServlet2を呼び出します。
デフォルトサーブレット
特定のサーブレットのマッピングパスがスラッシュ(/)のみの場合、このサーブレットは現在のWebアプリケーションのデフォルトサーブレットです。サーブレットサーバーがアクセス要求を受信すると、一致する要素のURLがweb.xmlファイルに見つからない場合、サーバーはアクセス要求をデフォルトのサーブレットに渡して処理します。つまり、デフォルトのサーブレットを使用して処理します。処理されない他のサーブレットアクセス要求。
デフォルトのサーブレットは、Tomcatインストールディレクトリの下のconfフォルダにあるweb.xmlファイルでも設定されていることに注意してください。設定情報は次のとおりです。

<servlet>
    <servlet-name>default</servlet-name>
    <serlet-class>org.apache.catalina.servlets.DefaultServlet</serlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

上記の構成情報では、org.apache.catalina.servlets.DefaultServletがデフォルトのサーブレットとして設定されており、Tomcatサーバー上のすべてのWebアプリケーションで機能します。
Tomcatサーバー内の特定のWebアプリケーションにデフォルトのサーブレットがない場合、DefaultServletがデフォルトのサーブレットとして使用されます。クライアントがTomcatサーバーの静的HTMLファイルにアクセスすると、DefaultServletはHTMLが存在するかどうかを判断し、存在する場合はデータをストリームの形式でクライアントに送り返します。存在しない場合は、404エラーを報告します。 。
ここに画像の説明を挿入

ユーザー要求を処理するサーブレットの完全なプロセス
各サーブレット要求について、Webサーバーはservice()メソッドを呼び出す前にHttpServletRequestオブジェクトとHttpServletResponseオブジェクトを作成します。その中で、HttpServletRequestオブジェクトは、リクエストオブジェクトと呼ばれるHTTPリクエストメッセージをカプセル化するために使用されます。HttpServletResponseオブジェクトは、応答オブジェクトと呼ばれるHTTP応答メッセージをカプセル化するために使用されます。サーブレットにアクセスするブラウザの対話型プロセスを図1に示します。
ここに画像の説明を挿入

この図では、ブラウザは最初にHTTP要求をWebサーバーに送信します。受信した要求に従って、Webサーバーは最初にHttpServletRequestオブジェクトとHttpServletResponseオブジェクトを作成し、次に対応するサーブレットプログラムを呼び出します。サーブレットプログラムの実行中は、最初にHttpServletRequestオブジェクトからデータ情報を読み取り、次にservice()メソッドを介して要求メッセージを処理し、処理された応答データをHttpServletResponseオブジェクトに書き込みます。最後に、WebサーバーはHttpServletResponseオブジェクトから応答データを読み取り、それをブラウザーに送信します。
Webサーバーの実行フェーズでは、各サーブレットは1つのインスタンスオブジェクトのみを作成することに注意してください。HTTP要求ごとに、Webサーバーは要求されたサーブレットインスタンスのサービス(HttpServletRequest要求、HttpServletResponse応答)メソッドを呼び出して再作成します。 it。リクエストオブジェクトとレスポンスオブジェクト。
2.
サーブレットで一般的に使用されるインターフェイス、クラス、およびメソッドSun社は、サーブレットテクノロジの開発用に一連のインターフェイスとクラスを提供しています。最も重要なインターフェイスはjavax.servlet.Servletです。
1.サーブレットインターフェース

public abstract interface Servlet 

ここに画像の説明を挿入

サーブレットインターフェイスの場合、Sunは、GenericServletとHttpServletの2つのデフォルトのインターフェイス実装クラスを提供します。その中で、GenericServletは抽象クラスであり、サーブレットインターフェイスの部分的な実装を提供しますが、HTTP要求処理は実装しません。

public abstract class GenericServlet implements javax.servlet.Servlet, javax.servlet.ServletConfig, java.io.Serializable {

HttpServletはGenericServletのサブクラスであり、GenericServletのすべてのメソッドを継承し、HTTPリクエストのGETおよびPOSTに特定の操作メソッドを提供します。通常の状況では、記述されたサーブレットクラスはHttpServletから継承され、HttpServletオブジェクトも開発で使用されます。
パブリック抽象クラスHttpServletはGenericServletを拡張します{ HttpServletクラスには2つの一般的なメソッドが含まれています

ここに画像の説明を挿入

2.
ServletConfigインターフェースパブリック抽象インターフェースServletConfig
は、ファイルで使用されるエンコーディング、サーブレットプログラムを使用した共有情報など、サーブレットプログラムの実行時にいくつかの補助情報を必要とする場合があります。この情報は、Web内の1つ以上の要素を使用できます。 xmlファイル設定します。Tomcatがサーブレットを初期化すると、サーブレットの構成情報がServletConfigオブジェクトにカプセル化されます。このとき、init(ServletConfig config)メソッドを呼び出すことにより、ServletConfigオブジェクトをサーブレットに渡すことができます。
ServletConfigは、サーブレットの実行時に補助情報をカプセル化するインターフェースです。
構成情報を取得するための一連のメソッドは、ServletConfigインターフェースで定義されています。
ここに画像の説明を挿入

例:web.xmlファイルで構成された初期化パラメーター値と構成されたservlet-name値をServletConfigインターフェース・オブジェクトを介して取得します。

<servlet>
    <servlet-name>testservlet4</servlet-name>
    <servlet-class>com.wangxing.servlet.TestServlet4</servlet-class>
    <!-- 配置初始化参数 -->
    <init-param>
    	<param-name>myname</param-name>
    	<param-value>zhangsan</param-value>
    </init-param>
    <init-param>
    	<param-name>mypassword</param-name>
    	<param-value>123456</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
  	 <servlet-name>testservlet4</servlet-name>
  	 <url-pattern>/test4</url-pattern>
  </servlet-mapping>

@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到ServletConfig接口对象
		ServletConfig config=this.getServletConfig();
		//通过ServletConfig接口对象得到web.xml文件中配置的初始化参数值
		//String getInitParameter(String name)	根据初始化参数名返回对应的初始化参数值
		String myname=config.getInitParameter("myname");
		String mypassword=config.getInitParameter("mypassword");
	System.out.println("初始化参数值myname=="+myname+",mypassword=="+mypassword);
//得到web.xml 中 <servlet-name>元素的值
	    //String getServletName()	返回 Servlet 的名字,即 web.xml 中 <servlet-name>元素的值
	    String servletName=config.getServletName();
	    System.out.println(" web.xml 中 <servlet-name>元素的值==="+servletName);
	}

ここに画像の説明を挿入

3. ServletContextインターフェース
Tomcatが起動すると、Tomcatは、現在のWebアプリケーションを表すためにWebアプリケーションごとに一意のServletContextオブジェクトを作成します。これは、現在のWebアプリケーションのすべての情報をカプセル化します。このオブジェクトを使用して、Webアプリケーションのサーブレットバージョンの取得、情報の初期化、リソースファイルの読み取りなどを行うことができます。
ここに画像の説明を挿入

ここに画像の説明を挿入

web.xmlを構成します

 <!-- 配置初始化信息 -->
  <context-param>
     <param-name>myname</param-name>
     <param-value>lisi</param-value>
  </context-param>
  <context-param>
  	<param-name>myage</param-name>
  	<param-value>24</param-value>
  </context-param>
  <servlet>
    <servlet-name>testservlet5</servlet-name>
    <servlet-class>com.wangxing.servlet.TestServlet5</servlet-class>
  </servlet>
  <servlet-mapping>
  	 <servlet-name>testservlet5</servlet-name>
  	 <url-pattern>/test5</url-pattern>
  </servlet-mapping>

@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到ServletContext接口对象
		ServletContext context=this.getServletContext();
		//得到Servlet版本号
		int majorVersion=context.getMajorVersion();
		int minorVersion=context.getMinorVersion();
		System.out.println("Servlet版本号=="+majorVersion+"."+minorVersion);
		//得到初始化信息
		//String  getInitParameter(String)	得到指定的初始化信息<context-param>
		String name=context.getInitParameter("myname");
		String age=context.getInitParameter("myage");
		System.out.println("初始化信息myname=="+name+",age=="+age);
		// 得到包含所有初始化信息名的Enumeration对象
        Enumeration<String> paramNames = context.getInitParameterNames();
        // 遍历所有的初始化参数名,得到相应的参数值并打印
        while (paramNames.hasMoreElements()) {
          String paramname = paramNames.nextElement();
          String value = context.getInitParameter(paramname);
          System.out.println("初始化信息=="+paramname+"="+value);
        }
	}

ここに画像の説明を挿入

Webアプリケーション
でのリソースファイルの読み取り実際の開発では、構成ファイルやログファイルなど、Webアプリケーションでいくつかのリソースファイルを読み取る必要がある場合があります。このため、Webリソースを読み取るためのいくつかのメソッドはServletContextインターフェースで定義されており、これらのメソッドはサーブレットコンテナによって実装されています。サーブレットコンテナは、Webアプリケーションに関連するリソースファイルのパスに従って、関連付けられたリソースファイルのI / Oフロー、またはシステム内のリソースファイルの絶対パスを返します。
ServletContextインターフェースでリソースパスを取得するために使用される関連メソッド。
ここに画像の説明を挿入

1.プロジェクトのsrcディレクトリにxxxxx.propertiesという名前のファイルを作成します

testname=zhangsan
testage=23
testaddress=\u897F\u5B89

2.xxxxx.propertiesファイルを読み取るサーブレット処理クラスを記述します。

package com.wangxing.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet6 extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到ServletContext接口对象
		ServletContext context=this.getServletContext();
		//读取资源文件
		//InputStream getResourceAsStream(String path)	返回映射到某个资源文件的 InputStream 输入流对象。
		InputStream in=context.getResourceAsStream("/WEB-INF/classes/mytest.properties");
		Properties pros = new Properties();
	    pros.load(in);
	    String name=pros.getProperty("testname");
	    String age=pros.getProperty("testage");
	    String address=pros.getProperty("testaddress");
	    System.out.println("mytest.properties---testname===="+name);
	    System.out.println("mytest.properties---testage===="+age);
	    System.out.println("mytest.properties---testaddress===="+address);
	}
}

3.web.xmlを構成します
。4。テストします。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/guoguo0717/article/details/109080519