入力値に関するエラーチェックについてはすでに試してみたので、
ここではそれ以外のエラー処理について考えてみる。
商品検索画面で入力値に誤りがあった場合、その項目の横に
エラーメッセージが表示されるが、加えて画面上部にも
"入力内容を確認してください。"と表示されるようにする。
まずmessage.propertiesにメッセージコードと上記メッセージを追加する。
typeMismatch={0} は無効な入力です。 typeMismatch.productSearch.id=商品番号は数値を入力してください。 typeMismatch.productSearch.categoryId=カテゴリ番号は数値を入力してください。 typeMismatch.long=long型の値を入力してください。 error.input=入力内容を確認してください。 error.requiered=必須入力です。
productSearch.jspを以下のように修正する。
<%@page pageEncoding="Shift_JIS" contentType="text/html; charset=Shift_JIS" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <link rel="stylesheet" type="text/css" href="css/main.css" > <title>springapp</title> </head> <body> <h3>商品検索</h3> <hr> <div class="error"> <spring:hasBindErrors name="productSearch"> <fmt:message key="error.input"/> </spring:hasBindErrors> </div> <form:form commandName="productSearch"> <table> <tr> <th>商品番号</th> <td><form:input path="id" /></td> <td><font color="red"><form:errors path="id" /></font></td> </tr> --- 省略 ---
使用しているスタイルシートの内容は以下のとおり。
body {font-family: Tahoma, taipei; color;#000000; font-size: 12px} div {padding: 5px; text-align: left;} div.error {color: red; font-weight: bold;} table {border-width: 1px; font-size: 12px;} th {background-color: #cccccc; border-width: 1px; padding: 2px;} td {background-color: #FFFFFF; border-width: 1px; padding: 2px;}
商品検索画面からカテゴリ番号を指定せずに、検索ボタンを押す。
画面上部に"入力内容を確認してください。"と表示されるようになった。
現状では商品情報が1件も検索されなくても、商品一覧画面に遷移している。
これを画面遷移しないようにし、かつ画面上部に
"該当する商品はありません。"と表示するようにしてみる。
まずmessage.propertiesにメッセージコードと上記メッセージを追加する。
typeMismatch={0} は無効な入力です。 typeMismatch.productSearch.id=商品番号は数値を入力してください。 typeMismatch.productSearch.categoryId=カテゴリ番号は数値を入力してください。 typeMismatch.long=long型の値を入力してください。 error.input=入力内容を確認してください。 error.requiered=必須入力です。 error.data.notFound=該当する商品はありません。
ProductSearchControllerを以下のように修正し、
検索結果が0件の場合は引数bindExceptionにエラーコードをセットして、
showFormメソッドを呼び出し、商品検索画面を表示する。
--- 省略 --- protected ModelAndView onSubmit(HttpServletRequest req, HttpServletResponse res, Object command, BindException bindException) throws Exception { ProductSearch productSearch = (ProductSearch) command; Product product = new Product(); product.setId(productSearch.getId()); product.setCategoryId(productSearch.getCategoryId()); product.setProductName(productSearch.getProductName()); List pList = productMan.getProductList(product); if (pList.isEmpty()) { bindException.reject("error.data.notFound"); return showForm(req, res, bindException); } WebUtils.setSessionAttribute(req, "pList", pList); return new ModelAndView(new RedirectView(getSuccessView())); } --- 省略 ---
productSearch.jspを以下のように修正する。
WEB-INF/jsp/productSearch.jsp--- 省略 --- <body> <h3>商品検索</h3> <hr> <div class="error"> <spring:bind path="productSearch"> <c:out value="${status.errorMessage}"/><br> </spring:bind> <spring:hasBindErrors name="productSearch"> <fmt:message key="error.input"/> </spring:hasBindErrors> </div> --- 省略 ---
商品検索画面からカテゴリ番号に"その他"を指定し検索ボタンを押す。
画面は遷移せず、画面上部に"該当する商品はありません。"と表示されるようになった。
処理中に例外が発生した場合、対応するエラー画面を表示することを考える。
商品検索時、DBサーバが停止していた場合、"CannotGetJdbcConnectionException"が発生するので、
このとき、エラー画面を表示するようにしてみる。
エラー画面のJSPは以下のとおり。
<%@page pageEncoding="Shift_JIS" contentType="text/html; charset=Shift_JIS" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <link rel="stylesheet" type="text/css" href="css/main.css" /> <title>springapp</title> </head> <body> <h3>エラー</h3> <hr> <div class="error"> データベースに接続できません。 </div> <hr> </body> </html>
例外と上記JSPをマッピングするためspringapp-servlet.xmlファイルに
例外ハンドラの設定を追加する。
--- 省略 --- <bean id="exceptionHandler" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="org.springframework.jdbc.CannotGetJdbcConnectionException">dbError</prop> </props> </property> </bean> --- 省略 ---
DBサーバを停止し、商品検索画面で検索ボタンを押す。
エラー画面が表示される。