Javaソースファイルの作成

Webアプリケーション作成プロセス02

サーバーサイドJavaを初めて学習される方が初めて学習する内容はHttpServletを継承したサーブレットアプリケーションを作成することです。

src/main/java以下に先のディレクトリ階層で以下のFirstServlet.javaを作成します。

jp.co.yourcompany.education.webapp.servlet.FirstServlet.java
/**
 * Copyright 2017 hoge.
 * 本ソースファイルの著作権は株式会社hogeに所属します。
 * 株式会社hogeの許可なくして、本ソースファイルの
 * 配布、改修、コピー、利用を禁止します。
 * 会社名				:株式会社hoge
 * 組織名				:システム開発部
 * プロジェクトコード	:education
 * バージョン			:1.0
 * 最終更新日時			:2017/02/10 17:21
 */

//package宣言部
package jp.co.yourcompany.education.webapp.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * このクラスは、サーバーサイドJavaを理解するための最初のサンプルです。
 * Serlvetを理解するための
 *
 * @author Raita.Kuwabara
 *
 */
public class FirstServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	
	private static Logger log = LoggerFactory.getLogger(FirstServlet.class);
	
	/**
	 * HttpリクエストGET時にサンプル1のHTMLファイルを出力する。
	 * @param req HTTPリクエストオブジェクト
	 * @parma resp HTTPレスポンスオブジェクト
	 */
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		log.info("doGet START");
				
		resp.setContentType("text/html");
		PrintWriter writer = resp.getWriter();
		writer.append("Tomcat Server doGet Recieve");
		writer.flush();

		log.info("doGet END");
	}
	
	/**
	 * HttpリクエストPOST時にサンプル1のHTMLファイルを出力する。
	 * @param req HTTPリクエストオブジェクト
	 * @parma resp HTTPレスポンスオブジェクト
	 */
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		log.info("doPOST START");
				
		resp.setContentType("text/html");
		PrintWriter writer = resp.getWriter();
		writer.append("Tomcat Server doGet Recieve");
		writer.flush();
				
		log.info("doPOST END");

	}
}
							

サーブレットに対応した必要最低限のweb.xmlは、以下となります。
URLとサーブレット名(どのような名称でも良い)、サーブレットクラスの完全修飾子を指定するだけです。

web/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

    <servlet>
      <servlet-name>firstServlet</servlet-name>
      <servlet-class>jp.co.yourcompany.education.webapp.servlet.FirstServlet</servlet-class>
      <!-- Load this servlet at server startup time -->
      <load-on-startup>5</load-on-startup>
    </servlet>

    <servlet-mapping>
      <servlet-name>firstServlet</servlet-name>
      <url-pattern>/firstServlet</url-pattern>
    </servlet-mapping>

</web-app>
							

Webブラウザから「http://localhost:8080/firstweb」を指定されたときにdoGetが実行されます。
formタグを利用してaction属性に「/firstweb」を指定したhtmlファイルをWebブラウザに返し、そのformタグ内のsubmitボタンを押下した場合には、doPostが実行されます。

HTTPプロトコルの「GET」と「POST」の違いをここでは理解して下さい。

サーバーサイドJavaのコンパイル

Webアプリケーション作成プロセス03

JavaSE、JavaEEのコンパイル方法は変わりません。クラスパス(classpath)に利用する外部ライブラリ(*.jar)を設定し、コンパイルするソースファイルを指定し、 javacコマンドを実行するだけです。JavaのコマンドにJavaプログラムの基本手順を記載しています。ご参照下さい。

javacコマンドやwarコマンドを実行するバッチファイルを以下のように作成します。「C:¥projects¥firstweb¥build」に保管します。

C:¥projects¥firstweb¥build¥websample1_build.bat
@echo off
rem Licensed to the gakumon.tech under one or more
rem 2017/02/10
rem ---------------------------------------------------------------------------
rem Start First Java Sample
rem ---------------------------------------------------------------------------

setlocal

rem check JAVA_HOME
if exist "%JAVA_HOME%" goto okExec
echo Cannot find "%JAVA_HOME%"
echo "JAVA_HOME is not setting."
goto end

:okExec
rem java
set JAVAC_COMMAND=%JAVA_HOME%\bin\javac
set CATALINA_HOME=C:\developer\webap\tomcat\tomcat_8.5.16
set SERVLET_LIB=%CATALINA_HOME%\lib
set JAVAEE_LIB=%SERVLET_LIB%\servlet-api.jar;%SERVLET_LIB%\annotations-api.jar;

set PROJECT_DIR=C:\projects\firstweb
set LIBS=%PROJECT_DIR%\web\WEB-INF\lib
set WEB_LIBS=%LIBS%\slf4j-api-1.7.25.jar;%LIBS%\logback-core-1.2.3.jar;%LIBS%\logback-classic-1.2.3.jar;
set CLASS_PATH=%JAVAEE_LIB%%WEB_LIBS%
echo CLASSPATH=%CLASS_PATH%

cd %~dp0\..
goto init

:init
echo 一時ディレクトリclassesを削除します。
rmdir /s /q web\WEB-INF\classes
goto execJavac

