Trong ứng dụng Spring MVC, để hiển thị dữ liệu lên giao diện, controller cần chuyển mô hình dữ liệu sang view. Spring cung cấp nhiều cách linh hoạt để thực hiện điều này, chủ yếu thông qua các tham số đầu vào của phương thức xử lý yêu cầu.
1. Sử dụng đối tượng Model của Spring
Thêm tham số Model vào phương thức controller. Dữ liệu được thêm vào model sẽ tự động khả dụng trong view. Khóa (key) nên được khai báo rõ ràng để tránh suy diễn kiểu không mong muốn.
2. Sử dụng Map thuần Java
Vì Model thực chất là một dạng Map, bạn có thể dùng trực tiếp java.util.Map như một thay thế. Spring vẫn nhận diện và xử lý tương tự.
3. Trả về trực tiếp đối tượng hoặc tập hợp
Khi phương thức trả về một đối tượng hoặc danh sách, Spring sẽ tự động đưa nó vào model với key suy ra từ tên lớp, đồng thời suy tên view từ đường dẫn URL.
import java.util.*;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/")
public class PostController {
@GetMapping("/posts/model")
public String getPostsByModel(Model container) {
List<Post> posts = Arrays.asList(
new Post("Bài viết 1", new Date()),
new Post("Bài viết 2", new Date())
);
container.addAttribute("postList", posts);
return "post-list";
}
@GetMapping("/posts/map")
public String getPostsByMap(Map<String, Object> container) {
List<Post> posts = Arrays.asList(
new Post("Tin nhắn từ Map 1", new Date()),
new Post("Tin nhắn từ Map 2", new Date())
);
container.put("postList", posts);
return "post-list";
}
@GetMapping("/posts")
public List<Post> getPostsDirectly() {
return Arrays.asList(
new Post("Trực tiếp 1", new Date()),
new Post("Trực tiếp 2", new Date())
);
}
}
4. Truy cập dữ liệu trong JSP
Dưới đây là ví dụ cách truy xuất dữ liệu từ model trong file JSP sử dụng JSTL:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
<h1>Danh sách bài viết gần đây</h1>
<ul>
<c:forEach items="${postList}" var="item">
<li>
<div><c:out value="${item.message}" /></div>
<div>
<span><c:out value="${item.time}" /></span>
</div>
</li>
</c:forEach>
</ul>
</body>
</html>
5. Kiểm tra kết quả trên trình duyệt
- /posts/model — Cách 1
- /posts/map — Cách 2
- /posts — Cách 3