Model과 View를 동시에 설정이 가능하며 컨트롤러는 ModelAndView 객체만 리턴하지만 Model과 View가 모두 리턴 가능
@Controller("adminNoticeController")
@RequestMapping("/admin/notice/")
public class NoticeController {
@RequestMapping("list")
public ModelAndView list() {
List<Notice> list = new ArrayList<>();
Notice notice = null;
notice = new Notice();
notice.setId(1);
notice.setTitle("클릭해주세요");
notice.setWriterId("newlec");
list.add(notice);
notice = new Notice();
notice.setId(2);
notice.setTitle("안녕하세요");
notice.setWriterId("minju");
list.add(notice);
ModelAndView mv = new ModelAndView();
mv.setViewName("admin.notice.list"); // View 설정o
mv.addObject("list", list); // ModeL 설정
return mv; // Model, View 함께 리턴
}
ViewPreparer 인터페이스의 execute() 메서드는 TilesRequestContext나 AttributeContext를 이용해서 여러 페이지에 적용되는 영역에서 필요로 하는 데이터를 전달할 수 있다.
public class SubLayoutPreparer implements ViewPreparer { // 뷰가 만들어지기 전에 먼저 실행됨
@Override
public void execute(Request tilesContext, AttributeContext attributeContext) {
Map<String, Object> model = tilesContext.getContext("request"); // 사용자의 요청 얻어오기
model.put("data", "data"); // 타일즈 방식의 데이터 세팅 방식
Object title = model.get("title");
if(title == null) // request에서 가져오는 title이 없을 시 title 설정해주기
// request 덮어쓰기 가능
// title에 '뉴렉처 온라인2'가 나오게 설정
model.put("title", "뉴렉처 온라인2");
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="../../css/style.css" type="text/css" rel="stylesheet">
<!-- SubLayoutPreparer에서 model에 심어준 title 사용-->
<c:set var="title" value="${title }"></c:set>
<title>${title}</title>
<c:set var="js"><tiles:getAsString name="js" /></c:set> <!-- 태그가 태그를 감싸지 않게 하기 -->
<script type="text/javascript" src="/js/admin/notice/${js}"></script>
</head>
<body>
<div id="root">
<!-- header 영역 -->
<tiles:insertAttribute name="header" />
<div id="visual">
<div class="float-content"></div>
</div>
<div id="body">
<div class="float-content">
<!-- asdie 영역, admin에서만 사용할 aside이므로 admin/inc 안에 두기 -->
<tiles:insertAttribute name="aside" />
<!-- main 영역 -->
<tiles:insertAttribute name="main" />
</div>
</div>
<!-- footer 영역 -->
<tiles:insertAttribute name="footer" />
</div>
</body>
</html>
[Spring] Model, ModelMap, ModelAndView 개념 / 차이점
Tiles - JSP 템플릿 상세