リスナー3:ServletContext、HttpSession、HttpServletRequest3つの組み込みオブジェクトリスナー; 3つの組み込みオブジェクト属性リスナー;

 このブログでは、主に次のことを紹介しています。3つの組み込みオブジェクトの作成と破棄へのリスナーの適用、組み込みオブジェクトの属性の追加と削除。

目次

1つ:はじめに

2:3つの組み込みオブジェクトのリスナー(組み込みオブジェクトの作成と破棄)

1.ケースの内容:

まず、サーブレットを記述します。HelloServlet:

次に、リスナークラスを記述します。WebListener:

最後に、web.xmlでリスナーを構成します。

2.アプリケーションを起動し、効果を観察します。

まず、ブラウザを開いてリクエストを開始します。

次に、ブラウザウィンドウを閉じて、リクエストを再開します。

たとえば、ブラウザウィンドウを閉じずに、インターフェイスを更新した場合:

最後に、アプリケーションを閉じます。

3:属性リスナー(組み込みオブジェクト属性の追加と削除)(属性リスナーは実際にはあまり使用されません)

1.準備;属性の追加

2.属性の更新;削除(2つはあまり使用されておらず、最初に印象を与えるだけです)


1つ:はじめに

リスナーで一般的に使用される6つのインターフェイス:オブジェクト監視インターフェイス;属性監視インターフェイス(オブジェクト内):

3つの組み込みオブジェクトについてよくわからない場合はJavaWeb Three ScopeObjectsブログを確認してください


2:3つの組み込みオブジェクトのリスナー(組み込みオブジェクトの作成と破棄)

2番目の部分は、主に、リスナーが「オブジェクトの作成」と「オブジェクトの破棄」を監視できることを示すことです;;;主にプロセス全体を監視します。

1.ケースの内容:

まず、サーブレットを記述します。HelloServlet

このサーブレットでは、3つのオブジェクトServletContext、HttpSession、およびHttpServletRequestの属性が設定されています。

package com.imooc.listener;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().println("This is HelloSerrvler!");
		// 得到应用程序全局对象;并在其中设置一个属性;
		request.getServletContext().setAttribute("sc-attr1", "sc-attr-value1");
		// 得到用户会话对象;并在其中设置一个属性;
		request.getSession().setAttribute("session-attr1", "session-attr-value1");
		// 在请求对象中设置一个属性;
		request.setAttribute("request-attr1", "request-attr-value1");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

次に、リスナークラスを記述します。WebListener

ServletContextListener、HttpSessionListener、およびServletRequestListenerの3つのインターフェースが実装されており、各インターフェースには実装する2つのメソッドがあります(それぞれ、作成操作と破棄操作)。

package com.imooc.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * WebListener类实现ServletContextListener接口,以使该监听器类可以监听ServletContext对象;
 * WebListener类实现HttpSessionListener接口,以使该监听器类可以监听HttpSession对象;
 * WebListener类实现ServletRequestListener接口,以使该监听器类可以监听ServletRequest对象;
 * @author Administrator
 *
 */
public class WebListener implements ServletContextListener,HttpSessionListener,ServletRequestListener{

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("ServletContext已经被销毁。");
		
	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("ServletContext已经被初始化。");
		
	}

	@Override
	public void sessionCreated(HttpSessionEvent se) {
		// TODO Auto-generated method stub
		// se:HttpSessionEvent对象(即HttpSession事件对象),这个se参数可以调用方法,获取到已经被创建的Session对象;
		HttpSession session = se.getSession();
		System.out.println("Session已经被创建,SessionID为:"+session.getId());
		
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("Session已经被销毁。");
	}

	@Override
	public void requestDestroyed(ServletRequestEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println("HttpServletRequest请求对象已经被销毁。");
	}

	@Override
	public void requestInitialized(ServletRequestEvent sre) {
		// TODO Auto-generated method stub
		// sre可以获取ServletRequest请求对象,这儿需要强转一下,转成HttpServletRequest类型的;
		HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();
		System.out.println("HttpServletRequest请求对象已经被创创建,uri是:"+request.getRequestURI());
		
	}

}

最後に、web.xmlでリスナーを構成します

2.アプリケーションを起動し、効果を観察します。

