• 検索結果がありません。

図書検索プログラムの作成 (1)

ドキュメント内 1 JSF JSF JSF MVC 2 We (ページ 51-60)

第 7 章 Method Binding 41

7.4 図書検索プログラムの作成 (1)

7.2:

検索語入力画面

7.3:

検索結果出力画面

<hr />

<f:view>

<h:form id="searchForm">

<h:inputText id="searchWord" value="#{BookSearcher.word}" />

<h:commandButton id="submit"

action="#{BookSearcher.searchBooks}" value="Go!" />

</h:form>

</f:view>

</body>

</html>

h:input

要素で

Value Binding

式、

h:commandButton

要素で

Method Binding

式が使わ れています。

7.4.3 Managed Bean

の実装 次に、

Managed Bean

です。

リスト

11: BookSearcher.java

import java.util.List;

import java.util.ArrayList;

import java.sql.*;

import javax.sql.*;

import javax.faces.context.FacesContext;

import javax.faces.el.ValueBinding;

public class BookSearcher { private String word = "";

private String id = "";

private List<BookData> list = null;

private BookData book = null;

public void setWord(String word) { this.word = word;

}

public String getWord() { return word;

}

public List<BookData> getBookList() { return list;

}

public BookData getBookData() { return book;

}

public String searchBooks() { searchBooks(word);

return "success";

}

private void searchBooks(String word) { list = new ArrayList<BookData>();

try {

Class.forName("org.hsqldb.jdbcDriver");

String url = "jdbc:hsqldb:hsql://localhost";

Connection con = DriverManager.getConnection(url, "sa", "");

String selectStatement =

"select * " +

"from books where ndc like ? " +

"or tyosya_hyouji like ? " +

"or id like ? " +

"or title like ? " +

"or author like ? " +

"or publisher like ? ";

PreparedStatement prepStmt =

con.prepareStatement(selectStatement);

prepStmt.setString(1, appendPercent(word));

prepStmt.setString(2, appendPercent(word));

prepStmt.setString(3, appendPercent(word));

prepStmt.setString(4, appendPercent(word));

prepStmt.setString(5, appendPercent(word));

prepStmt.setString(6, appendPercent(word));

ResultSet rs = prepStmt.executeQuery();

while (rs.next()) {

BookData book = new BookData();

book.setNdc(rs.getString("ndc"));

book.setTyosya_hyouji(rs.getString("tyosya_hyouji"));

book.setId(rs.getString("id"));

book.setTitle(rs.getString("title"));

book.setAuthor(rs.getString("author"));

book.setPublisher(rs.getString("publisher"));

list.add(book);

}

prepStmt.close();

} catch (ClassNotFoundException e) { e.printStackTrace();

} }

private String appendPercent(String from) { StringBuffer to = new StringBuffer();

to.append("%");

to.append(from);

to.append("%");

return new String(to);

} }

setWord, getWord

というメソッドの存在から、

word

プロパティがあることがわかりま す。また、

bookList, bookData

プロパティもあります。

そして、

searchBooks

という

Action Method

があります。

Action Method

のルールに 則っていることがわかります。このメソッドでは、(別の)

searchBooks

メソッドで、デー タベースの検索処理を行っています。

public String searchBooks() { searchBooks(word);

return "success";

}

private void searchBooks(String word) { // データベースの検索処理

}

7.4.4 Model

次に、

Model

となる

BookData

という

JavaBeans

です。

リスト

12: BookData.java

import java.io.Serializable;

