javaを使って掲示板作成
どうも。新人エンジニアのhondaです。
今回は、java servletを使って掲示板を作成する課題に取り組んだので投稿します。
*以下の内容はサーバサイドjavaのプログラムがどう動いているかを、全体的な視点で見たものを記述しています。理解があやふやなところはできるだけ調べて書いていますが、間違っている記述もあるかもしれません。参考程度に読んでいただければ幸いです。 また間違いなど、よろしればご指摘ください。
はじめてのservlet
java servletというjavaの機能を使ってwebアプリを作りました。
javaのプログラムは1ヶ月ほど学んできましたが、webはいろいろと分からないことが多く苦労したのでその辺を書いていこうと思います。
servletとはjavaでwebサービスを作るための、javaで書かれたプログラムで、webに必要なhttp通信等の機能を実装したクラス(?)の集合(パッケージ?)であると理解しています。
なので普通のjavaのプログラムにimportして使います。
そしてインポートするべきservlet-apiはjdkには入って無いのでダウンロードする必要があります。
tomcatというservletを動かすserverをインストールすればその中にservlet-api.jarというファイルがあるのでここにクラスパスを通します(環境変数の設定)。これにクラスパスを通せばservlet をimportしたjavaをコンパイルできます。
importするとhttp requestとresponse を使ってクライアントと情報のやり取りをすることができるようになります。
こんな感じで、servletを使える環境をつくりました。
tomcatのファイル配置
その後、理解に苦しんだのがtomcatにファイルをどう配置すればいいのかという点です。
いろいろと調べまわった結果、以下のようにファイルを配置すればいいことが分かりました。
まずtomcat内のwebapps下にプロジェクトのディレクトリを配置します。 (webapps/bulletinBoard みたいな感じ)
続いて、bulletinBoardの中にWEB-INFというディレクトリを作ります。 (bulletinBoard/WEB-INF)
そして、このWEB-INFの中にservletプログラムを配置します。
最後に、WEB-INF下にweb.xmlというファイルを作ります。ここにはservletにアクセスするためのurl等が記録されています。
基本的にはこの構成でサーブレットを動かします。
servletを継承したjavaクラスファイルをWEB-INF下に置き、web.xmlに記述したurlでブラウザからアクセスします。
たとえば、web.xmlにlogin というURLとLoginServlet.javaというservletファイルの関連を記述しておけば、webからはlocalhost:8080/bulletinBoard/loginといったURLでservletファイルにアクセスできます。
WEB-INF下のファイルにはブラウザからは直接アクセスできないので、web.xmlに記載のurlにアクセスしてもらって、そのURLとweb.xmlを元にサーバーはservletを探し出して、クライアントにサービスを提供します。
servletでMVCモデルを構築
servletでwebアプリを作るときは、
servlet → コントローラー(クライアントからリクエストを受け付けて、必要な処理をモデルに指示して、情報をビューに返す)
java Beans (あるいは普通のjavaクラス?) → モデル(コントローラーから指示を受けて情報を処理。DB通信もこのクラスで行う)
jsp → ビュー(コントローラーから受け取った情報をhtmlとして表示)
という役割分担でクラス設計をします。
jspとはhtmlにjavaのコードを埋め込むようにして使えるようにしたプログラムのことです。htmlにjavaコードが入っているので、servletからもらったDBの情報などをjavaからテキストとして出力し、ブラウザはそのテキストを読み込みます。ということなので、テキスト出力はHTMLの文法にのっとって書きます。 (実際はjspもservletを継承したクラスで、servletがout.println()とかやってテキスト(HTML)を出力するのを、うまいこと書きやすいように変換してるプログラム?みたいです。なので、jspを読み込む際は、jspをjavaプログラムに変換 → コンパイル → 実行 → HTMLのテキストが出力される → ブラウザはこれを読む という感じになっているのだと思います。)
その一方、java Beans はモデルとしてビジネスロジックを担当します(とwikipediaには書いてあります)。java Beansとはプロパティとそれに対するgetter, setterを持った普通のjavaクラスです。このプロパティに、たとえばDBからとってきたデータをセットして、コントローラー → ビューに渡して表示をします。ということなので、java Beans自体は情報だけ保持して処理を持たないので、DB接続等の処理は普通のjavaクラスに持たせます。
そして、servletはクライアントからのリクエストを受け付けて、内容によって処理を分岐させてモデルに処理を指示して、処理した情報を受け取ります。その後、表示すべきjspを選択しクライアントに表示します。クライアントがjsp(HTMl)を参照して再びリクエストを送ってくるとサーブレットがこれに対応します。
(というわけなので、基本的にjspファイル(ビュー)もサーブレット経由で表示するので、ブラウザから直接は見えないWEB-INF下に配置します。いちおうWEB-INF外に置いてブラウザから直接アクセスしてもらうこともできます。
そして、気をつける点として、WEB-INF下にCSSやJSファイルを置くと、ブラウザから参照できないのでフロントに反映されません。これは、jspファイルにアクセスするとjavaプログラムの出力としてHTMLが表示され、ブラウザはこれを読み込んだ後にHTMLに記載のlinkをたどってcss,JSを読みに行こうとするからです。つまりservletの指示で読み込みに行っているわけではないので、WEB-INF下は参照できない、と理解しています。)
掲示板の作成
以上の感じでサーバサイドjavaを理解しつつ、掲示板を作成しました。
今回は
- apache-tomcat-8.0.36
- mysql 15.1
- IDEはeclipse
で作成しました。
成果物は会員制の掲示板で以下の機能があります。
- 会員制でユーザー名とパスワードで認証
- カテゴリー→スレッド→コメントという階層状に情報を保存
- 画像のアップロードできる
- 会員別に投稿情報を管理し、自分の投稿のみを削除できる
大雑把にはこんな感じです。
いちおうクラス図だけアップしておきます。
掲示板作成後に知ったのですが、DB接続はそれぞれの処理(SELECT、UPDATE、INSERT、DELETEなど)ごとに分けるべきらしいです。また、各サーブレットごとにセッションクラス(?)を用意して、処理を記述する方法もあるらしいです。
課題を終えて
ひとつのwebアプリケーションを作ってみることで、全体像が理解できて大変勉強になりました。
webアプリひとつ作るだけで、HTML,CSS,Javascript,サーバサイド言語の4つのスキルを身につけなければならず、求められるものが多いなと感じました。
また、webの技術はブラックボックスが多いなと感じました。たとえば、httpリクエストを送るときにはどんなプログラムが動いているのかなどを考えなくても、getとpostで送信するんだと理解しておけばコードは書けます。
ただ、その裏側まで理解した上でプログラムを作っていくことが重要だと思いました。それが本質を理解してコードを書くということだと思います。
総じて、webの技術の奥の深さが分かった課題でした。