Powered by SmartDoc

Jakarta Struts (2)

前章で見た図書検索のWebアプリケーションは、検索結果がリスト表示されるだけで、本の詳しいデータを見ることはできませんでした。

ここでは、リスト表示のそれぞれの行をクリックすると、その本に関する詳細なデータが表示される機能を追加してみましょう。

Struts でのページ遷移の考え方

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