2012-06-20 4 views
0

나는 잠시 동안 이것을 연구 해왔다. 나는 How to update a the contents of a list displayed on JSP using Struts2? 을 읽었으며, 내가 필요로하는 것에 아주 가깝지만, 여전히 나의 문제를 해결할 수는 없다.Struts2 - 양식으로 컬렉션을 업데이트하는 방법

개체가 java.util.Set 있습니다. 클래스는 'Event'이고, 집합의 이름은 'events'입니다. JSP에서 사용자가 Event 객체의 속성을 수정할 수 있도록하는 양식을 제시하고자하지만 한 번에 둘 이상을 업데이트하려고합니다.

<s:form theme="simple"> 
    <table> 
    <s:iterator value="events" var="ev"> 
    <tr> 
     <td> <s:textfield name="?????" value="%{#ev.price}" </td> 
     <td> <s:textfield name="?????" value="%{#ev.amount}" </td> 
    </tr> 
    </s:iterator> 
    <tr><td colspan="2"> 
     <s:submit value="Apply" action="EditEventsAction_save" ></s:submit> 
    </td></tr> 
    </table> 
</s:form> 

내 문제는 (내가 생각하는) 내 설정을 업데이트하기 위해 texfield의 이름에 갈 필요 것입니다 : 여기 내 JSP 조각입니다.

텍스트 필드의 데이터가 내 세트 구성원을 업데이트하도록 지정하려면 어떻게해야합니까?

이것이 가능합니까?

UPDATE

이 크게 나는 type conversion docs에서 읽은 내용에 따라 내 최신 (간체) 시도이다.

양식을 올바르게 채우지 만 텍스트 필드에 입력 한 내용은 제출시 캡처되지 않습니다.

Action 클래스 :

public class TestAction extends ActionSupport implements Preparable { 

    private static HashMap<Integer, AssetId> assetMap = new HashMap<Integer, AssetId>(); 

    public String execute() { 
     return SUCCESS; 
    } 

    public void prepare() throws Exception { 
     AssetId a1 = new AssetId(1, "Asset 1"); 
     AssetId a2 = new AssetId(2, "Asset 2"); 
     AssetId a3 = new AssetId(3, "Asset 3"); 
     assetMap.put(1, a1); 
     assetMap.put(2, a2); 
     assetMap.put(3, a3); 
    } 

    public String save() { 
     return SUCCESS; 
    } 

    public static HashMap<Integer, AssetId> getAssetMap() { 
     return assetMap; 
    } 

    public static void setAssetMap(HashMap<Integer, AssetId> assetMap) { 
     TestAction.assetMap = assetMap; 
    } 
} 

JSP :

<%@ taglib uri="/struts-tags" prefix="s" %> 

<html> 
    <body>  
    <s:form theme="simple"> 
     <table> 
     <s:iterator value="assetMap" var="asset"> 
      <tr> 
      <td><s:textfield name="assetMap[key].clientId" /></td> 
      </tr> 
     </s:iterator> 
     <tr><td colspan="2"><s:submit value="Apply!" action="TestAction_save" /></td></tr> 
     </table> 
    </s:form> 
    </body> 
</html> 

AssetId 클래스 :

public class AssetId implements java.io.Serializable { 
    private int assetId; 
    private String clientId; 
    // And public getters/setters 
} 

TestAction-conversion.properties

Key_assetMap=java.lang.Integer 
Element_assetMap=AssetId 
CreateIfNull_assetMap=false 
,
+0

이 값이 의미 반대하는 표시하는지도 나 컬렉션을 사용하여 에. –

+0

나는 HashMap도 시도했다. 올바른 개체를 참조하기 위해 양식에서 키를 사용하는 방법은 분명하지 않습니다. –

+0

각 텍스트 필드에 고유 한 변수 이름을 사용하는 새 버전 (HashMap 사용)과 해시 맵 키가 들어있는 숨겨진 필드가 있습니다. 이들 각각은 Action 클래스에서 String []으로 액세스 할 수 있습니다. 이것은 작동 할 것이지만, 그것은 clunky 보인다. 더 깨끗한 솔루션이 있습니까? –

답변

1

여러 가지 문제가 있습니다. 로그 파일에 스택 추적을 보았어 야합니다.

가장 중요 : 렌더링 된 HTML을 확인하지 않았습니다. 만약 당신이 가지고 있었다면, 당신은 key 렌더링을 그대로 보았을 것입니다. –은 평가되지 않았습니다. 문서에 OGNL 이스케이프가 표시되었지만 내 잘못 (설명이 불완전 함)입니다. 당신은 반복의 현재 객체의 key을 평가하기 위해 노력하고 있기 때문에

<s:textfield name="assetMap[%{key}].clientId" /> 

당신은 당신이하지 나머지를 평가하고자 할 OGNL 이스케이프 시퀀스 –에 포장해야합니다. 이 렌더링 :

<input type="text" name="assetMap[1].clientId" value="foo" id="map_save_assetMap_1__clientId"/> 

항상 렌더링 된 HTML을 확인하십시오.

결국 정적지도가 문제가됩니다. 인스턴스 속성이어야합니다 (또는 ThreadLocal이지만, IMO에서는이를 정당화하는 데 어려움을 겪습니다).

이 아니라면에 유형 변환 파일이 필요합니다. 그것은 대부분 유산 유산입니다.AssetId 클래스를 찾을 수 없다는 예외가 발생 했어야합니다. 그 일이 내 제출 방법에 자산의지도를 로그인하는 경우의 돌보아되면

, 나는 참조 : 키 또는 인덱스가 그래서

{[email protected], [email protected], [email protected]} 
+0

우수합니다, 솔루션뿐만 아니라 설명을 주셔서 감사합니다. 디버깅은 여전히 ​​약간의 도전입니다. –

+0

@ ben_979 항상 그렇습니다.) 문제의 일부는 S2 문서 중 일부가 * 아직 * 유산이며 업데이트해야합니다. 특히 유형 변환 비트를 업데이트해야합니다. 할 일 목록에 추가했습니다. 가져와 주셔서 감사합니다. –

관련 문제