まず、ブラウザを開いてリクエストを開始します。

ブラウザを開き、上記のサーブレットにアクセスします。このプロセスでは、リクエストが開始され、HttpServletRequestオブジェクトが作成されます。当然、これはセッションが開かれ、HttpSessionオブジェクトも作成されます(詳細については、「セッション」を参照してください)。オブジェクトブログセッション原理説明部)

アドレスlocalhost:8080 / listener-interface / helloにアクセスすると、HttpServletRequestオブジェクトが作成されます;;;これは新しいブラウザウィンドウからのリクエストであるため、Tomcatはその直後に新しいSessionオブジェクトを作成します;;;;サーブレットの処理が完了し、応答の出力とともに、今作成されたHttpServletRequestオブジェクトが破棄されます;;;(これらの作成および破棄プロセスは、リスナーの対応するメソッドを自然にトリガーします)

次に、ブラウザウィンドウを閉じて、リクエストを再開します。

このとき、ブラウザを閉じて、localhost:8080 / listener-interface / helloに再度アクセスしてください。

ブラウザウィンドウを閉じても、Sessionオブジェクトの破棄はトリガーされません。これは、クライアントが閉じているが、クライアント通信用のSessionnId資格情報が存在せず、サーバー上に存在するSessionオブジェクトが(自動的に)存在するためです。 30分後に期限切れになるか、セッション破棄メソッドを手動で呼び出して破棄します):

たとえば、ブラウザウィンドウを閉じずに、インターフェイスを更新した場合:

最後に、アプリケーションを閉じます。

   

……………………………………………………

疑問に思う?なぜ、アプリケーションが閉じられたときに、セッションを破棄するメソッドが呼び出されないのですか?、解決後、補うために戻ってきます。


3:属性リスナー(組み込みオブジェクト属性の追加と削除)(属性リスナーは実際にはあまり使用されません)

注:属性監視インターフェースは実際のプロジェクトではあまり使用されないため、ここに一般的な理解があります。

1.準備;属性の追加

属性リスナーの書き込み:WebAttributeListener:各オブジェクトの属性インターフェイスで、Addメソッド、Removedメソッド、Replacedメソッドを実装する必要があります。

package com.imooc.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class WebAttributeListener implements ServletContextAttributeListener,HttpSessionAttributeListener,ServletRequestAttributeListener{

	@Override
	public void attributeAdded(ServletContextAttributeEvent event) {
		// TODO Auto-generated method stub
		// event.getName();  // 用于获取新增属性的名称;
		// event.getValue();// 获取新增属性的值;
		System.out.println("ServletContext对象新增属性了。"+event.getName()+":"+event.getValue());
	}

	@Override
	public void attributeRemoved(ServletContextAttributeEvent event) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attributeReplaced(ServletContextAttributeEvent event) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attributeAdded(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		System.out.println("HttpSession对象新增属性了。"+event.getName()+":"+event.getValue());
		
	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent event) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attributeAdded(ServletRequestAttributeEvent event) {
		// TODO Auto-generated method stub
		System.out.println("HttpServletRequest对象新增属性了。"+event.getName()+":"+event.getValue());
		
	}

	@Override
	public void attributeRemoved(ServletRequestAttributeEvent event) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void attributeReplaced(ServletRequestAttributeEvent event) {
		// TODO Auto-generated method stub
		
	}

}

web.xmlでリスナーを構成します。

アプリケーションを起動します。localhost:8080 / listener-interface / helloにアクセスします。

……………………………………………………

2.属性の更新;削除(2つはあまり使用されておらず、最初に印象を与えるだけです)

属性の更新:当然、接続します。既にlocalhost:8080 / listener-interface / helloにアクセスしている場合は、インターフェイスを再度更新します(つまり、localhost:8080 / listener-interface / helloに再度アクセスします)。このプロセスは自然に再実行されます。サーブレットオブジェクト内のオブジェクトに値を割り当てるステートメントでは、属性のこのコピーは値を変更するためのものです。

………………………………

属性の削除:効果を示すために、サーブレットで属性を削除するステートメントを追加し、リスナーのdeleteメソッドで出力ステートメントを追加します。

効果:

おすすめ

転載: blog.csdn.net/csucsgoat/article/details/114366039