2009-07-08 6 views
1

나는이 문제로 벽돌 벽을 얼마 동안 두드려왔다. 검색과 읽기가 아무리해도 답을 찾지 못했다. Spring 포럼에 게시했지만 아무 소용이 없습니다. 아마 여기 누군가가 도울 수 있을까요?스프링 2.5의 주석 기반 컨트롤러를 사용하여 HashMap을 바인딩하는 폼

나는 Spring : form taglib와 Spring : bind를 사용하여 폼에 바인딩 한 HashMap을 포함하는 bean을 가지고있다. 보기에 바인딩은 완벽하게 작동하지만 양식을 제출하고 주석 기반 컨트롤러로 처리하면 바인딩이 올바르게 작동하지 않는 것처럼 보입니다. 예외는 없지만 HashMap은 채워지지 않습니다.

는 JSP :

<form:form method="post" action="updateUserPermissions" modelAttribute="wsPermissions" > 
    <table> 
     <tr class="head"> 
      <td>Workspace</td> 
      <td>Read?</td> 
      <td>Write?</td> 
      <td>Manage?</td> 
     </tr> 
     <c:forEach var="ws" varStatus="wsItem" items="${selectedUserWSs}"> 
      <c:set var="wsURI" value="'${ws.uri}'"/> 
      <tr> 
       <td>${ws.kbInfo.name} @ ${ws.community.name}</td> 
       <td> 
        <spring:bind path="wsPermissions.map[${ws.uri}].read"> 
         <input type="checkbox" <c:if test="${status.value}">checked</c:if> disabled="disabled"/> 
        </spring:bind> 
       </td> 
       <td> 
        <spring:bind path="wsPermissions.map[${ws.uri}].write"> 
         <input type="checkbox" <c:if test="${status.value}">checked</c:if>/> 
        </spring:bind> 
       </td> 
       <td> 
        <spring:bind path="wsPermissions.map[${ws.uri}].manage"> 
         <input type="checkbox" <c:if test="${status.value}">checked</c:if>/> 
        </spring:bind> 
       </td> 
       <td><a href="removeUserWorkspace?userid=${selectedUser.email}&wsid=${ws.uri}">[Remove]</a></td> 
      </tr> 
     </c:forEach> 
    </table> 
    <input type="hidden" name="userid" value="${selectedUser.email}" /> 
    <input type="submit" value="Update user permissions" /> 
</form:form> 

이이 작품 바인딩, 체크 박스가 올바른 초기 값을 잘 보여 표시됩니다 여기 내 설정이다. 양식 제출 후,이 제어 방법에 의해 처리된다 :

@RequestMapping 
public String updateUserPermissions(@ModelAttribute(value="wsPermissions") WorkspacePermissionMap wsPermissions, 
     @RequestParam String userid, 
     HttpServletRequest request, ModelMap modelMap){ 
    // code to update permissions here..... 
    LOG.debug(wsPermissions.getMap().size()); 
    //the above prints zero 
    return "redirect:editUser?id="+userid; 
} 

제어기 방법 디버깅의 HashMap가 비어있는 것을 보여준다.

public class WorkspacePermissionMap { 

private Map<String, WorkspacePermission> map = new HashMap<String, WorkspacePermission>(); 

/** 
* @param map the map to set 
*/ 
public void setMap(Map<String, WorkspacePermission> map) { 
    this.map = map; 
} 

/** 
* @return the map 
*/ 
public Map<String, WorkspacePermission> getMap() { 
    return map; 
} 

}

및 WorkspacePermission에 대한 : 여기

는 WorkspacePermissionMap 코드입니다

public class WorkspacePermission { 
private boolean read = false; 
private boolean write = false; 
private boolean manage = false; 


/** 
* @return the write 
*/ 
public boolean isWrite() { 
    return write; 
} 
/** 
* @param write the write to set 
*/ 
public void setWrite(boolean write) { 
    this.write = write; 
    if (write){ 
     setRead(write); 
    } else { 
     setManage(write); 
    } 
} 
/** 
* @return the moderate 
*/ 
public boolean isManage() { 
    return manage; 
} 
/** 
* @param moderate the moderate to set 
*/ 
public void setManage(boolean moderate) { 
    this.manage = moderate; 
    if (moderate){ 
     setWrite(moderate); 
     setRead(moderate); 
    } 
} 
/** 
* @param read the read to set 
*/ 
public void setRead(boolean read) { 
    this.read = read; 
    if (!read){ 
     setWrite(read); 
     setManage(read); 
    } 
} 
/** 
* @return the read 
*/ 
public boolean isRead() { 
    return read; 
} 

}

내가 잘못거야 어디 아무도 지적시겠습니까 ? 나는 틀린 나무를 완전히 짖고 있습니까, 아니면 어리석은 실수를 저질렀습니까?

이 필요한 JSP 경로 식에 대한 몇 가지 불확실성이 확실히있다, 당신의 도움을

크리스

답변

2

을 주셔서 감사합니다.

내가 사용하고 하드 코딩 값 :

applicationDetails['first_name'] 

또는 예를 들어 :

wsPermissions.map['hardcodeduri'].read 

나를 위해이 잘 작동.

제 조언은 먼저 하드 코드 된 다음 동적 변수를 사용하도록 변경할 수 있는지 확인하는 것입니다.

1

HTML 체크 박스 요소에 이름이나 값 속성이없는 이유는 무엇입니까? 봄은 '모든 것'을 당신을위한 마술로 여겨서는 안된다;)

관련 문제