web.xmlのサーブレットContextListener
サーブレット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()メソッドが呼び出されるので、キャッシュの変更を保存します.変更したキャッシュをファイルまたはデータベースに保存し、元の内容を更新します.
2)一つのプロファイルの符号化フォーマットを判断する:
四)サービスレットContextListenerの配置
一)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>