[Spring MVC] - Spring MVC의 여러 가지 매개 변수 바인딩 방식을 자세히 설명합니다.

SpringMVC의 다양한 매개변수 바인딩 방식
1. 기본 데이터 유형(int의 경우 다른 유사):
Controller 코드:

@RequestMapping("saysth.do")
public void test(int count) {
}
양식 코드:

<form action="saysth.do" method="post">
<input name="count" value="10" type="text"/>
......
</form>
폼에서 input의name 값과 Controller의 매개 변수 이름이 일치하면 데이터 연결을 완성할 수 있습니다. 일치하지 않으면 @RequestParam 주석을 사용할 수 있습니다.주의해야 할 것은 컨트롤러 방법 매개 변수에 기본 데이터 형식이 정의되어 있지만 페이지에서 제출한 데이터가null 또는''이면 데이터 변환의 이상이 발생할 수 있습니다. 즉, 폼이 전달한 데이터가null 또는''이 되지 않도록 해야 합니다. 따라서 개발 과정에서 비어 있을 수 있는 데이터에 대해서는 매개 변수 데이터 형식을 포장 형식으로 정의하는 것이 좋습니다. 구체적인 예는 아래의 예시를 참고하십시오.
 2. 포장 유형(Integer의 경우 기타 유사):
Controller 코드:

@RequestMapping("saysth.do")
public void test(Integer count) {
}
양식 코드:

<form action="saysth.do" method="post">
<input name="count" value="10" type="text"/>
......
</form>
기본 데이터 형식과 기본적으로 다른 점은 폼이 전달하는 데이터는null 또는''이며, 위 코드를 예로 들면, 폼에num이'이거나'폼에num이라는 input가 없으면 컨트롤러 방법 매개 변수의num값은null이다.
 3. 객체 유형 사용자 정의:
모델 코드:

public class User {
  private String firstName;
  private String lastName;

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

}

Controller 코드:

@RequestMapping("saysth.do")
public void test(User user) {
}
양식 코드:

<form action="saysth.do" method="post">
<input name="firstName" value=" " type="text"/>
<input name="lastName" value=" " type="text"/>
......
</form>
아주 간단합니다. 대상의 속성 이름과 input의name 값을 일일이 일치시키기만 하면 됩니다.
4. 복합 객체 유형 사용자 정의:
모델 코드:

public class ContactInfo {
  private String tel;
  private String address;

  public String getTel() {
    return tel;
  }

  public void setTel(String tel) {
    this.tel = tel;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

}

public class User {
  private String firstName;
  private String lastName;
  private ContactInfo contactInfo;

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

  public ContactInfo getContactInfo() {
    return contactInfo;
  }

  public void setContactInfo(ContactInfo contactInfo) {
    this.contactInfo = contactInfo;
  }

}

Controller 코드:

@RequestMapping("saysth.do")
public void test(User user) {
  System.out.println(user.getFirstName());
  System.out.println(user.getLastName());
  System.out.println(user.getContactInfo().getTel());
  System.out.println(user.getContactInfo().getAddress());
}
양식 코드:

<form action="saysth.do" method="post">
<input name="firstName" value=" " /><br>
<input name="lastName" value=" " /><br>
<input name="contactInfo.tel" value="13809908909" /><br>
<input name="contactInfo.address" value=" " /><br>
<input type="submit" value="Save" />
</form>
User 객체에는 ContactInfo 속성이 있습니다. Controller의 코드는 세 번째 점과 일치하지만, 폼 코드에서는 "속성 이름(대상 유형의 속성). 속성 이름"을 사용하여 input의name을 명명해야 합니다.
5. List 바인딩:
List는 Controller 메서드의 매개 변수에 직접 쓸 수 없는 객체에 바인딩해야 합니다.
모델 코드:

public class User {
  private String firstName;
  private String lastName;

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

}

public class UserListForm {
  private List<User> users;

  public List<User> getUsers() {
    return users;
  }

