1. 書籍登録フォーム画面を実装する
1-1. 書籍登録フォーム画面コントローラをきちんと実装
1-1-1. /src/main/java/jp.sample.bookmgr.web.controller.BookController.java
//@@@@
//@@@@ 省略
//@@@@ 53行目付近
//@@@@
/**
* 書籍登録フォーム画面コントローラ
*
* @param model Spring MVC Modelオブジェクト
* @return 画面JSP名
*/
@RequestMapping(value = "/addbookform", method = RequestMethod.GET)
public String addBookForm(Model model) throws Exception {
// @@@@ 引数 Model model を追加 @@@@
logger.debug("addbookform() start");
//@@@@
//@@@@ 書籍情報をModelに登録する処理を追加
//@@@@
// 空の書籍情報をモデルに登録
Book book = new Book();
model.addAttribute("book", book);
// 画面表示に addbookform.jsp を呼び出す
return "addbookform";
}
}
1-2. 書籍登録フォーム画面JSP をきちんと修正
1-2-1. /src/main/webapp/VEB-INF/view/addbookform.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- @@@@ 以下の行を追加 @@@@ -->
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="css/bookmgr.css" />
<title>書籍登録フォーム画面</title>
</head>
<body>
<h1>書籍登録フォーム画面</h1>
<!--
@@@@
@@@@ 書籍登録フォームをきちんと実装する
@@@@ -->
<p>
<form:form action="addbook" method="POST" modelAttribute="book">
<table>
<tr>
<th>ISBNコード</th>
<td><form:input path="isbn"/></td>
</tr><tr>
<th>書籍名</th>
<td><form:input path="name"/></td>
</tr><tr>
<th>価格</th>
<td><form:input path="price"/></td>
</tr>
</table>
<br>
<input type="submit" value="登録" />
</form:form>
</p>
<hr />
<a href="main">書籍管理メイン画面</a>
</body>
</html>
Spring Formタグの説明はこちらのサイトがヒントになります
1-3. 画面表示テスト
書籍一覧画面を表示して書籍登録フォーム画面がきちんと表示されるかどうかをチェックする。
なお、「登録」ボタンを押すと書籍情報登録リクエストが発生しますが、まだ当処理を実装していないので 404エラーとなってしまいます。(このあと実装します)
2. 書籍登録処理を実装する
2-1. 書籍登録Daoを新規作成
2-1-1. /src/main/java/jp.sample.bookmgr.biz.dao.AddBookDao.java インターフェースを新規作成し、次のようにコーディング
package jp.sample.bookmgr.biz.dao;
import org.springframework.dao.DataAccessException;
import jp.sample.bookmgr.biz.domain.Book;
/**
* 書籍登録データアクセスクラスインターフェース
*
* @author ngzm
* @version 1.0
*/
public interface AddBookDao {
/**
* 指定された書籍データをデータベースに登録して永続化するメソッド
*
* @param Book 書籍情報
* @return int 登録された書籍データ数
*/
public int addBook(Book book) throws DataAccessException;
}
2-1-2. /src/main/java/jp.sample.bookmgr.biz.dao.AddBookDaoSpringJdbc.java 実装クラスを、上記インターフェースを継承しながら新規作成し、以下のようにコーディング
package jp.sample.bookmgr.biz.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;
import jp.sample.bookmgr.biz.domain.Book;
/**
* 書籍登録データアクセス実装クラス
*
* @author ngzm
* @version 1.0
*/
@Repository
public class AddBookDaoSpringJdbc implements AddBookDao {
/**
* JDBC制御クラス
*/
@Autowired
private NamedParameterJdbcTemplate template;
/**
* 指定された書籍データをデータベースに登録して永続化するメソッド
*
* @param book 書籍情報
* @return int 登録された書籍データ数
*/
@Override
public int addBook(Book book) throws DataAccessException {
// 書籍登録SQLのプレースホルダーを設定
MapSqlParameterSource pmap = new MapSqlParameterSource();
pmap.addValue("ISBN", book.getIsbn());
pmap.addValue("NAME", book.getName());
pmap.addValue("PRICE", book.getPrice());
// 書籍登録SQL
String sql = "INSERT INTO book (isbn, name, price) VALUES (:ISBN, :NAME, :PRICE)";
// データベースに登録する
int count = template.update(sql, pmap);
return count;
}
}
2-2. 書籍登録サービスを新規作成
2-2-1. /src/main/java/jp.sample.bookmgr.biz.service.AddBookService.java インターフェースを新規作成して、以下のようにコーディング
package jp.sample.bookmgr.biz.service;
import jp.sample.bookmgr.biz.domain.Book;
/**
* 書籍登録サービスインターフェース
*
* @author ngzm
* @version 1.0
*/
public interface AddBookService {
/**
* 書籍登録サービスを実行する
*
* @param Book 書籍情報
*/
public void addBook(Book book) throws Exception ;
}
2-2-2. /src/main/java/jp.sample.bookmgr.biz.service.AddBookServiceImpl.java 実装クラスを、上記インターフェースを継承して新規作成し、下記のようにコーディングする
package jp.sample.bookmgr.biz.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import jp.sample.bookmgr.biz.dao.AddBookDao;
import jp.sample.bookmgr.biz.domain.Book;
/**
* 書籍登録サービス実装クラス
*
* @author ngzm
* @version 1.0
*/
@Service
public class AddBookServiceImpl implements AddBookService {
/**
* データベースに書籍登録を行うDAOクラス
*/
@Autowired
private AddBookDao addBookDao;
/**
* 書籍登録サービスを実行する
*
* @param Book 書籍情報
*/
@Override
public void addBook(Book book) throws Exception {
// 書籍登録を行うDAOクラスを使用して書籍情報を永続化する
addBookDao.addBook(book);
}
}
2-3. 書籍登録リクエストを受け付けるコントローラを追加
2-3-1. /src/main/java/jp.sample.bookmgr.web.controller.BookController.java に書籍登録リクエストを受け付けるコントローラ(メソッド)追加
//@@@@
//@@@@ Package宣言およびimport宣言は省略
//@@@@
/**
* 書籍管理処理コントローラクラス
*
* @author ngzm
* @version 1.0
*/
@Controller
public class BookController {
/**
* ロガー
*/
private static final Logger logger = LoggerFactory.getLogger(BookController.class);
/**
* 書籍一覧処理を実装したビジネスロジックサービス
*/
@Autowired
ListBookService listBookService;
//@@@@
//@@@@ 書籍登録サービスオブジェクトのインジェクション宣言を追記
//@@@@
/**
* 書籍登録処理を実装したビジネスロジックサービス
*/
@Autowired
AddBookService addBookService;
/**
* 書籍一覧画面コントローラ
*
* @param model Spring MVC Modelオブジェクト
* @return 画面JSP名
*/
@RequestMapping(value = "/listbook", method = RequestMethod.GET)
public String listBook(Model model) throws Exception {
logger.debug("listBook() start");
// 書籍一覧取得ロジック処理
List<Book> books = listBookService.getBookList();
// 書籍一覧情報をモデルに登録
model.addAttribute("books", books);
// 画面表示に listbook.jsp を呼び出す
return "listbook";
}
/**
* 書籍登録フォーム画面コントローラ
*
* @param model Spring MVC Modelオブジェクト
* @return 画面JSP名
*/
@RequestMapping(value = "/addbookform", method = RequestMethod.GET)
public String addBookForm(Model model) throws Exception {
logger.debug("addbookform() start");
// 空の書籍情報をモデルに登録
Book book = new Book();
model.addAttribute("book", book);
// 画面表示に addbookform.jsp を呼び出す
return "addbookform";
}
//@@@@
//@@@@ 書籍登録コントローラを追加
//@@@@
/**
* 書籍登録処理コントローラ
*
* @param book Spring MVC ModelオブジェクトからバインドされたBookインスタンス
* @return 登録結果表示JSP名
*/
@RequestMapping(value = "/addbook", method = RequestMethod.POST)
public String addBook(@ModelAttribute("book") Book book) throws Exception {
logger.debug("addbook() start");
logger.debug("book isbn:" + book.getIsbn());
logger.debug("book name:" + book.getName());
logger.debug("book price:" + book.getPrice());
// 書籍情報登録処理
addBookService.addBook(book);
// とりあえず、メイン画面に戻るようにする
return "main";
}
//@@@@
//@@@@ 書籍登録コントローラここまで
//@@@@
}
2-4. 画面表示テスト
書籍登録フォーム画面から下記の書籍データを投入してデータベースに登録させてみましょう。
正常に登録できたでしょうか?
登録できたら書籍一覧画面に移動して、今登録したデータが表示されることを確認してください。
注意 ここでは、英数字のみでテストしてください。(漢字、ひらがな等は文字化けするため)
日本語を入力すると文字化けの対策は、STEP6で行います。
3. 書籍登録結果を表示する画面に遷移する
3-1. 書籍登録コントローラから処理結果画面Viewにリダイレクト
3-1-1. /src/main/java/jp.sample.bookmgr.web.controller.BookController.java 修正・追加
//@@@@
//@@@@ 省略
//@@@@ 78行目付近
//@@@@
/**
* 書籍登録処理コントローラ
*
* @param book Spring MVC ModelオブジェクトからバインドされたBookインスタンス
* @return 登録結果表示JSP名
*/
@RequestMapping(value = "/addbook", method = RequestMethod.POST)
public String addBook(@ModelAttribute("book") Book book) throws Exception {
logger.debug("addbook() start");
logger.debug("book isbn:" + book.getIsbn());
logger.debug("book name:" + book.getName());
logger.debug("book price:" + book.getPrice());
// 書籍情報登録処理
addBookService.addBook(book);
// 登録結果画面 result.jsp を呼び出す
return "redirect:result";
//@@@@ リターンで呼び出すJSPを変更し
//@@@@ さらにリダイレクトで遷移するように修正
}
//@@@@
//@@@@ 続けて、処理結果画面コントローラを追加
//@@@@
/**
* 処理結果画面表示コントローラ
*
* @return 登録結果表示JSP名
*/
@RequestMapping(value = "/result", method = RequestMethod.GET)
public String result() throws Exception {
logger.debug("result START");
return "result";
}
//@@@@ ここまで @@@@
}
3-2. 書籍登録結果画面JSPを新規作成
3-2-1. /src/main/webapp/WEB-INF/views/result.jsp ファイルを新規作成して、以下のようにコーディング
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="css/bookmgr.css" />
<title>更新結果</title>
</head>
<body>
<h1>更新に成功しました!</h1>
<hr />
<a href="main">書籍管理メイン画面</a>
<br/>
<a href="listbook">書籍一覧画面</a>
</body>
</html>
3-3. 画面表示テスト
書籍登録画面→登録結果画面 に遷移することを確認します。
注意 ここでは、英数字のみでテストしてください。(漢字、ひらがな等は文字化けするため)
日本語を入力すると文字化けする!の対策は、STEP6で行います。