[0604] 자바 웹 개발 과정🌞

Let's TECH🧐·2021년 6월 5일
1

자바 웹 개발 과정

목록 보기
24/31
post-thumbnail

ModelAndView

특징

Model과 View를 동시에 설정이 가능하며 컨트롤러는 ModelAndView 객체만 리턴하지만 Model과 View가 모두 리턴 가능

예제

  • NoticeController
@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를 이용한 뷰 설정

특징

ViewPreparer 인터페이스의 execute() 메서드는 TilesRequestContext나 AttributeContext를 이용해서 여러 페이지에 적용되는 영역에서 필요로 하는 데이터를 전달할 수 있다.

예제

  • SubLayoutPreparer
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"); 
	}
}
  • layout.jsp
<%@ 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 템플릿 상세

profile
Minju's Tech Blog

0개의 댓글