2013年6月17日月曜日

Servletでの起動時外部ファイル読み込み方法

Servletを用いたアプリケーションを開発する上で、アプリケーションサーバの起動時に、プロパティファイルなどの外部ファイルをメモリに保存し、使いまわしたいと言うことがあると思います。
そんな時に、どのようにして実装するかのメモをここで記載したいと思います。

前提条件

  • Servlet3.0
  • Java 1.7.XX
  • JBoss As 7

プロパティファイルの設定

WEB-INFの直下にinit.propertiesと言うファイルを作成し、以下の情報を入力します。

hoge=1
hoge2=aaaa

また、xmlファイル形式のサンプルとしてinit.xmlと言うファイルを作成し、同様にWEB-INFの直下に以下の情報を入力し、作成します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
 <comment>java.util.PropertiesのXML形式設定ファイル</comment>
 <entry key="hoge">hoge</entry>
</properties>

外部ファイルの読み込み


package test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.io.IOUtils;

@WebListener
public class SampleContextListener implements ServletContextListener {

 @Override
 public void contextInitialized(ServletContextEvent contextEvent) {
  ServletContext context = contextEvent.getServletContext();
  Properties initProp = getProperties(context.getRealPath("/WEB-INF/init.properties"));
  context.setAttribute("prop", initProp); //アプリケーションスコープに保存
  //xml形式の読み込み
  Properties initXmlProp = getPropertiesByXml(context.getRealPath("/WEB-INF/init.properties"));
  context.setAttribute("xmlProp", initXmlProp); //アプリケーションスコープに保存
}
 
 private Properties getProperties(String path) {
  InputStream in  = null;
  Properties prop = null;
  
  try {
   in = new FileInputStream(path);
   prop = new Properties();
   prop.load(in);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   IOUtils.closeQuietly(in);// Apache Commonsを使用
  }
  
  return prop;
 }

private Properties getPropertiesByXml(String path) {
 Properties prop = new Properties();
 try {
  prop.loadFromXML(new FileInputStream(path));
 } catch (IOException e) {
  e.printStackTrace();
 }
 return prop; 
}
 @Override
 public void contextDestroyed(ServletContextEvent sce) {
  // TODO 自動生成されたメソッド・スタブ
  
 }
}


ServletContextListenerとはサーブレットコンテキストが起動する時や破棄する時に呼び出されるインターフェイスであり、
contextInitializedは、起動時に読み込まれるため、ここで外部ファイルをアプリケーションスコープに保存しておきます。

読み込んだ変数の使い方


xml形式も同様な使い方である
package test;

import java.io.IOException;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="test", urlPatterns={"/test"})
public class TestServlet extends HttpServlet {
 /**
  * プロパティ.
  */
 private Properties prop;
 
 @Override
 public void init() {
  ServletContext context = getServletContext();
  this.prop             = (Properties) context.getAttribute("prop"); 
 }
 
 @Override
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  
  response.setContentType("text/plain;charset=Windows-31J");
  response.getWriter().println("hoge2=" + prop.getProperty("hoge2"));
 }
}


サーブレットのinitでアプリケーションスコープに保存していたプロパティ情報を取得し、それを表示するプログラムです。
Webブラウザで実行した結果は、以下のようになります。

外部ファイルを読み込み使用した結果

Written By : // 13:26
Category:

0 コメント:

コメントを投稿

 

About

このブログは筆者の備忘録として色々記載しています。

Blog Archive

Powered by Blogger.