2014-02-05 4 views
0

안녕하세요. 스택 오버플로가 발생했습니다. 최근 Struts 응용 프로그램에서 문제가 발생했습니다. 내가 제대로 일부 콩 값을 표시하는 JSP를 (내가, 내가 극단적으로 단순화 된 코드의 관련 부분을 붙여 넣기) 한 :Struts 1 : 폼에서 Bean 값을 읽을 수 있지만 제출시 쓰기가되지 않습니다.

<table> 
    <logic:iterate name="bean" property="list1" id="listItem"> 
    <tr> 
     <td> 
      <html:checkbox name="listItem" property="selected"> 
      </html:checkbox> 
     </td> 
    </logic:iterate> 
</table> 

내 콩은 getter와 setter를 가진 목록 1 속성이

private List<RandomObject> list1; 

public List getList1() { 
    return list1; 
    } 


public void setList1(List list1) { 
    this.list1=list1; 
    } 

내 하위 콩이 선택한 특성이있다 :이 JSP를 입력 할 때, 내가 얻을 값 즉, 올바른 이제

private boolean selected; 
public boolean isSelected() { 
    return selected; 
} 

public void setSelected(boolean selected) { 
    this.selected = selected; 
} 

을 : DB 내 매핑 개체가 선택에 있었다면 = 트루 e, 체크 박스가 선택됩니다. 내가 얻지 못하는 것은이 양식에서 내가 한 변화를 어떻게 저장 하는가입니다. 제출할 때 모든 변경 사항이 손실됩니다. 이것은 순수 Struts와 관련이 있습니다. 왜냐하면 디버그에서 StrutsAction을 제출하여 링크를 제출하면 ActionForm은 이미 모든 흥미로운 값을 잃어 버렸기 때문입니다. 또한 나는 그것이 보유하고 싶은 값이 메인 빈에 직접 저장되어있는 것이 아니라 오히려 하위 빈의 프로퍼티라는 사실과 관련이 있다고 느낀다. 왜냐하면 동일한 페이지에 다른 많은 bean이 있기 때문이다. 메인 빈에 직접 속성을 저장하는데 문제가 없습니다.

나는 무엇을 놓쳤는가?

답변

0

렌더링 된 HTML에 name 속성이 잘못 선언 된 것 같습니다. 당신이 당신의 페이지에 대한 생성 된 소스 코드를 보면 아마 다음과 같습니다

양식 빈 클래스에서 selected 필드 보일 것이다
<input type="checkbox" name="selected" ...> 

.

당신이 <nested:form>, <nested:iterate><nested:checkbox 스트럿츠 태그가 아닌 <html:form>,and`의 사람을 사용하려는 폼 bean의 필드의 컬렉션을 사용하는 경우. 그래서 다음과 같을 것이다 : 그들은 필요하지 있기 때문에 나는, 스트럿츠 태그에서 name 특성을 제거했습니다

<nested:form action="foo"> 
... 

    <nested:iterate property="list1" id="listItem"> 
    <tr> 
     <td> 
      <nested:checkbox property="selected"> 
      </nested:checkbox> 
     </td> 
    </tr> 
    </nested:iterate> 

... 
</nested:form> 

주 (내 경험에 그들은 실제로 모든 종류의 문제를 야기 - 당신이 사용하는 경우 <nested:*> 태그는 name 속성을 사용하지 않습니다. <nested:iterate>의 경우 중첩 수준은 양식 빈 자체이므로 양식 빈에서 list1 속성을 찾아야한다는 것을 알고 있습니다.

해당 태그는 자체 중첩 수준을 만들기 때문에 <nested:checkbox은 반복에서 현재 요소의 속성을 검색해야한다는 것을 알고 있습니다. 양식의 list1 필드에서 참조 컬렉션에

첫 번째 요소의 selected 필드를 의미
<input type="checkbox" name="list1[0].selected" ...> 

(인덱스 0) :

렌더링 된 HTML은 (첫 번째 요소)과 같이 보일 것입니다 콩.

물론 요청 범위가 아닌 세션 범위의 양식 bean을 사용하고 있는지 확인해야합니다.내 경우에는

0

은 내가

내가 체크 박스에 속성 이름을 삭제 해결 (... 어떤 콩으로 속성을 찾을 수 없습니다)이 나에게 오류를 제공 그렇지 않으면 반복 처리에 이름 속성을 넣어했다 : 그것을 보인다 양식과 연결되지 않은 페이지 범위에서 새 개체를 만듭니다. HTML을 변경하지 않았다 :-) 그것 뿐이다

<nested:iterate id="apertura" type="it.puglia.innova.view.actionform.AperturaForm" indexId="index" name="strutturaRuraleForm" property="listAperturaForm"> 
    <nested:checkbox styleId="checkbox_${index}" property="flagContinuato" onchange="changeOrarioContinuato(${index})"/> 

: 너무 중첩에 형태

내 코드입니다.

bye