前章で見た図書検索のWebアプリケーションは、検索結果がリスト表示されるだけで、本の詳しいデータを見ることはできませんでした。
ここでは、リスト表示のそれぞれの行をクリックすると、その本に関する詳細なデータが表示される機能を追加してみましょう。
Webで、あるページから別のページに移動するとき(こうしたことを「遷移する」といいます)、次のいずれかの手段によってHTTPの要求を出します。
このうち、後者の「フォームのボタンを押す」方法については、前章で解説しました。リンクを貼る場合には、JSPにハイパーリンクを貼っておくだけでよいのでしょうか?
ところが、Strutsのプログラミングスタイルでは、Webブラウザからの要求は、すべてActionクラスを通してからJSPページを表示するのが良いとされています。Actionクラスを通すということは、その情報がstruts-config.xmlに記述されるということです。
このことにより、Webページ間のすべての遷移をstruts-config.xmlにまとめて記述して、わかりやすいWebアプリケーションを作成できるようになります。
今回の図書検索アプリケーションの機能の追加では、リスト表示をするJSP (list.jsp)から、詳細表示をするためのプログラムに処理を移す必要があります。
そのため、list.jspでクリックされたときの要求は、まずActionクラスで処理され、その後でJSPで表示をします。
つまり、この機能追加によって、詳細表示のためのActionクラスとJSPをそれぞれ追加する必要があります。
ここでは、ActionクラスをSearchBookDetailAction.javaとし、JSPをdetail.jspとします。
これらのプログラムの追加は、struts-config.xmlに記述しなければいけません。
まず、JSP上のリンクからActionクラスを呼ぶには、次のようにglobal-forwards要素を追加します。ここでは、"search/detail"と指定されることによって、"/searchBookDetail.do"というActionクラスが呼ばれることを意味します。
<!-- ========== Global Forward Definitions ====================== --> <global-forwards> <forward name="search/detail" path="/searchBookDetail.do" /> </global-forwards>
加えて、Actionクラスが増えたため、ActionMappingのところに、Action要素を追加する必要があります。
リスト表示の中からある特定の行を選んで、その本に関する詳細なデータを表示するには、どのようにリンクを作成すれば良いのでしょうか。
ここでは、リンクのクリックによって、どの本の詳細データを表示するかWebサーバ側に伝える必要があります。要求のときに、クリックした本を特定できる情報をパラメータとして設定しなければならないのです。
ここで、本のデータベースのテーブルに着目してみます。このテーブルの主キーは"id"です。言うまでもなく主キーはテーブルの中でユニークですから、要求のパラメータにはその本の"id"項目の値を追加することで、詳細な情報が必要な本を特定できます。
例えば、次のようにしてid項目の値(ここでは12345)を渡します。
http://localhost:8080/library/searchBookDetail.do?id=12345
Webサーバ側では、このidというパラメータの値をもとに検索を実行すればよいのです。
このようなリンクを貼るために、Strutsでは便利なタグライブラリが用意されています。
その前に、ModelとなるBookData.javaを改造します。ちょっと見てみましょう。
...... ...... public class BookData implements Serializable { ...... ...... private Map mapping; public BookData() { mapping = new HashMap(); } public void setId(String id) { this.id = id; setMapping(); } ...... ...... public Map getMapping() { return mapping; } public void setMapping() { mapping.put("id", id); } }
Map型の"mapping"というプロパティが追加されました。このmappingは、"id"という文字列がキーで、この図書データのid項目を値にしています。
次に、loop.jspの一部を見てみましょう。
<html:link forward="search/detail" name="book" property="mapping"> <bean:write name="book" property="title" /> / <bean:write name="book" property="author" /> </html:link>
html:linkというタグがあります。このタグで囲まれたものがリンクになります。
このタグのそれぞれの属性について見てみましょう。
まず、forwardという属性は、リンク先を示します。ここの値は、先に見たstruts-config.xmlの設定内容と対応しており、"/searchBookDetail.do"がリンク先となります。
nameという属性の値はJavaBeansであるBookDataのことであり、propertyという属性で、先に改造したBookDataのmappingプロパティを指定します。このMap型のプロパティを指定することで、Mapのキーと値が、リンク先のプログラムに対するパラメータの名前と値になります。これによって、次に示すように、idをパラメータにしたリンクが自動的に作られるのです。
http://localhost:8080/library/searchBookDetail.do?id=12345