[Seasar-user:11486] [Teeda] ListなForEachで入力コンポーネントを使ってみました
Applied_MATSUDA Masaaki
[E-MAIL ADDRESS DELETED]
2007年 11月 6日 (火) 16:05:26 JST
TigerCatです.
いろいろお世話になってます.
今回は,Teeda 1.0.12 でListなForEachでも更新系の処理が
動くようになってるとのことで,早速やってみようと思った
のですが,うまくいかず・・・
Teedaは現時点最新のSVN(リビジョン3747)を使っています.
たとえば,仕事の役割が一覧で表示されて,その役割の横に
リストボックスがあって登録されているユーザ名を選択で
きるようにしておき,要はそれぞれの役割に人をアサイン
するような要件を想定しているのですが,
画面(edit.html)ではForEachの中身はDtoを割り当てています.
List<TeamDto> memberItems
このDtoのプロパティから役割名を画面に表示します.
このDtoには,リストボックスの選択肢を格納するために
List<Map> memberStaffCodeItems のフィールドを持って
います.
いざ動かすと,入力画面が思ったとおりにちゃんと表示され
ます.
それぞれのリストボックスを適当に選択して,[登録]ボタ
ンを押しますと,
どうも結果が入っているであろうList<TeamDto> memberItems
がnullになってしまうのであります.
下記コードの ★部分です.
よって
teamService.insertOrUpdate(this.memberItems);
は,このサービスクラスの中でidを自動採番しようとして
for(int i=0; i<memberItems.size(); i++) {
をやるところでヌルポってしまっています.
何か勘違いをしているか,まだTeedaが未対応なことをしで
かしているかとは思いますが,原因がわかりましたらご教示
いただけると幸いです.
何卒よろしくお願い致します.
下記,サンプルコードを貼り付けておきます.
<!-- edit.html -->
<html>
<head></head>
<body>
<form id="editForm">
<table>
<thead>
<tr>
<th>役割</th>
<th>メンバー名</th>
</tr>
</thead>
<tbody id="memberItems">
<tr id="tereko" class="tereko">
<td>
<span id="memberTypeName">切込隊長</span>
<input id="memberType" type="hidden"/>
</td>
<td>
<select id="memberStaffCode">
<option value="11111">田中 一朗</option>
<option value="22222">山田 次郎</option>
</select>
</td>
</tr>
</tbody>
</table>
<input type="submit" value="登録" id="doOnceRegist"/>
</form>
</body>
</html>
public abstract class AbstractEditPage {
// ForEachの中身 TeamDtoのリスト
public List<TeamDto> memberItems;
public int memberIndex;
// リストボックスの選択肢
public List<Map> memberStaffCodeItems;
// TeamDtoのフィールド
public Integer memberType;
public String memberTypeName;
public String memberStaffCode;
public Class doOnceRegist() { return null; }
public Class initialize() { return null; }
public Class prerender() { return null; }
}
public class EditPage extends AbstractEditPage {
@EJB
TeamService teamService;
@EJB
TeamDxo teamDxo;
@Override
public Class prerender() {
prepareMemberItems();
return null;
}
@Override
public Class doOnceRegist() {
teamService.insertOrUpdate(this.memberItems); // ★
return FinishPage.class;
}
@Override
public Class initialize() {
TeamDto teamDto = new TeamDto();
teamDxo.convert(teamDto, this);
return null;
}
private void prepareMemberItems() {
this.memberItems = new ArrayList<TeamDto>();
List<Map> options = new ArrayList<Map>();
Map<String, String> option;
// リストボックスの選択肢を埋める.実際にはDBから取得.
option = new HashMap<String, String>();
option.put("label", "一人目 太郎");
option.put("value", "123123");
options.add(option);
option = new HashMap<String, String>();
option.put("label", "二人目 次郎");
option.put("value", "123123");
options.add(option);
// ...
// ForEachで表示すべくデータ(DTO)を埋める.DBから.
TeamDto teamDto;
teamDto = new TeamDto();
teamDto.memberType = 1;
teamDto.memberTypeName = "医師";
teamDto.memberStaffCodeItems = options;
this.memberItems.add(teamDto);
teamDto = new TeamDto();
teamDto.memberType = 2;
teamDto.memberTypeName = "看護師";
teamDto.memberStaffCodeItems = options;
this.memberItems.add(teamDto);
}
}
public class TeamDto implements Serializable {
private static final long serialVersionUID = -1818361445287026468L;
public String id; // Serviceクラスで自動採番
public String code; // Serviceクラスで自動採番
public Integer version; // Serviceクラスで自動採番
public Integer memberType;
public String memberTypeName;
public String memberStaffCode;
public String memberStaffName;
public List<Map> memberStaffCodeItems; // リストボックス選択肢
}
Seasar-user メーリングリストの案内