public class BookData implements Serializable { private String ndc = "";

private String tyosya_hyouji = "";

private String id = "";

private String title = "";

private String author = "";

private String publisher = "";

public String getNdc() { return ndc;

}

public void setNdc(String ndc) { this.ndc = ndc;

}

public String getTyosya_hyouji() { return tyosya_hyouji;

}

public void setTyosya_hyouji(String tyosya_hyouji) { this.tyosya_hyouji = tyosya_hyouji;

}

public String getId() { return id;

}

public void setId(String id) { this.id = id;

}

public String getTitle() { return title;

}

public void setTitle(String title) { this.title = title;

}

public String getAuthor() { return author;

}

public void setAuthor(String author) { this.author = author;

}

public String getPublisher() { return publisher;

}

public void setPublisher(String publisher) { this.publisher = publisher;

}

ndc, tyosya hyouji, title

などのプロパティがあることがわかります。

データベースの検索結果には、複数の図書データが含まれます。1冊の図書データは、

1つの

BookData

に格納されます。そして

java.util.List

を使って、複数の

BookData

をま とめておきます。

次のような処理になります。

List<BookData> list = new ArrayList<BookData>();

BookData book = new BookData();

book.setId(rs.getString("id"));

book.setTitle(rs.getString("title"));

book.setAuthor(rs.getString("author"));

list.add(book);

7.4.5

検索結果出力画面の

JSP

検索結果を出力する

JSP

です。

リスト

13: list.jsp

<%@ page contentType="text/html; charset=Shift_JIS" %>

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<html>

<head>

<title>検索結果</title>

</head>

<body>

<h1>検索結果</h1>

<f:view>

<h:form id="listForm">

<h:dataTable id="table" border="1"

value="#{BookSearcher.bookList}" var="book">

<h:column>

<f:facet name="header">

<h:outputText value="タイトル"/>

</f:facet>

<h:outputText id="bookTitle" value="#{book.title}"/>

</h:column>

<h:column>

<f:facet name="header">

<h:outputText value="著者"/>

</f:facet>

<h:outputText id="bookAuthor" value="#{book.author}"/>

</h:column>

</h:dataTable>

</h:form>

</f:view>

</body>

</html>

主に、

dataTable

というタグを使って検索結果を表示しています。

7.4.6 h:dataTable

タグ

h:dataTable

タグは、コレクション

(List,

配列など

)

のデータを表にして表示する

UI

ンポーネントです。

ほかの

UI

コンポーネントと同じく、

id

属性があります。

border

属性では、表の罫線の 太さを指定しています。

value

属性で、表示するコレクション型のプロパティを指定します。このとき、

Value

Binding

式を使います。

var

属性は、コレクション中の1つの要素を表す変数名です。

この例では、

value

属性は

List

型である

bookList

プロパティを指定しています。この

bookList

には、複数の

BookData

が格納されています。従って、

var

属性で指定された

book

という変数名は、

BookData Bean

を指していることになります。

<h:dataTable id="table" border="1"

value="#{BookSearcher.bookList}" var="book">

</h:dataTable>

7.4.7 h:column

タグとデータの出力

h:dataTable

タグでは、複数の

h:column

タグが含まれています。このタグは、図

7.4

ように、

h:dataTable

要素の1列分のデータを表す

UI

コンポーネントです。

<h:dataTable id="table" border="1"

value="#{BookSearcher.bookList}" var="book">

7.4: h:column

タグ

</f:facet>

<h:outputText id="bookTitle" value="#{book.title}"/>

</h:column>

...

h:column

要素には、

f:facet

要素と

h:outputText

要素が含まれています。

このうち、

f:facet

要素は、表の1列のヘッダやフッタを表す

UI

コンポーネントです。

name

属性に

”header”

を指定するとヘッダになります。

”footer”

だとフッタです。

<f:facet name="header">

<h:outputText value="タイトル"/>

</f:facet>

そして、

h:outputText

タグです。この列では、

book

という変数

(BookData Bean

のこ

)

title

プロパティの値を出力しています。

<h:outputText id="bookTitle" value="#{book.title}"/>

7.4.8 h:dataTable

の働き

では、

h:dataTable

タグの働きについて整理してみましょう。

h:dataTable

には、表示すべきデータをまとめたコレクションが渡されます。

表示される表の1行分が、

h:dataTable

var

属性の値に対応しています。

var

属性の値 はコレクション中の1つの

JavaBeans

に対応して、表の1行分となります。。この例では、

List

に含まれている1つの

BookData

が、表の1行分となるのです。

BookData Bean

のどのプロパティを出力するかは、

column

要素によって決まります。

1つの

column

要素で、1つのプロパティを出力するのです。

ドキュメント内 1 JSF JSF JSF MVC 2 We (ページ 51-60)

関連したドキュメント