[CONTENTSへ戻る]

エラー処理

入力値に関するエラーチェックについてはすでに試してみたので、
ここではそれ以外のエラー処理について考えてみる。

バインドエラー

商品検索画面で入力値に誤りがあった場合、その項目の横に
エラーメッセージが表示されるが、加えて画面上部にも
"入力内容を確認してください。"と表示されるようにする。
まずmessage.propertiesにメッセージコードと上記メッセージを追加する。

WEB-INF/src/message.properties
typeMismatch={0} は無効な入力です。
typeMismatch.productSearch.id=商品番号は数値を入力してください。
typeMismatch.productSearch.categoryId=カテゴリ番号は数値を入力してください。
typeMismatch.long=long型の値を入力してください。
error.input=入力内容を確認してください。
error.requiered=必須入力です。

productSearch.jspを以下のように修正する。

WEB-INF/jsp/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>
   --- 省略 ---

使用しているスタイルシートの内容は以下のとおり。

css/main.css
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にメッセージコードと上記メッセージを追加する。

WEB-INF/src/message.properties
typeMismatch={0} は無効な入力です。
typeMismatch.productSearch.id=商品番号は数値を入力してください。
typeMismatch.productSearch.categoryId=カテゴリ番号は数値を入力してください。
typeMismatch.long=long型の値を入力してください。
error.input=入力内容を確認してください。
error.requiered=必須入力です。
error.data.notFound=該当する商品はありません。

ProductSearchControllerを以下のように修正し、
検索結果が0件の場合は引数bindExceptionにエラーコードをセットして、
showFormメソッドを呼び出し、商品検索画面を表示する。

WEB-INF/src/com/ziqoo/web/controller/ProductSearchController.java
   --- 省略 ---
	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は以下のとおり。

WEB-INF/jsp/dbErr.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ファイルに
例外ハンドラの設定を追加する。

WEB-INF/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サーバを停止し、商品検索画面で検索ボタンを押す。

エラー画面が表示される。


[CONTENTSへ戻る]