第 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つの