Javaで検索機能を作るには?入力したキーワードでデータを絞り込む仕組み|確認問題の回答例
Javaで検索機能を作るには?入力したキーワードでデータを絞り込む仕組みの確認問題の回答例です。入力する文字、DBの検索条件、画面に表示する結果を対応させて確認しましょう。
問題1:%資料%を設定し、ID=1とID=3を取得する
stmt.setString(1, "%資料%");
上は実際に設定される値を具体的に示したものです。実装は"%" + keyword + "%"と書きます。ID=1の「資料を確認する」とID=3の「会議資料を作る」が一致します。前後の%は0文字以上の任意の文字列なので、先頭に資料がある場合も、途中にある場合も対象です。ID=2の「議事録を作る」は一致しません。
問題2:全行を読み、1行につき一つのTaskを作る
while (rs.next()) {
Task task = new Task(rs.getInt("id"), rs.getString("title"));
tasks.add(task);
}
ifでは最初の1行を読んだところで終わり、2件目を追加できません。whileなら、次の行がある間繰り返せます。new Taskを中に置くのは、行ごとに別のTaskを作ってそれぞれの値を保持するためです。Listには2件分の別々のTaskが入ります。
問題3:検索しない・検索して0件・検索失敗を区別する
| 状況 | 処理と表示 |
|---|---|
| 空白だけ | ModelのisBlankで判明。DAOを呼ばず例外を通知。Servletが400にし、入力を促す。 |
| 買い物で検索して0件 | DAOのrs.next()が最初からfalse。空のListが返り、JSPが「該当するタスクはありません。」と表示。200。 |
| tasksテーブルがない | SQL処理でSQLException。Servletがログへ記録して500にし、「検索できませんでした。」という案内を表示。 |
0件は検索成功の結果です。DBエラーをcatchして空のListを返すと、故障も0件に見えてしまうため、同じ扱いにしません。
問題4:パラメータ名と属性名を、それぞれ一致させる
フォームからtitleというパラメータは送っていないため、getParameter(“title”)はnullになります。今回のModelは入力なしとして拒否します。正しくはnameと同じkeywordです。
String keyword = request.getParameter("keyword");
設定した属性はtasksなので、getAttribute(“task”)ではnullになります。今回のJSPでは検索画面からの入力を促す分岐に入り、検索結果を表示できません。正しくは複数形のtasksです。
request.setAttribute("tasks", tasks);
List<Task> tasks = (List<Task>) request.getAttribute("tasks");
上の1行目はServlet、2行目はJSPの処理です。変数名ではなく、引用符で囲んだ属性名が受け渡しの対応を決めます。getParameterで受け取る入力値と、getAttributeで受け取るサーバー内の検索結果は別の仕組みです。