Eclipseでウェブ開発を始める~Java Servlet 二歩目 Servletを動かす~

イントロダクション

前回はEclipseを使用して、JavaServletの起動環境を作成しました。

観光構築だけで、起動確認はしていなかったので、これを確認するところから始めます。

Servletを動かす

前回作成したサーブレットは下のようなもの(コード)です。

/**
 * Servlet implementation class SrvLesson1
 */
@WebServlet("/SrvLesson1")
public class SrvLesson1 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public SrvLesson1() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

これを実行すると、下のような表示ができます。

「?????」と表示されているのは、文字コード(charset)が指定されていないからです。
これを指定するには下の王なコードを書きます。

response.setContentType("text/html; charset=UTF-8;");

そして、実行結果は下のようになります。

Tomcatについて

TomcatはWebコンテナ、APサーバーなどと呼ばれる分類に入る「サーバー」です。
サーバーは複数個所から、アクセスを受けて、それぞれのリクエスト(入力やボタン押下)に対する処理を行い、レスポンスという形で処理の結果をクライアントに返します。

絵にすると下のような感じです ※画力が。。。

コード解説

JavaServeltの実装にはいくつかのポイントになる部分があります。

  1. クライアントとサーバーの関係がある。
    クライアント(ブラウザ(IEやChrome, FireFox, Safariなど))とサーバー(Javaで作成したサーブレットが動くTomcatのようなアプリケーション)。クライアントはサーバーにリクエストを送信、サーバーはクライアントへレスポンスを送信する。

  2. HTMLのFormタグにある「action」属性にサーブレットを指定する。
    action="SukiriWeb2/SrvLesson1"などのように指定すると対象のURLに指定したサーブレットが起動する。

  3. レスポンスは、HTMLでブラウザに表示される。

コード内容

リクエストの種類には「GET」と「POST」があり、サーブレットに実装(オーバーライド)している「doGet()」と「doPost()」がそれぞれに対応する。
つまり。GETリクエストの時は「doGet()」POSTリクエストの時は「doPost()」が動く。

それぞれの処理の最後に「response.getWriter()」とあるが、これは返却するレスポンスに、返却する内容を追加するためのオブジェクトを取得するということです。

具体的には、PrintWriterクラスですが、このクラスにHTMLを書きこむことで、ブラウザに表示するHTMLを返却することができます。

つまりは、そのような仕組みになっている(フレームワーク化されている)ということです。

コードをいじってみる

返却する値を作成しているのは、サンプルにあるコードは下のようなものです。

StringBuilder build = new StringBuilder();
build.append("<!doctype html>");
build.append("<html>");
build.append("    <head>");
build.append("        <title>aaa</title>");
build.append("<body>はじめのサーブレット</body></html>");

そして、HTMLを返却するだけでなく今まで学習してきた処理を行うこともできます。

try {
    PreparedStatement pre = H2dbManager.getInstance().createPreparedStatement(SQLConst.INSERT_USER_TABLE);
    pre.setString(1, userName);
    pre.setString(2, passwd);
    pre.setInt(3, 1);
    if (pre.execute()) {
        throw new SQLException("ユーザー登録に失敗しました。");
    }
} catch (SQLException e) {
    // TODO 自動生成された catch ブロック
    e.printStackTrace();
    return false;
}

「一度書けばどこでも動く」というのがJavaのウリです(笑)

上の処理は、H2DBへのアクセスを行うための「H2dbManager」クラスを作成したので、そこからSQLを発行するために以下のようなことを行っています。

  1. PreparedStatementクラスを取得
  2. 実行するSQLの設定(パラメータを設定できるようにしている)
  3. パラメータの設定
  4. SQLの実行

ユーザー登録の処理です。詳細に関しては、以下に記載します。

H2DBManagerクラス

/**
 * プライベートコンストラクタ、H2DBのコネクションを取得する。
 * {@link H2dbManager#getInstance()}
 */
