strutsで配列型のフォームオブジェクトを使う方法(2)
Java (21 items)
2004年08月24日
【解説】
一覧の更新を行う際にとても便利。
Strutsを使用して一覧データのForm内容(text)を取得する方法
前回のパターンよりこちらの方がJSPにスクリプトレットを埋め込む必要がない、ActionFormがシンプルと言う点でも優れていると思います。
JSPの記述
<logic:iterate id="data" name="DispSetModelFormForm" property="data" indexId="idx">
<html:text name="data" property="code" indexed="true" size="10"/>
実際のHTMLは
1行目・・・<input type="text" name="data[0].code" size="10" value="001">
2行目・・・<input type="text" name="data[1].code" size="10" value="002">
と変換されます。
indexed="true"と記述すると自動的に「data[0].code」のように添え字を付加してくれます。
上記のように記述しておけばサブミットする事により、
ActionFromのdata(ArrayList)にデータが格納されます。
補足としてJavaScriptで添え字付きテキストの内容を取得する例も入っています。
【Actionクラス】
package mylist;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class DispSetModelFormAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest req,
HttpServletResponse res )
throws Exception {
DispSetModelFormForm myForm = (DispSetModelFormForm)form;
if (myForm.getDecisionMode().equals("")){
MyValueListBean myListBean = new MyValueListBean();
DispSetModelFormForm myFormBean = new DispSetModelFormForm();
myForm.getData(0).setCode("001");
myForm.getData(0).setName("AAA");
myForm.getData(1).setCode("002");
myForm.getData(1).setName("BBB");
myForm.getData(2).setCode("003");
myForm.getData(2).setName("CCC");
}else if(myForm.getDecisionMode().equals("update")){
}else if(myForm.getDecisionMode().equals("insert")){
String str = "00" + String.valueOf(myForm.getlistSize()+1);
myForm.getData(myForm.getlistSize()).setCode(str.substring(str.length() -3 ));
}else if(myForm.getDecisionMode().equals("delete")){
int sentaku[] = myForm.getSentaku();
if (sentaku != null){
for(int i=0; i<sentaku.length; i++){
//ArrayListの要素が削除されるのでループ毎に削除対象が-1される
myForm.delete(sentaku[i]-i);
}
myForm.setSentaku(new int[0]);
}
}
return mapping.findForward( "success" );
}
}
【ActionFormクラス】
package mylist;
import java.util.ArrayList;
import java.util.List;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import javax.servlet.http.HttpServletRequest;
public class DispSetModelFormForm extends ActionForm {
private String decisionMode="";
private int[] sentaku;
private List data = new ArrayList();
public void reset(ActionMapping mapping, HttpServletRequest req) {
try {
req.setCharacterEncoding("Windows-31J");
}
catch (Exception e) {
e.printStackTrace();
}
}
public ListType getData(int iIndex)
{
while (this.data.size() <= iIndex)
{
this.data.add(new ListType());
}
return (ListType)this.data.get(iIndex);
}
public Object[] getData(){
return data.toArray();
}
public int[] getSentaku() {
return sentaku;
}
public void setSentaku(int[] is) {
sentaku = is;
}
public String getDecisionMode() {
return decisionMode;
}
public void setDecisionMode(String string) {
decisionMode = string;
}
public int getlistSize()
{
return this.data.size();
}
public void delete(int i)
{
this.data.remove(i);
}
public static class ListType {
private String code;
private String name;
public void setCode(String code ) {
this.code = code;
}
public String getCode() {
return code;
}
public void setName(String name ) {
this.name = name;
}
public String getName() {
return this.name;
}
}
}
【JSP】
<%@ page contentType="text/html; charset=Windows-31J" %>
<!--%@ page contentType="text/html; charset=Shift_JIS"
pageEncoding="Shift_JIS" %-->
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<jsp:useBean id="form10_1" class="mypackage.MyActionForm10" scope="session"/>
<html:html locale="true">
<head>
<title>In10.jsp</title>
<SCRIPT LANGUAGE="JavaScript">
<!--
// 追加
function add() {
objKofno = eval("DispSetModelFormForm.elements['data[0].code']");
alert(objKofno.value);
}
//-->
</script>
</head>
<body>
<html:form action="/DispSetModelFormAction" method="POST">
<html:hidden property="decisionMode" />
<html:link href="menu.jsp" >
menu<br>
</html:link>
<logic:notPresent name="DispSetModelFormForm">
myListBean notPresent
</logic:notPresent>
<logic:present name="DispSetModelFormForm">
myListBean present
</logic:present>
<br><br>
<html:submit property="submit" value="追加" onclick="form.decisionMode.value='insert'; submit();"/>
<html:submit property="submit" value="変更" onclick="form.decisionMode.value='update'; submit();"/>
<html:submit property="submit" value="削除" onclick="form.decisionMode.value='delete'; submit();"/>
<html:button property="submit" value="JavaScriptで1件目の内容を取得" onclick="add()"/>
<table border=1>
<logic:notEmpty name="DispSetModelFormForm">
<logic:iterate id="data" name="DispSetModelFormForm" property="data" indexId="idx">
<tr>
<td>
<html:multibox property="sentaku">
<%= idx%>
</html:multibox>
</td>
<td>
<html:text name="data" property="code" indexed="true" size="10"/>
<bean:write name="data" property="code" /><br>
</td>
<td>
<html:text name="data" property="name" indexed="true" size="10"/>
</td>
</tr>
</logic:iterate>
</logic:notEmpty>
</table>
<br>
</html:form>
</body>
</html:html>
この記事に関連した過去記事一覧は画面下にあります。
Comments
わく wrote:
初めまして、少し質問させていただきたいのですが、よろしいでしょうか?このサイトのコードを参考に以下のようなコードを書きましたが、Error 500: BeanUtils.populate を起こしてしまいます。
<bean:write name="item" property="name" />
<html:hidden name="item" property="name" indexed="true" />
エラー文↓
[BeanUtils.populate]: java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
フォームビーンの構成なども同じような感じで作ってみたのですが、どうしても上手くいきません。何か解決方法などありますでしょうか?
よろしくお願いします。
2004年12月10日 16時13分06秒
shima wrote:
遅くなってすいません。わくさんが書かれている情報だけで原因を特定する事は出来ませんが、「IndexOutOfBoundsException」のエラーはインデックスの参照が範囲外である時に発生するので、
ここからは推測ですが、ActionFormで作成した配列より大きいインデックスをJSP側で参照しているのではないでしょうか?
2004年12月12日 09時05分58秒
わく wrote:
わくです。お返事ありがとうございました。
質問するときの情報が少なかったですね、申しわけありませんでした…。
どのようなことをしたいかと言うと、
「本のIDコードを更新する」プログラムを作りたいと思っております。
まずはDBにある本のIDコード、名前、値段を一つのクラスにし、それを配列として画面に表示します。
その後、IDコードに変更があった場合、IDコード、名前、値段をFormに格納し、更新を行いたいと思いました。
以下がJSPとFormになります。
*JSP*
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html:html>
<HEAD>
<%@ page
language="java"
contentType="text/html; charset=shift_jis"
pageEncoding="shift_jis"
%>
<META http-equiv="Content-Type" content="text/html; charset=shift_jis">
<TITLE>Book</TITLE>
</HEAD>
<BODY>
<html:form action="/bookAction.do" >
<table border="0" width="100%">
<tr>
<td>IDコード</td>
<td>名称</td>
<td>値段</td>
</tr>
<logic:iterate id="item" name="BookForm" property="item" scope="request" indexId="i">
<tr>
<td>
<html:text name="item" property="idCode" indexed="true" />
<bean:write name="item" property="idCode" />
</td>
<td>
<bean:write name="item" property="name" />
<html:hidden name="item" property="name" indexed="true" />
</td>
<td>
<bean:write name="item" property="price" />
<html:hidden name="item" property="price" indexed="true" />
</td>
</tr>
</logic:iterate>
</table>
<html:submit value="submit" property="submitButton"/>
</html:form>
</BODY>
</html:html>
*Form*
public class BookForm extends ActionForm {
private ArrayList item = new ArrayList();
public void setItem(ArrayList item) {
this.item = item;
for(int i=0;i<item.size();i++){
bookData b= (bookData)item.get(i);
}
}
public bookData getData(int index) {
while (this.item.size() <= index) {
this.item.add(new bookData());
}
return (bookData)this.item.get(index);
}
public Object[] getItem(){
return item.toArray();
}
public static class bookData{
private String idCode;
private String name;
private String price;
public String getIdCode() { return idCode; }
public String getName() { return name; }
public String getPrice() { return price; }
public void setIdCode(String idCode) { this.idCode = idCode; }
public void setName(String name) { this.name = name; }
public void setPrice(String price) { this.price = price; }
}
}
-----------ここまで------------
これを実行すると、前回記述したエラーがでるので、nameとpriceのstruts・htmlタグ<hidden>をなくしたところ、エラーは出なくなりました。
でも、更新後にActionクラスで処理を行おうとしても配列の値は0とコンソールに表示されてしまうので、更新した後のデータはどのように格納されるのかわからない状態です。
beanタグでFormに格納されているデータを参照し、htmlタグでFormにデータを格納するのかと考えていたのですが、実際はどのようになっているのでしょうか?
長々と書いてしまいましたが、何卒よろしくお願い致します。
2004年12月13日 13時56分53秒
shima wrote:
shimaです。表示したHTMLのソースのidCode部分は
<input type="text" name="item[0].idCode" value="001">
となっていると思います。
この状態でsubmitした場合、まず最初に呼ばれるのはFormのgetItem(int index)です。
その後、idCodeのセッターメソッドが呼ばれます。
Fromのソースを見たところgetData()となっているので画面のデータをFormにセット出来ない。
getDataメソッド名をgetItemに変更すればうまくいくと思うのですが。
2004年12月13日 22時26分51秒
わく wrote:
わくです。shimaさん、ご指摘ありがとうございます!
getData()をitemに変えたところ、ちゃんと動くようになりました。初歩的なミスですね…。
大変申しわけありませんでした。
まだまだStrutsに関して修行の身なので、これからも色々参考にさせて下さい。
ありがとうございました。
2004年12月14日 16時57分49秒
Add Comments
Trackback
トラックバックはありません
Trackback URL
http://www.res-system.com/weblog/action.php?action=plugin&name=TrackBack&tb_id=242