9月5日

成績検索アプリを完成させる

  1. SpringMVCプロジェクトを作成
  2. 成績を検索する画面を作成
  3. HomeControllerを作成
  4. 成績の検索結果を表示する画面を作成
  5. HomeControllerに検索を実行するメソッドを追加
  6. 成績を登録する画面を作成
  7. EditControllerを作成
  8. 成績を登録するリクエストを受け取れるようにする
  9. Resultエンティティを作成
  10. Resultを使うようにedit.jspを修正
  11. DAOを使用してデータベースに保存する
  12. 重複した受験番号を登録できないようにする

検索でエラーを表示する

JSTL の c:if タグを使用して、error != null のときはエラーメッセージを表示し、そうでないときは検索結果を表示する。

result.jsp

<!DOCTYPE html>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${title}</title>
</head>
<body>

<h1>${title}</h1>

<c:if test="${error != null}">
<p style="color:#ff0000;"><b>${error}</b></p>
</c:if>
<c:if test="${error == null}">
<p>
受験番号 ${number} の得点は ${score} です。
</p>
</c:if>

<a href="/exam/home">戻る</a>
</body>
</html>

コントローラでは、結果が見つからないときはエラーメッセージを設定する。

HomeController.java

	@RequestMapping(value = "/home", method = RequestMethod.POST)
	public String query(@RequestParam("number") String number, Model model) {
		model.addAttribute("title", "成績の検索結果");
		model.addAttribute("number", number);
		ResultDao dao = new ResultDaoImpl();
		Result r = dao.find(number);
		if (r == null) {
			model.addAttribute("error", "存在しない受験番号です");
			model.addAttribute("score", "");
		} else {
			model.addAttribute("score", r.getScore());
		}
		return "result";
	}

重複した受験番号のチェック

Resultエンティティの number の @Column アノテーションで unique = true を指定すると、一意性を保証することになっているが、バリデーションではチェックされないのであまり意味がない。

重複チェックをするには、保存する前に同一の値が存在するかどうかを確認するのがよい。

参考: http://kenro.biz/blog/?p=172

EditController.java

	@RequestMapping(value = "/edit", method = RequestMethod.POST)
	public String add(@Valid @ModelAttribute Result result,
			BindingResult errors, Model model) {
		ResultDao dao = new ResultDaoImpl();
		if (errors.hasErrors()) {
			model.addAttribute("title", "成績の入力");
		} else {
			model.addAttribute("title", "成績の入力");
			model.addAttribute("result", result);
			try {
				dao.add(result);
			} catch (PersistenceException e) {
				model.addAttribute("message", "受験番号が重複しています");
			}
		}
		List<Result> list = dao.getAll();
		model.addAttribute("list", list);
		return "edit";
	}

ResultDaoImpl.java

    public void add(Result result) {
    	EntityManager manager = factory.createEntityManager();
    	EntityTransaction transaction = manager.getTransaction();
    	transaction.begin();
    	Result r = find(result.getNumber());
    	if (r == null) {
    		try {
    			manager.persist(result);
    			transaction.commit();
    		} catch (PersistenceException e) {
    			transaction.rollback();
    		}
        	manager.close();
    	} else {
    		throw new PersistenceException();
    	}
    }

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です