위와 같은 폼처럼 라디오버튼이 체크된 값들을 view 단에서 보낼 때, Spring 3.0 에서 처리하는 방법
View
...(중간 생략)
<c:forEach var="vo" items="${vo }" varStatus="i">
<div class="research">
<p>${i.count }. ${vo.surq_title }</p>
<input type="hidden" id="surq_seqItem${i.count }" name="surq_seqItem" class="txt" value="${i.count }">
<input type="hidden" id="surq_item${i.count }" name="surq_item" value="${vo.surq_title }">
<input type="hidden" id="suri_seqItem${i.count }" name="suri_seqItem" value="${vo.suri_seq }">
<ul>
<li><input type="radio" id="suri_num${i.count }" name="suri_numItem${i.count }" value="① ${vo.suri_title1 }" /> <label for="suri_num${i.count }">① ${vo.suri_title1 } </label></li>
<li><input type="radio" id="suri_num${i.count }" name="suri_numItem${i.count }" value="② ${vo.suri_title2 }" /> <label for="suri_num${i.count }">② ${vo.suri_title2 } </label></li>
<li><input type="radio" id="suri_num${i.count }" name="suri_numItem${i.count }" value="③ ${vo.suri_title3 }" /> <label for="suri_num${i.count }">③ ${vo.suri_title3 } </label></li>
<li><input type="radio" id="suri_num${i.count }" name="suri_numItem${i.count }" value="④ ${vo.suri_title4 }" /> <label for="suri_num${i.count }">④ ${vo.suri_title4 } </label></li>
<li><input type="radio" id="suri_num${i.count }" name="suri_numItem${i.count }" value="⑤ ${vo.suri_title5 }" /> <label for="suri_num${i.count }">⑤ ${vo.suri_title5 } </label></li>
</ul>
</div>
</c:forEach>
...(중간 생략)
<form name="form-researchSave" action="researchSave.do" method="post">
<input type="hidden" id="sur_seq" name="sur_seq" value="${voi.sur_seq }" />
<input type="hidden" id="surq_seqItem" name="surq_seqItem" class="surq_seqItem" />
<input type="hidden" id="surq_item" name="surq_item" class="surq_item"/>
<input type="hidden" id="suri_seqItem" name="suri_seqItem" class="suri_seqItem"/>
<input type="hidden" id="suri_numItem" name="suri_numItem" class="suri_numItem"/>
</form>
c:forEach 문으로 DB에 저장된 값을 뿌려주는 것이니 <form>태그쪽만 신경써서 보면 된다.
Controller
@RequestMapping(value="/researchSave.do")
public ModelAndView researchSave(researchVO vo) {
this.service.insertResult(vo);
return new ModelAndView("redirect:/researchList.do");
}
Service
@Override
public int insertResult(researchVO vo) {
return this.dao.insertResult(vo);
}
DAO - 처음 시도한 소스
@Override
public int insertResult(researchVO vo) {
List<String> Suri_num = vo.getSuri_numItem(); // 선택번호. 예)[1,2,3,4,5]
List<String> Suri_seq = vo.getSuri_seqItem(); // 선택번호에 각각 부여된 sequence. 예)[001, 002, 003, 004,005, ..]
List<String> Surq_seq = vo.getSurq_seqItem(); // 문제번호. 예) [Question01, Question02]
List<String> Surq = vo.getSurq_item(); // 각 항문의 답변. 예) [Answer1, Answer2]
String[] snum=null;
String[] sseq=null;
String[] sqseq=null;
String[] surq=null;
for(int i=0;i<Suri_num.size();i++) {
snum = Suri_num.get(i).split(",");
sseq = Suri_seq.get(i).split(",");
sqseq = Surq_seq.get(i).split(",");
surq = Surq.get(i).split(",");
}
int n=0;
for(int j=0;j<snum.length;j++) {
String surr_seq=this.getSqlSession().selectOne(namespace+".getSurr_seq");
vo.setSurr_seq(surr_seq);
vo.setSuri_num(snum[j]);
vo.setSuri_seq(sseq[j]);
vo.setSurq_seq(sqseq[j]);
vo.setSurq_title(surq[j]);
String title1 = this.replace(vo.getSuri_num());
vo.setSuri_num(title1);
String title2 = this.replace(vo.getSurq_title());
vo.setSurq_title(title2);
n = this.getSqlSession().insert(namespace+".insertResult", vo);
}
return 0;
}
위 소스로 돌려보니 에러가 났다. 파라미터를 List에 담아서(빨간 글씨 부분) for문을 List 크기만큼 돌렸더니 계속 List의 사이즈가 1로 되어있어, for문이 한 번 밖에 돌지 않아 에러가 났다.
ex) List<String> Suri_num = vo.getSuri_numItem(); // 선택번호. 예)[1,2,3,4,5]
for(int i=0; i<Suri_num.size(); i++) {
사이즈 크기를 1로 인식함
그래서 아래와 같이
for(int i=0; i < vo.getSuri_numItem().size(); i++)
리스트 변수에 담아주지 않고 ↑위에 처럼 바로 파라미터 값의 크기를 for문에 넣어주었다.
(참고로 변수 'suri_numItem' 의 데이터타입은 List<String> 이다.)
이렇게 해주니 잘 돌아간다. 다만 소스가 뭔가 깔끔하거나 효율적이지 못한 것 같다. 시간나면 더욱 효율적으로 짜봐야겠다.
오늘은 바빠서 여기까지 써야겠다.
DAO - 위의 소스를 수정한 소스
@Override
public int insertResult(researchVO vo) {
String[] suriNumArray = null; // 선택번호
for(int i=0; i < vo.getSuri_numItem().size(); i++){
suriNumArray = vo.getSuri_numItem().get(i).split(",");
}
String[] suriSeqArray = null; // 문항번호
for(int i=0; i < vo.getSuri_seqItem().size(); i++){
suriSeqArray = vo.getSuri_seqItem().get(i).split(",");
}
String[] surqSeqPramArray = null; // 문제번호 파라미터
List<String> surqSeqPramList = new ArrayList<String>();
for(int i=0; i < vo.getSurq_seqItem().size(); i++){
surqSeqPramArray = vo.getSurq_seqItem().get(i).split(",");
}
String[] surqSeqArray = new String[surqSeqPramArray.length]; // 문제번호
List<String> surqSeqByDB = this.getSqlSession().selectList(NAMESPACE+".selectSurqSeq_BySurSeq", vo.getSur_seq());
for(int i=0; i < surqSeqPramArray.length; i++){
String num = Integer.toString(i+1);
surqSeqPramList.add(surqSeqPramArray[i]);
if(surqSeqPramList.get(i).equals(num)){
surqSeqArray[i] = surqSeqByDB.get(i);
}
}
String[] surqArray = null; // 문제내용
for(int i=0; i < vo.getSurq_item().size(); i++){
surqArray = vo.getSurq_item().get(i).split(",");
}
int n=0;
for(int j=0;j<suriNumArray.length;j++){
String surr_seq=this.getSqlSession().selectOne(NAMESPACE+".getSurr_seq");
vo.setSurr_seq(surr_seq);
vo.setSuri_num(suriNumArray[j]);
vo.setSuri_seq(suriSeqArray[j]);
vo.setSurq_seq(surqSeqArray[j]);
vo.setSurq_title(surqArray[j]);
String title1=this.replace(vo.getSuri_num());
vo.setSuri_num(title1);
String title2=this.replace(vo.getSurq_title());
vo.setSurq_title(title2);
}
n = this.getSqlSession().insert(NAMESPACE+".insertResult", vo);
}
return 0;
}