web.xmlのサーブレットContextListener

5208 ワード

サーブレットContextListenerを知るには、まずwebを見てみましょう.xmlの構成.
一)web.xmlのコンテンツのロード順序:
まず、ロード順序がwebにあることは間違いない.xmlファイルの優先順位は関係ありません.すなわち、filterがlistenerの前に書かれているため、filterが先にロードされることはありません.最終的に、listener->filter->servletには、サーブレットContextにキー値ペア、すなわちアプリケーションコンテキスト情報を提供するためのcontext-paramという構成セクションも存在すると結論しました.私たちのlistener、filterなどは初期化時にこれらのコンテキストの情報を使用しますが、context-param構成セクションはlistener構成セクションの前に書くべきではないでしょうか.実際にはcontext-param構成セクションは任意の場所に書くことができるため、実際のロード順序はcontext-param->listener->filter->servletがある構成セクションで発生する順序に関係しています.filterを例にとると、web.xmlではもちろん複数のfilterを定義できますが、filterに関連する構成セクションの1つはfilter-mappingです.ここでは、同じfilter-nameを持つfilterとfilter-mapping構成セクションでは、filter-mappingがfilterの後に表示される必要があります.そうしないと、filter-mappingに解析されると、対応するfilter-nameはまだ定義されていません.Webコンテナの起動時に各filterを初期化する場合は、filter構成セクションが表示される順序で初期化され、要求リソースが複数のfilter-mappingに一致する場合、filterブロックリソースはfilter-mapping構成セクションが表示される順序でdoFilter()メソッドを順次呼び出す.servletはfilterと同様であり、ここでは後述しない.これにより、web.xmlのロード順序はcontext-param->listener->filter->servletであり、同じタイプの間の実際のプログラム呼び出しの順序は対応するmappingの順序に従って呼び出される.二)サーブレットContextListenerとは何か:上から順番をロードして共有すると、サーブレットContextListenerはリスナーであり、サーブレットContextはサーブレットプログラムによってWebコンテナと通信するために使用される.たとえば、ログを書き込み、リクエストを転送します.各Webアプリケーションは、Webアプリケーション内の各プログラムによって共有されるContextを含む.Contextはリソースを保存して共有できるので、私が知っているサーブレットContextの最大のアプリケーションはWebキャッシュです.頻繁に変更しないコンテンツをメモリに読み込むので、サーバがリクエストに応答するときに遅いディスクI/Oを行う必要はありません.サーブレットContextListenerは、サーブレットContextのリスナーです.サーブレットContextがサーバ起動時にサーブレットContextが作成されるなど、サーブレットContextが変化すると、サーバがシャットダウンされるとサーブレットContextは破棄されます.JSPファイルでは、アプリケーションはサーブレットContextのインスタンスであり、JSPコンテナによってデフォルトで作成されます.サーブレットでgetServiceletContext()メソッドを呼び出して、サーブレットContextのインスタンスを取得します.
三)サーブレットContextListenerは何ができるか:あなたがしたいことは、リスナーができることです.
1.設計キャッシュ:
考え方:
キャッシュの考え方は,1)サーバ起動時にサーブレットContextListenerのcontextInitialized()メソッドが呼び出されるので,中にキャッシュを作成する.キャッシュコンテンツ生成クラスは、ervletContext.を用いるファイルまたはデータベースから読み出すことができる.setAttribute()メソッドは、サーブレットContextのインスタンスにキャッシュクラスを保存します.2)プログラムはサーブレットContextを使用する.getAttribute()キャッシュを読み込みます.JSPの場合はa pplicationを使用する.getAttribute().サーブレットの場合はgetServiceletContext()を使用します.getAttribute().アクセス数などのキャッシュが変化した場合は、キャッシュとファイル/データベースを同時に変更できます.あるいは、変化が一定のプログラムに蓄積されてから保存しても、次のステップで保存することができます.3)サーバがシャットダウンしようとすると、サーブレットContextListenerのcontextDestroyed()メソッドが呼び出されるので、キャッシュの変更を保存します.変更したキャッシュをファイルまたはデータベースに保存し、元の内容を更新します.
import User; //my own class
import DatabaseManager; // my own class
import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;

public class MyContextListener

	implements ServletContextListener {
	private ServletContext context = null;

	public void contextInitialized(ServletContextEvent event) {
		context = event.getServletContext();
		User user = DatabaseManager.getUserById(1);
		context.setAttribute("user1", user);
	}

	public void contextDestroyed(ServletContextEvent event) {
		User user = (User)context.getAttribute("user1");
		DatabaseManager.updateUserData(user);
		this.context = null;
	}
} 

2)一つのプロファイルの符号化フォーマットを判断する:
public class InitProperties implements ServletContextListener {
	
	private static final Logger logger = Logger
			.getLogger(InitProperties.class);

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		// TODO Auto-generated method stub

	}
/**
 *                     utf-8                            
 * **/
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		
		//                utf-8   
		try {
			String fileUrl = PropertiesHander.class.getResource("/evoucher.conf").toString();
			fileUrl = fileUrl.replace("file:","");
					
			File file = new File(fileUrl);
			InputStream	ios = new java.io.FileInputStream(file);
				byte[] b = new byte[3];
	
				try {
					ios.read(b);
					ios.close();
					} catch (IOException e) {
							
							logger.error("                ");
					}
		      
				//      23  23   23                 
				if (b[0] == 35 && b[1] == 35 && b[2] == 35)

				 {
					logger.info(file.getName() + ":       ");	
				 }
				  //utf-8         ef  bb  bf 
				else if (b[0] == -17 && b[1] == -69 && b[2] == -65)

				 {
					logger.info(file.getName() + ":   UTF-8");	
				 }

				else
				 {
					 try{
				     // logger.error(file.getName() + "        UTF-8  ,         !");
				      throw new EVoucherException(file.getName() + "        UTF-8  ,         !");
					 }
					 catch(EVoucherException e){
					 // logger.error(e);
					  EVoucherException.getEVException(null, e, logger);
					  System.exit(0);
						
					 }

				  }
						
			} catch (FileNotFoundException e) {
					
				logger.error("             ");
					
			}

	}

}

四)サービスレットContextListenerの配置
<listener>
	<listener-class>MyServletContextListener</listener-class>
</listener>
<!--            utf-8   -->
	<listener>
      <listener-class>assp.evoucher.common.util.InitProperties</listener-class>
    </listener>