忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/10/19 14:25 |
JavaServlet1-1:JavaサーブレットでHelloWorld

オブジェクト指向の極致として登場し、鎧袖一触に他のサーバサイド言語を駆逐するはずだったJavaですが、設計者実装者のセンスが絶望的に悪すぎたため全く普及しませんでした。
間違いなく30年後には滅びてますが(でもCは残ってる)、Web2.0とかが大好きな人たちの間で流行っているようなので現在は使わざるを得ません。

一口にJavaと言ってもWebで使用されるのは主にJavaサーブレットと呼ばれる言語です。
Web系だけでも他にJSP、XMLシンタックス、ELといった各種言語があり、それぞれに全く互換性がありません。
それらをXMLとで無理矢理結び付けただけの寄せ集め言語Javaを学習していきます。

Java実行環境を手に入れるには、まずJDK(JREではない)、Apache、Tomcatをインストールし、各設定ファイルを正しく変更し、コンテナを記述してWebアプリケーションを登録しなければなりません。
一般人には不可能なので、統合開発環境に任せてしまいましょう。
Javaの統合開発環境としてはEclipseが有名ですが、英語です。
最初から各種プラグインを搭載した上で和訳してくれているPleiadesがありますのでそちらを使用します。
http://mergedoc.sourceforge.jp/
こちらからJRE付きのJavaWTPをダウンロードしてインストールします。
上記全ソフトウェアのインストール及び設定ファイルの変更等を自動的に行ってくれます。
それ以外にも開発環境支援機能が満載なので使い慣れましょう。

インストールしたら早速Javaサーブレットを作ってみます。
Javaサーブレットといっても、Web向けに拡張されたクラスを使用した、単なるJavaアプリケーションです。
Javaの基本を学習するだけで年が明けますが、基本を学んだところで使わないのでスルーということで。

まずウィンドウ→ビューの表示→ナビゲーターで左側にナビゲータを開きます。
次にナビゲータの上で右クリック→新規→プロジェクト(R)→動的Webプロジェクトを作成します。
パッケージ名はとりあえずexampleにしておきます。
よくわからない部分はデフォルトのままにしておいて問題ありません。
自動的にいくつかフォルダが作成されますが、使用するのは「src」と「WebContext/WEB-INF/web.xml」ファイルです。
srcフォルダにはJavaサーブレットのソースを置き、web.xmlではサーブレットとURLの関係を記述します。

まあまずはsrcフォルダに新規ファイルを作成します。
Javaではファイル名とクラス名を同じにしなければならないという決まりがあるので注意しましょう。

HelloWorld.java

//パッケージ
//package com.hogehoge.www;

//必要なクラスをロード
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;

