じぶんメモ

プログラミングのメモ、日常のメモとか。

tomcat起動スクリプトを自作する

tomcat起動法

CentOStomcatを起動すると、以下の場所に起動シェルスクリプトが生成される。
(環境によって違うかも)

/usr/local/tomcat/bin/startup.sh 

これを実行すればtomcatが起動されるが、面倒なのでservice tomcat startで起動できるようにする。

起動スクリプトファイルの作成

まずはファイルの作成。

vi /etc/rc.d/init.d/tomcat

ファイルに以下の内容を作成。

#!/bin/bash
# Startup script for the Tomcat Servlet Container
#
# chkconfig: 2345 35 65

export LANG=ja_JP.UTF-8

TOMCAT_HOME=/usr/local/tomcat
LOCKFILE=/var/lock/subsys/tomcat

# source function library
. /etc/rc.d/init.d/functions

start(){
    # ロックファイルがなければ起動を開始する
    if [ ! -f ${LOCKFILE} ]; then
        echo "Starting tomcat"
        #sudo -u tomcat ${TOMCAT_HOME}/bin/startup.sh
        ${TOMCAT_HOME}/bin/startup.sh
        sleep 1
        PID=`ps -ef | grep catalina.home=${TOMCAT_HOME} | grep -v grep | awk '{print $2}'`
        echo ${PID} > ${LOCKFILE}
    else
        echo "tomcat is already running"
    fi
}

stop(){
    if [ -f ${LOCKFILE} ]; then
        echo "Shutting down tomcat"
        #sudo -u tomcat ${TOMCAT_HOME}/bin/shutdown.sh
        ${TOMCAT_HOME}/bin/shutdown.sh
        echo "Shutted down tomcat"
        rm -f ${LOCKFILE}
    else
        echo "tomcat is not running"
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        #${TOMCAT_HOME}/bin/catalina.sh version
        if [ -f ${LOCKFILE} ]
        then
          echo "tomcat(pid:"`cat ${LOCKFILE}`") is running."
        else
          echo "tomcat is not running."
        fi
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status}"
esac

exit 0

TOMCAT_HOMEとLOCKFILEの場所は環境によって変えること。 あとは起動ファイルに権限を付与し、chkconfigをonにすればサーバー起動時に自動的にtomcatが起動される。

sudo chmod 755 /etc/rc.d/init.d/tomcat
sudo chkconfig tomcat on

使用方法は以下の通り

sudo service tomcat start
sudo service tomcat stop
sudo service tomcat restart
sudo service tomcat status

Javaでファイルダウンロード

Javaでファイルをダウンロードする方法について調査した。
ファイルをBufferedInputStreamにし、viewへのリターン時にアノテーションでパラメータとして設定する。
以下Struts2を使用した実装例。

 

@Result(name="success",   value  = "inputStream",
                     params = { "inputName",          "inputStream",
                                "contentType",        "application/octet-stream; charset=UTF-8", 
                                "contentLength",      "${contentLength}",
                                "contentDisposition", "attachment; filename=${fileName}" },
                                 type   = StreamResult.class)

public class DownloadAtion {
  /** ファイルダウンロード用InputStream */
  private InputStream inputStream;
  /** ダウンロードファイル名 */
  private String fileName;
  /** ダウンロードファイルサイズ */
  private long contentLength;

  public String download() throws Exception {
    String sampleFilePath = "/usr/local/files/test.txt";
    File downloadFile = new File(sampleFilePath);

    // ファイルが存在し、ディレクトリで場合にダウンロードを行う。
    if (downloadFile.exists() && !downloadFile.isDirectory()) {
      try {
        // ダウンロード用にinputStream化する。
        inputStream = new BufferedInputStream(new FileInputStream(sampleFilePath));
        // ファイル名
        fileName = URLEncoder.encode(downloadFile.getName(), "UTF-8");fileName = URLEncoder.encode(downloadFile.getName(), "UTF-8");
        // ファイルのバイト数
        contentLength = downloadFile.length();
    
        return "success";
      } catch (Exception e) {
        return "error";
      }
    }

    // ファイルが存在しないか、パスがファイルでない場合はエラーを返す。
    return "error";
  }

  /**
   * ファイルダウンロード用InputStreamを取得します。
   * @return ファイルダウンロード用InputStream
   */
  public InputStream getInputStream() {
    return inputStream;
  }

  /**
   * ファイルダウンロード用InputStreamを設定します。
   * @param inputStream ファイルダウンロード用InputStream
   */
  public void setInputStream(InputStream inputStream) {
    this.inputStream = inputStream;
  }

  /**
   * ダウンロードファイル名を取得します。
   * @return ダウンロードファイル名
   */
  public String getFileName() {
    return fileName;
  }

  /**
   * ダウンロードファイル名を設定します。
   * @param fileName ダウンロードファイル名
   */
  public void setFileName(String fileName) {
    this.fileName = fileName;  
  }

  /**
   * ダウンロードファイルサイズを取得します。
   * @return ダウンロードファイルサイズ
   */
  public long getContentLength() {
    return contentLength;
  }

  /**
   * ダウンロードファイルサイズを設定します。
   * @param contentLength ダウンロードファイルサイズ
   */
  public void setContentLength(long contentLength) {
    this.contentLength = contentLength;
  }

}

Javaでのファイルアップロード

Javaでファイルアップロードを実装する方法を調べた。
FileUtilsのcopyFileが使い勝手が良さそう。

*画面側

<input type="file" name="inputFile />

*Java

    public String upload() throws Exception {
        // ファイルアップロードのテスト
        String destPath = "/usr/local/tomcat/webapps/upload";
        String myFileFileName = "uploadFile";

        try{
            File destFile  = new File(destPath, myFileFileName);
            FileUtils.copyFile(getInputFile(), destFile);
        }catch(IOException e){
            e.printStackTrace();
            return ERROR;
        }
    }

    /**
     * 取込ファイルを取得
     * @return 取込ファイル
     */
    public File getInputFile() {
        return inputFile;
    }

    /**
     * 取込ファイルを設定
     * @return 取込ファイル
     */
    public void setInputFile(File inputFile) {
        this.inputFile = inputFile;
    }

Javaでバイト数での空白埋め

空白埋めにはString.format("%10s", value)を使用すれば良いが、
String.format()はマルチバイトも1文字として認識するため、
固定長ファイル出力など、バイト数での空白埋めをするには個別で実装する必要がある。

以下文字をSJISとして扱った場合の空白埋め

public class Test{

     public static void main(String []args){
        String value = "テスト";
        value = fillUpSpace(value, 10);
        System.out.println(value);             //"テスト    "として出力される。
     }
 
     public static String fillUpSpace(String val, int num) {
        String fillUppedString = val; 
        int len = 0;

        try {
            // SJISでのサイズ取得 
            len = val.getBytes("sjis").length;

            if (num <= len) {
                // 引数の桁より少ない場合は引数の桁に切り捨てる
                fillUppedString = new String(val.getBytes("sjis"), 0, num, "sjis");
            } else {
                for(int i = 0 ; i < (num - len); i++) {
                    fillUppedString = fillUppedString + " ";
                }
            }
        } catch(Exception e) {
          return "";  
        }
        
        return fillUppedString;
     }
     
}