はじめに
この連載では、「GlassFish」という製品を利用して、Java言語に親しんでもらうことを目的としています。第3回目の今回は、簡単なWebアプリケーションを作成しながら、ServletやJSP(JavaServer Pages)についての理解を深めていきたいと思います。
対象読者
- Javaでなにかしらのアプリケーションを作成したことのある方
- Javaの変数の宣言や、if文・for文・while文の制御文など簡単な文法を知っており、アプリケーションを作成したことのある方
オブジェクト指向プログラミングができなくとも構いません。徐々に学んでいければと考えています。また、学びやすいWebアプリケーションをサンプルとするので、Webアプリケーションとは違った分野を勉強したい方には当連載は向いていません。
仕様書バージョン
Java EE 5を使用するため、主な技術要素のバージョンは以下の通りです。EJBに関しては応用編で扱う予定です。
- Servlet:2.5
- JSP:2.1
- JSTL:1.2
- JTA:1.1
- EJB:3.0(応用編)
JSPって何?
筆者流に言うならば、Ajaxの羽根飾りの付いたHTMLの仮面を被ったServletであるというところでしょうか。前回も説明したように、JSPはServletの上に乗った仕様であり実装です。従って、JSPはServletに翻訳された後コンパイルされます。後ほど、JSPからServletに翻訳されたコードで説明します。Servletからout.println
でクライアントに返すHTMLを作成していましたが、その煩わしさから解放してくれます。ただこれだけの理由であれば積極的にJSPを作成する意味がありません。JSPの1番の魅力は動的なコンテンツの作成であると言えます。
JSP自体は可読性の高さ、再利用のしやすさを向上させるように進化してきたように思えます。JSP登場当初はHTMLにJavaコードが書けるということで飛びついた方も多かったように記憶しています。今ではJavaコードを極力書かないのが流儀となっているようです。
JSPファイルが難しく感じるようになったのは、JSPファイルにAjaxなどのコードが入るようになってからのように思えます。Javaコードを書かない代わりにJavaScriptでファイルが埋め尽くされていることもあります。可読性の高さを狙ったはずがJSPを含んだファイル自体の可読性は低くなったように感じるのは筆者だけでしょうか。そういう筆者もJavaScriptを多用するようになり、いかに可読性を高めるかに頭を抱える日々が続いています。
さらっと読んでも構いません
今回はNetBeansを使った説明はしません。次回、ServletとJSPの基礎を押さえたうえで簡単なWebアプリケーションを作成します。入門者にとってServletは非常に簡単な概念である一方、JSPはその構文を知らないとまったく理解できません。従って、今回はJSPで最低でも覚えてほしい構文を説明します。
入門者でなくとも構文だけ説明されて理解できるものではありません。構文と実際のコードがあって初めて理解可能となります。ただし、既存の書籍やサイトは入門者が間違いやすい点を分かりやすく説明できているとは思えません。当連載は筆者の理解に沿って入門者に分かりやすい表現を使っています。しかし、それでもJSPを理解するのは骨の折れる作業なので、今回はさらっと読んでいただき、次回の実際のサンプルアプリケーションで理解を深めてもらうのも1つの方法です。次回、分からない言葉が出てきた時に今回の記事に戻ってきてもらっても構いません。
また、JSP 1.Xの知識や経験はあるが、JSP 2.Xはないという方は、目新しい箇所だけ読んでいただければと思います。
JSPの作成はServletの1つのメソッドを作成するのと同義
JSPだけを作成していると気づかないのが、Servletに置き換えられた時のイメージです。JSPで宣言を使用するとフィールド変数やメソッドを作成することも可能です。ただ、普段作成するJSPであまり宣言は使用しません。JSPでメソッドを宣言しない場合、JSPは前回紹介したprocessRequestメソッドの内部をコーディングしていることと同じことだと考えて構いません。
宣言には注意
JSPのなかで<%! int a = 0 %>
のように変数を宣言すると、これはフィールド変数になります。従って、前回説明した「メモリの奪い合い」が起こるので慎重に扱う必要があります。入門者が陥りやすいバグです。また、メソッドを宣言すると先述のprocessRequestに相当するメソッドとは別のメソッドを定義することになります。
ライフサイクルもServletと同じ
JSPが翻訳されコンパイルされることを考えると、ライフサイクルもServletと同じになります。