[CONTENTSへ戻る]

サンプルその4(Controller→Controller)

FORMを持つ画面からFORMを持つ画面への遷移を考えてみる。
その為、商品一覧画面にFORMを持たせ、商品検索画面→商品一覧画面の遷移で
これを実現する。
商品一覧画面にFORMを持たせるため、この画面用のコントローラクラスも新たに作成する。
先にurlやコントローラ名などを以下のように決めておく。

url/productList.htm商品一覧画面用コントローラのURL
コマンド名productSelect
コマンドクラスcom.ziqoo.web.command.ProductSelect
コントローラ名productListController商品一覧画面用コントローラ
コントローラクラスcom.ziqoo.web.controller.ProductListController
JSPファイルWEB-INF/jsp/productSelectList.jsp商品一覧画面からサブミットした場合に表示する画面

商品一覧画面の修正

商品一覧画面のJSPであるproductList.jspを以下のように修正し、
一行毎にチェックボックスを付けてみる。
チェックボックスの値はコマンドクラスのproductIdsプロパティに保持する。

WEB-INF/jsp/productList.jsp
<%@page pageEncoding="Shift_JIS" contentType="text/html; charset=Shift_JIS" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ 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>
    <form:form commandName="productSelect">
        <table border="1">
        <tr><th></th><th>商品番号</th><th>商品名</th><th>価格</th></tr>
        <c:forEach items="${pList}" var="prod">
            <tr>
                <td><form:checkbox path="productIds" value="${prod.id}"/></td>
                <td><c:out value="${prod.id}"/></td>
                <td><a href="<c:url value="productDetail.htm?id=${prod.id}"/>" ><c:out value="${prod.productName}"/></a></td>
                <td align="right">\<c:out value="${prod.price}"/></td>
            </tr>
        </c:forEach>
        </table>
        <br>
        <input type="submit" value="選択" >    
    </form:form>
    <hr>
    <a href="<c:url value="menu.htm"/>">メニュー</a> 
    <a href="<c:url value="productSearch.htm"/>">商品検索</a> 
</body>
</html>

コマンドクラスの作成

商品一覧画面のチェックボックスの値を保持するコマンドクラス
ProductSelectを作成する。
プロパティproductIdsはIntegerの配列で、ここにチェックされたチェックボックスの値(id)がセットされる。

WEB-INF/src/com/ziqoo/web/command/ProductSelect.java
package com.ziqoo.web.command;

public class ProductSelect {
	private Integer[] productIds;

	public Integer[] getProductIds() {
		return productIds;
	}

	public void setProductIds(Integer[] productIds) {
		this.productIds = productIds;
	}
}

商品検索コントローラの修正

商品検索用のコントローラクラスを修正する。
まず検索結果のリストはSessionにセットする。
次にgetSuccessView()で取得される値はJSPファイル名から商品一覧コントローラのURLに変更するので、
これを引数にしてRedirectViewを生成し、ビューとして返すようにする。

WEB-INF/src/com/ziqoo/web/controller/ProductSearchController.java
   --- 省略 ---
public class ProductSearchController extends SimpleFormController {
	private ProductManager productMan;

	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);
		WebUtils.setSessionAttribute(req, "pList", pList);

		return new ModelAndView(new RedirectView(getSuccessView()));
	}
   --- 省略 ---

次にspringapp-servlet.xmlのproductSearchControllerの設定で、
successViewを商品一覧コントローラのURLに変更する。

WEB-INF/springapp-servlet.xml
    <bean id="productSearchController" class="com.ziqoo.web.controller.ProductSearchController">
        <property name="sessionForm"><value>true</value></property>
        <property name="commandName"><value>productSearch</value></property>
        <property name="commandClass"><value>com.ziqoo.web.command.ProductSearch</value></property>
        <property name="validator"><ref bean="productSearchValidator"/></property>
        <property name="formView"><value>productSearch</value></property>
        <property name="successView"><value>productList.htm</value></property>
        <property name="productMan">
            <ref bean="productManager"/>
        </property>
    </bean>

商品一覧コントローラの作成

SimpleFormControllerを継承して
商品一覧画面用のコントローラを作成する。
ボタンが押されたときの処理として、とりあえず
選択された商品の一覧を次の画面に表示してみる。

WEB-INF/src/com/ziqoo/web/controller/ProductListController.java
package com.ziqoo.web.controller;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
import org.springframework.web.util.WebUtils;

import com.ziqoo.biz.product.Product;
import com.ziqoo.web.command.ProductSelect;

public class ProductListController extends SimpleFormController {

	protected ModelAndView onSubmit(HttpServletRequest req,
			HttpServletResponse res, Object command, BindException bindException)
			throws Exception {

		ProductSelect ps = (ProductSelect)command;
		List<Product> pList = (List)WebUtils.getSessionAttribute(req, "pList");

		List<Product> selectPList = new ArrayList<Product>();
		
		for (Integer id: ps.getProductIds()){
			for (Product product: pList) {
				if (product.getId().equals(id)) {
					selectPList.add(product);
					break;
				}
			}
		}
		
		return new ModelAndView(getSuccessView(), "selectPList", selectPList);
	}

}

選択商品一覧画面JSPの作成

選択された商品の一覧を表示するJSPを作成する。
内容は以下のとおり。

WEB-INF/jsp/productSelectList.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>
        <table border="1">
        <tr><th>商品番号</th><th>商品名</th><th>価格</th></tr>
        <c:forEach items="${selectPList}" var="prod">
            <tr>
                <td><c:out value="${prod.id}"/></td>
                <td><c:out value="${prod.productName}"/></td>
                <td align="right">\<c:out value="${prod.price}"/></td>
            </tr>
        </c:forEach>
        </table>
    <hr>
    <a href="<c:url value="menu.htm"/>">メニュー</a> 
    <a href="<c:url value="productList.htm"/>">商品一覧</a> 
</body>
</html>

ついでに商品詳細画面JSPに、商品一覧画面へのリンクを追加する。

WEB-INF/jsp/productDetail.jsp
   --- 省略 ---
    <a href="<c:url value="menu.htm"/>">メニュー</a> 
    <a href="<c:url value="productList.htm"/>">商品一覧</a> 
</body>
</html>

設定ファイルの修正

商品一覧コントローラとそのURLを springapp-servlet.xmlファイルへ追記する。

WEB-INF/springapp-servlet.xml
   --- 省略 ---
    <bean id="productListController" class="com.ziqoo.web.controller.ProductListController">
        <property name="sessionForm"><value>true</value></property>
        <property name="commandName"><value>productSelect</value></property>
        <property name="commandClass"><value>com.ziqoo.web.command.ProductSelect</value></property>
        <property name="formView"><value>productList</value></property>
        <property name="successView"><value>productSelectList</value></property>
    </bean>

    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/menu.htm">menuController</prop>
                <prop key="/productSearch.htm">productSearchController</prop>
                <prop key="/productList.htm">productListController</prop>
                <prop key="/productDetail.htm">productDetailController</prop>
            </props>
        </property>
    </bean>
   --- 省略 ---

動作確認

商品検索画面より検索キーを指定して、検索ボタンを押す。

チェックボックスつきの一覧画面が表示される。
1と3を選択して、選択ボタンを押す。

選択商品一覧画面に、選択した1と3の商品が表示される。


[CONTENTSへ戻る]