DisPatchServelt에 의해 처리될 뷰를 직접 지정할 수 있고 Model(entity)부분에 있는 데이터를 전달 할 수 있도록 합니다.
public class ModelAndView {
@Nullable
private Object view;
@Nullable
private ModelMap model;
@Nullable
private HttpStatus status;
private boolean cleared = false;
.
.
.
public class ModelMap extends LinkedHashMap<String, Object> {
public ModelMap() {
}
public ModelMap(String attributeName, @Nullable Object attributeValue) {
this.addAttribute(attributeName, attributeValue);
}
public ModelMap(Object attributeValue) {
this.addAttribute(attributeValue);
}
public ModelMap addAttribute(String attributeName, @Nullable Object attributeValue) {
Assert.notNull(attributeName, "Model attribute name must not be null");
this.put(attributeName, attributeValue);
return this;
}
다음과 같이 ModelAndView는 크게 view,model,status로 구성되어있다.
(1) view: view의 path를 담는다.
(2) model: ModelMap 자료형이며 ModelMap은 HashMap을 상속함으로써
Key,Value로 접근이 가능하다. 이때 Key는 Model이 가지고 있는 변수명이고 value는 값이 된다.
(3) status: status의 경우 https의 상태를 의미한다.
-Model부분
@Table(name = "owners")
public class Owner extends Person {
@Column(name = "address")
@NotEmpty
private String address;
@Column(name = "city")
@NotEmpty
private String city;
@Column(name = "telephone")
@NotEmpty
@Digits(fraction=0,integer=10)
private String telephone;
@OneToMany(cascade=CascadeType.ALL,mappedBy="owner")
private Set<Pet> pets;
-Controller부분
@GetMapping("/owners/{ownerId}")
public ModelAndView showOwner(@PathVariable("ownerId") int ownerId) {
ModelAndView mav = new ModelAndView("owners/ownerDetails");
Optional<Owner> OptinalOwner = this.owners.findById(ownerId);
Owner owner = OptinalOwner.get();
for (Pet pet : owner.getPets()) {
pet.setVisits((Set<Visit>) visits.findByPetId(pet.getId()));
}
mav.addObject(owner);
return mav;
}
- View부분
<h2>Owner Information</h2>
<table class="table table-striped" th:object="${owner}">
<tr>
<th>Name</th>
<td><b th:text="*{firstName + ' ' + lastName}"></b></td>
</tr>
<tr>
<th>Address</th>
<td th:text="*{address}"></td>
</tr>
<tr>
<th>City</th>
<td th:text="*{city}"></td>
</tr>
<tr>
<th>Telephone</th>
<td th:text="*{telephone}"></td>
</tr>
</table>
다음과 같이 view에게 데이터를 전달할때 ModelAndView를 이용해서 Model,Path,Status 정보를 한번에 보낼 수 있게 만드는 것이 바로 ModelAndView이다.