//HttpServletクラスを継承
public class HelloWorld extends HttpServlet {
 //serviceメソッドを上書き
 public void service(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException{
     PrintWriter out = res.getWriter();
     //実際の出力内容
     out.println("<HTML><BODY>");
     out.println("HelloWorld!\n");
     out.println("</BODY></HTML>");
 }
}


次にweb.xmlを編集します。

WebContents/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
 <display-name>example</display-name>
 <servlet>
  <servlet-name>Hello</servlet-name>
  <servlet-class>HelloWorld</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>Hello</servlet-name>
  <url-pattern>/Hello</url-pattern>
 </servlet-mapping>
</web-app>


この後Ctrl+F11を押すと、自動的にサーバが起動した挙句404エラーが出てきますが、気にせずブラウザに、
http://localhost:8080/example/Hello
と入力しましょう。

問題が無ければブラウザに「HelloWorld!」と表示されるはずです。

既にうんざりですが今からこれの解説を行いましょう。
まずフォルダ配置から。

WebContentフォルダがドキュメントルートとなります。
Javaサーブレット以外の通常のHTMLコンテンツは、WebContent以下の自由な場所に置いてかまいません。
アクセスする場合も、
http://localhost:8080/example/index.html
と普通にファイル名を記入するだけでアクセスすることができます。

WebContent/WEB-INFフォルダはJavaによって制御されており、普通にアドレスを入力しても見ることができません。

srcフォルダは、Javaサーブレットのソースファイルを置いておく場所です。


今度はファイルの中身です。

最上段のパッケージですが、srcからのフォルダ構成を記入します。
今回は直接src直下に置いているので使用しませんが、基本的にpackage要素は必須となります。
上の例では、このファイルはsrc/com/hogehoge/www/HelloWorld.javaに存在するということになります。

ちなみにpackageはドメインを逆から設定するという緩やかな掟があり、そうすることで世界中で重複を防ぐという意図があります。
今回はローカルなので意味がありませんが。

次のimportですが、Javaは素の状態ではテキストの表示すらできません。
処理を行うのに必要なクラスを毎回ロードする必要があります。
こんなとこだけcを真似なくてもよいものを。

java.io.PrintWriterおよびjava.io.IOExceptionクラスは、文字の読み書き機能およびその際起こる可能性のあるエラー処理機能を提供します。
javax.servlet.http.HttpServletクラスはあらゆるJavaサーブレットが必ず継承しなければならないクラスです。
クライアントからの要求やサーバ情報をjavax.servlet.http.HttpServletRequestインターフェイスで受け取り、その要求への応答をjavax.servlet.http.HttpServletResponseインターフェイスに返します。
javax.servlet.ServletExceptionはサーブレットでエラーが起きた際の処理機能です。

以上はサーブレットを作成する際に最低限必要なクラスです。
それ以外にも日時を取得したくなったらjava.util.Calendarをインポート、セッションを使いたければjavax.servlet.http.HttpSessionをインポート、といったふうに馬鹿みたいなimport文を書く必要があります。


public class HelloWorld extends HttpServlet
は、こう書く決まりです。
HelloWorld部分にファイル名を入れますが、それ以外はそのままにします。
ここから、HttpServletクラスを継承するHelloWorldクラスを作成していきます。


public void service(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException
こちらは、一字一句違わずにこう書く決まりです。

HttpServletクラスには幾つかのメソッドが定義されており、それを変更することで目的の動作を作成していく、というのがJavaサーブレットの基本的な作成方法となります。

Javaサーブレットは、呼び出されたときに自動的にserviceメソッドが実行されます。
serviceメソッドは、デフォルトではリクエストがGETならばdoGetメソッドを実行し、POSTならばdoPostメソッドを実行するといった振り分け処理を行っています。
今回は振り分けを行う必要が無いのでserviceメソッドを上書きします。

service,doXXXメソッドは引数にHttpServletRequestとHttpServletResponseを取り、ServletExceptionとIOExceptionをスローするという決まりになっています。
リクエスト元から渡されたヘッダやパラメータをHttpServletRequestから取得し、応答をHttpServletResponseに乗せて送り返すという流れです。

PrintWriter out = res.getWriter();
HttpServletResponseインターフェイスがServletResponseから継承したgetWriterメソッドを使用し、PrintWriterオブジェクトを作成します。
PrintWriterオブジェクトのprintlnメソッドを使用することで、応答メッセージをHttpServletResponseに返すことができます。

何を言ってるのかさっぱりわかりませんね。
とりあえずは全部コピペしておいて、必要部分だけ変更することにしていけばいいです。

次にweb.xmlですが、これはJavaサーブレットと、ブラウザのURL欄に入力するアドレスとを結びつけるファイルです。
まずはservlet-mappingです。

 <servlet-mapping>
  <servlet-name>HelloServlet</servlet-name>
  <url-pattern>/Hello</url-pattern>
 </servlet-mapping>

こう書くことで、URL欄にHelloと記入した際、HelloServletという名前のサーブレットが実行されます。
これで終われば早かったのですがそうはいきません。

 <servlet>
  <servlet-name>HelloServlet</servlet-name>
  <servlet-class>HelloWorld</servlet-class>
 </servlet>

こう書くことで、HelloServletという名前のサーブレットに、HelloWorldというクラスを結び付けます。
面倒ですね。
まあこうなっているのにも理由があるのですがまたいずれ。

ちなみにweb.xmlには、直感とは逆に<servlet><servlet-mapping>の順番で書き込まないと動作しません。
他にも面妖極まりない仕様満載で非常に大変なのですがまあまた今度。

HelloWorldと表示するだけで日が暮れそうですが、次回は日が明けそうなリクエストパラメータで。

PR


2008/06/02 11:09 | Comments(0) | TrackBack(0) | Java

<<前のページ | HOME |
忍者ブログ[PR]