:execJavac
echo javacを実行します。
set JAVAC_COMMAND=%JAVA_HOME%\bin\javac
mkdir web\WEB-INF\classes > NUL 2>&1
set JAVAC_ARGS=-d web\WEB-INF\classes -sourcepath src\main\java @build\srclist -encoding UTF8 -cp %CLASS_PATH%
call "%JAVAC_COMMAND%" %JAVAC_ARGS%
goto execWar

:execWar
echo warファイルを構成します。

cd web
jar cvf ..\build\firstweb.war .

goto end
:end
							
C:¥projects¥firstweb¥build¥srclist
src\main\java\jp\co\yourcompany\education\webapp\servlet\FirstServlet.java
							
  • slf4j-api-1.7.25.jarは、SLF4Jダウンロード頁のslf4j-1.7.25.zipリンクから取得してください。
    取得したslf4j-api-1.7.25.jarをweb/WEB-INF/libに格納します。
  • logback-core-1.2.3.jar及びlogback-classic-1.2.3.jarは、logbackダウンロード頁のlogback-1.2.3.zipリンクから取得してください。
    取得したlogback-core-1.2.3.jar及びlogback-classic-1.2.3.jarをweb/WEB-INF/libに格納します。

要点としては、 javacコマンドのクラスパス引数-cpに「Tomcatのインストール先ディレクトリ/lib/servlet-api.jar」及びannotations-api.jarを指定し、 FirstServlet内で利用しているslf4jのライブラリをWEB-INF/lib/logback-classic-1.2.3.jar及びlogback-core-1.2.3.jar、slf4j-api-1.7.25.jarを指定している点です。

JavaEEのライブラリを利用してサーバサイドJavaのソースファイルを作成したり、コンパイルする方法は、JavaSEの基本的な方法と全く変わりありません。
テキストエディタ、Javaコマンド(JavaSE)とJavaEEライブラリだけでWebアプリケーションは作成できるのです。
そして、このクラスパス、javacコマンドとJavaソースファイル、jarファイル及びディレクトリの位置関係を正しく把握したエンジニアが基本を抑えて応用の利くエンジニアと言えます。

Javacバッチの実行

先の「websample1_build.bat」をコマンドプロンプトから実行します。

webasmple1_build.bat実行結果
c:\projects\firstweb\build>websample1_build.bat
CLASSPATH=C:\developer\webap\tomcat\tomcat_8.5.16\lib\servlet-api.jar;
C:\developer\webap\tomcat\tomcat_8.5.16\lib\annotations-api.jar;
C:\projects\firstweb\web\WEB-INF\lib\slf4j-api-1.7.25.jar;
C:\projects\firstweb\web\WEB-INF\lib\logback-core-1.2.3.jar;
C:\projects\firstweb\web\WEB-INF\lib\logback-classic-1.2.3.jar;
一時ディレクトリclassesを削除します。
javacを実行します。
warファイルを構成します。
マニフェストが追加されました
css/を追加中です(入=0)(出=0)(0%格納されました)
html/を追加中です(入=0)(出=0)(0%格納されました)
images/を追加中です(入=0)(出=0)(0%格納されました)
jsp/を追加中です(入=0)(出=0)(0%格納されました)
jsp/test.jspを追加中です(入=206)(出=152)(26%収縮されました)
エントリMETA-INF/を無視します
WEB-INF/を追加中です(入=0)(出=0)(0%格納されました)
WEB-INF/classes/を追加中です(入=0)(出=0)(0%格納されました)
WEB-INF/classes/jp/を追加中です(入=0)(出=0)(0%格納されました)
WEB-INF/classes/jp/co/を追加中です(入=0)(出=0)(0%格納されました)
WEB-INF/classes/jp/co/yourcompany/を追加中です(入=0)(出=0)(0%格納されました)
WEB-INF/classes/jp/co/yourcompany/education/を追加中です(入=0)(出=0)(0%格納されました)
WEB-INF/classes/jp/co/yourcompany/education/webapp/を追加中です(入=0)(出=0)(0%格納されました)
WEB-INF/classes/jp/co/yourcompany/education/webapp/servlet/を追加中です(入=0)(出=0)(0%格納されました)
WEB-INF/classes/jp/co/yourcompany/education/webapp/servlet/FirstServlet.classを追加中です(入=1365)(出=743)(45%収縮されました)
WEB-INF/lib/を追加中です(入=0)(出=0)(0%格納されました)
WEB-INF/lib/logback-classic-1.2.3.jarを追加中です(入=290319)(出=259113)(10%収縮されました)
WEB-INF/lib/logback-core-1.2.3.jarを追加中です(入=471884)(出=414284)(12%収縮されました)
WEB-INF/lib/slf4j-api-1.7.25.jarを追加中です(入=41203)(出=36523)(11%収縮されました)
WEB-INF/web.xmlを追加中です(入=1430)(出=733)(48%収縮されました)
c:\projects\firstweb\build>							
							

※.CLASSPATHの出力部は本頁用に改行しています。

Javaソースファイルにエラーが存在する場合には、Javaのエラーが出力されます。コンパイルエラーが無くなるまでソースの作成、コンパイルを実施します。

成功するとweb/WEB-INF/classesにクラスファイルが生成され、build配下にfirstweb.warが作成されます。