前章で見た図書検索の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