  public void setUsers(List<User> users) {
    this.users = users;
  }

}

Controller 코드:

@RequestMapping("saysth.do")
public void test(UserListForm userForm) {
  for (User user : userForm.getUsers()) {
    System.out.println(user.getFirstName() + " - " + user.getLastName());
  }
}
양식 코드:

<form action="saysth.do" method="post">
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="2"><input type="submit" value="Save" /></td>
</tr>
</tfoot>
<tbody>
<tr>
<td><input name="users[0].firstName" value="aaa" /></td>
<td><input name="users[0].lastName" value="bbb" /></td>
</tr>
<tr>
<td><input name="users[1].firstName" value="ccc" /></td>
<td><input name="users[1].lastName" value="ddd" /></td>
</tr>
<tr>
<td><input name="users[2].firstName" value="eee" /></td>
<td><input name="users[2].lastName" value="fff" /></td>
</tr>
</tbody>
</table>
</form>
사실, 이것은 네 번째 User 대상의 contant Info 데이터와 약간 유사하지만, 이곳의 UserListForm 대상의 속성은 일반 사용자 정의 대상이 아니라 List로 정의됩니다.따라서 양식에서 List의 아래 첨자를 지정해야 합니다.특히, Spring은 최대 아래첨자 값을size로 하는List 대상을 만들 것입니다. 따라서 만약에 표에 동적으로 줄을 추가하고 삭제하는 상황이 있다면 특히 주의해야 합니다. 예를 들어 한 표의 경우 사용자가 사용 과정에서 여러 차례 줄을 삭제하고 줄을 늘리는 작업을 거친 후에 아래첨자 값은 실제 크기와 일치하지 않습니다. 이때 리스트의 대상은 표에 아래첨자가 있는 것들에만 값이 있습니다.그렇지 않으면null이 됩니다. 예를 들어 다음과 같습니다.
양식 코드:

<form action="saysth.do" method="post">
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="2"><input type="submit" value="Save" /></td>
</tr>
</tfoot>
<tbody>
<tr>
<td><input name="users[0].firstName" value="aaa" /></td>
<td><input name="users[0].lastName" value="bbb" /></td>
</tr>
<tr>
<td><input name="users[1].firstName" value="ccc" /></td>
<td><input name="users[1].lastName" value="ddd" /></td>
</tr>
<tr>
<td><input name="users[20].firstName" value="eee" /></td>
<td><input name="users[20].lastName" value="fff" /></td>
</tr>
</tbody>
</table>
</form>
이때 Controller의 userForm.getUsers () 는 List의 크기가 21이고 21개의 사용자 대상은null이 되지 않지만, 2에서 19까지의 사용자 대상 중의firstName과lastName은null입니다.인쇄 결과:

aaa - bbb
ccc - ddd
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
null - null
eee - fff
6. 바인딩 설정:
Set은 List와 유사하며 Controller 방법의 매개 변수에 직접 쓸 수 없으며 대상에 귀속되어야 합니다.단, Set 데이터를 귀속할 때, 반드시 먼저 Set 대상에add에 해당하는 수량의 모델 대상을 추가해야 한다.
모델 코드:

public class User {
  private String firstName;
  private String lastName;

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

}

public class UserSetForm {
  private Set<User> users = new HashSet<User>();

  public UserSetForm() {
    users.add(new User());
    users.add(new User());
    users.add(new User());
  }

  public Set<User> getUsers() {
    return users;
  }

  public void setUsers(Set<User> users) {
    this.users = users;
  }

}

Controller 코드:

@RequestMapping("saysth.do")
public void test(UserSetForm userForm) {
  for (User user : userForm.getUsers()) {
    System.out.println(user.getFirstName() + " - " + user.getLastName());
  }
}

양식 코드:

<form action="saysth.do" method="post">
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="2"><input type="submit" value="Save" /></td>
</tr>
</tfoot>
<tbody>
<tr>
<td><input name="users[0].firstName" value="aaa" /></td>
<td><input name="users[0].lastName" value="bbb" /></td>
</tr>
<tr>
<td><input name="users[1].firstName" value="ccc" /></td>
<td><input name="users[1].lastName" value="ddd" /></td>
</tr>
<tr>
<td><input name="users[2].firstName" value="eee" /></td>
<td><input name="users[2].lastName" value="fff" /></td>
</tr>
</tbody>
</table>
</form>
기본적으로 List 바인딩과 유사합니다.
특별히 주의해야 할 것은 최대 하위 값이 Set의size보다 크면 org를 던진다는 것이다.springframework.beans.InvalidPropertyException 예외입니다.그래서 사용할 때 불편합니다.
 7. 지도 바인딩:
맵이 가장 유연합니다. 또한 대상에 연결되어야 하며, 컨트롤러 방법의 매개 변수에 직접 쓸 수 없습니다.
모델 코드:

public class User {
  private String firstName;
  private String lastName;

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

}

public class UserMapForm {
  private Map<String, User> users;

  public Map<String, User> getUsers() {
    return users;
  }

  public void setUsers(Map<String, User> users) {
    this.users = users;
  }

}

Controller 코드:

@RequestMapping("saysth.do")
public void test(UserMapForm userForm) {
  for (Map.Entry<String, User> entry : userForm.getUsers().entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue().getFirstName() + " - " +
    entry.getValue().getLastName());
  }
}
양식 코드:

<form action="saysth.do" method="post">
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="2"><input type="submit" value="Save" /></td>
</tr>
</tfoot>
<tbody>
<tr>
<td><input name="users['x'].firstName" value="aaa" /></td>
<td><input name="users['x'].lastName" value="bbb" /></td>
</tr>
<tr>
<td><input name="users['y'].firstName" value="ccc" /></td>
<td><input name="users['y'].lastName" value="ddd" /></td>
</tr>
<tr>
<td><input name="users['z'].firstName" value="eee" /></td>
<td><input name="users['z'].lastName" value="fff" /></td>
</tr>
</tbody>
</table>
</form>
인쇄 결과:

x: aaa - bbb
y: ccc - ddd
z: eee - fff
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기