private H2dbManager() {
    try {
        Class.forName("org.h2.Driver");
        // 「~」はマイドキュメントを示す。
        con = DriverManager.getConnection("jdbc:h2:tcp://localhost/~\\workspace\\SukiriWeb2\\WebContent\\WEB-INF\\database");
        Statement stmt = con.createStatement();
        stmt.execute(SQLConst.CREATE_USER_TBL);
        stmt.execute(SQLConst.CREATE_ITEM_TBL);
        stmt.execute(SQLConst.CREATE_ITEM_TYPE_TBL);
    } catch (SQLException e) {
        e.printStackTrace();
        System.exit(-1);
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(-1);
    }
}

/**
 * このクラスのインスタンスを取得する。
 * @return H2dbManagerインスタンス
 */
public static H2dbManager getInstance() {
    if (instance == null) {
        instance = new H2dbManager();
    }
    return instance;
}

Eclipseでウェブ開発を始める~Java Servlet 初めの一歩~

イントロダクション

ウェブシステムを開発するのにPHPが広く使われていますが、Javaでもできます。
というかでかいシステム(業務用など)は大体Java言語で作成されたシステムが多いのです。

理由

Javaはスピードと安定性においてほかの言語(PHPなど)に比べて処理スピードが速いようです。
以下のサイトを参考にしました。

  1. PHP vs Java
  2. Node vs. PHP vs. Java vs. Go

ほかに、適当なサイトが見つからなかったもので。。。
ちなみに、2のサイトではGo言語が1位でした。しかし、こちらのサイトで処理の内容をおみてみるとJavaのプログラムはスピード向けの実装になっていない。。。

自分の、感想としては、簡単なコードで実装するのであればGoの方が速いと思いました。
まぁ、簡単なコードの方がよいのですが、実装方法に関してはその人のスキルになるので何とも言い難しですね。。。

Javaの魅力は、ほぼ大体のことができ、指定した言語を取り込む(C言語で書かれたコードをJava言語として実行する)ことや、
実行するOSから別のスレッドで他のアプリケーションを起動できたりします。

開発準備

気を取りなおして、Javaの開発を進めます。
まずは、インストールするものがあります。それはEclipseです。こちらのサイトからできます。

こちらから最新のものを選択してインストールしてください。
詳細に関しては、こちらのページに記載しています。

設定方法に関しては、こちらにあります

ウェブ開発を始める

具体的に・・・

下のようなイメージのアプリケーションを作成します。

・自分のPC上でアプリケーション・サーバーを動かす
・いつものブラウザで、アプリケーション・サーバーにアクセス
・指定したサーブレットクラスを動かす。
・新しいURLの指定し方やり方

環境構築(Eclipseのプロジェクト)

  1. プロジェクトを新規で作成する

  1. 作成したプロジェクトにフォルダーを追加します。
    「classesフォルダ」を作成し以下のようにビルドパスに追加する

  1. Serveltクラスを作成する

    /**
    * Servlet implementation class SrvLesson1
    */
    @WebServlet("/SrvLesson1")
    public class SrvLesson1 extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SrvLesson1() {
        super();
    }
    
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }
    
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    }
  2. サーバーを追加する(Tomcat8.XXXX)

  1. 作成したプロジェクトをサーバーに追加する

  2. サーバーを起動する。

  3. 作成したサーブレットが動くことを確認。

まとめ

これが作成できたら、あとは、どのようなものを作成するのか考えていきます。
現状では、Javaでサーバー側のプログラム、サーブレット(サーバー処理)を実行できるような状態になっています。

仕組みとしては、「@WebServlet("/SrvLesson1")」で指定しているURL「/SrvLesson1」にアクセスしたときにこのサーブレットが動く状態です。
実際にURLにアクセスするときは下のような形で指定します。

「localhost:8080/プロジェクト名/指定しているURL」 => 「localhost;8080/SukiriWeb2/SrcLesson1」

まずは、一区切りということで。。。

でわでわ。。。