このブログでは、主に次のことを紹介しています。3つの組み込みオブジェクトの作成と破棄へのリスナーの適用、組み込みオブジェクトの属性の追加と削除。
目次
2:3つの組み込みオブジェクトのリスナー(組み込みオブジェクトの作成と破棄)
たとえば、ブラウザウィンドウを閉じずに、インターフェイスを更新した場合:
3:属性リスナー(組み込みオブジェクト属性の追加と削除)(属性リスナーは実際にはあまり使用されません)
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メソッドで出力ステートメントを追加します。
効果: