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プロパティに保持する。
<%@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)がセットされる。
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を生成し、ビューとして返すようにする。
--- 省略 --- 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に変更する。
<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を継承して
商品一覧画面用のコントローラを作成する。
ボタンが押されたときの処理として、とりあえず
選択された商品の一覧を次の画面に表示してみる。
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を作成する。
内容は以下のとおり。
<%@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に、商品一覧画面へのリンクを追加する。
--- 省略 --- <a href="<c:url value="menu.htm"/>">メニュー</a>  <a href="<c:url value="productList.htm"/>">商品一覧</a>  </body> </html>
商品一覧コントローラとそのURLを
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の商品が表示される。