파게로그
[Spring MVC] Tiles를 통한 페이지 모듈 분리(Retired Framework) 본문
프론트와 백의 구분이 점차 이루어지면서 Tiles도 잘 안 쓰이는 추세라고 한다.
페이지 모듈 집중화 <jsp:include>도 가능하지만, 이것도 페이지 만들 때마다 넣기 귀찮으니까 Tiles를 이용한다. header/footer/aside/main(content) layout
1.
HTML 파일(index.html 등등...)에서 <header>를 잘라내서...
2.
view 안에 inc 폴더를 만들어서...
3.
header.jsp를 생성 후 클립보드의 내용을 붙여넣기
4.
<footer>도 footer.jsp로 마찬가지
5.
<div id = "visual">도 잘라내서 (여러 페이지에 공통적으로 있으니까)
view/inc(include)는 완전 공통인 애들
얘는 그건 아니니까 view/customer/inc 폴더 만들어서 여기다가 visual.jsp를 생성 후 클립보드의 내용을 붙여넣기
즉 예를 들면 프로젝트 트리는 다음과 같이 구성될 수 있다...
6.
main까지 별도로 떼어내고 나면,
이렇게 흩어진 것들을 배치할 수 있는 영역(껍데기?)인 레이아웃만 남게된다.
Tiles 호출 과정
/notice/list라는 호출이 들어오면...
Controller가 notice/list를 부르면
-> 먼저 Tiles에서 찾고, 조각들 합쳐서 보여주고 (???)
-> 못 찾으면 ViewResolver가 /WEB-INF/view/notice/list.jsp로 바꿔서 찾고
-> 못 찾으면 오류
(???) 과정은 어떻게..?
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
<property name="order" value="2" />
</bean>
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" />
<property name="order" value="1" />
</bean>
<bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="definitions" value="/WEB-INF/tiles.xml" />
</bean>
tiles.apache.org에...
-> 페이지 조작은 이제는 프론트에서도 하기에 백엔드에서 합쳐주는 Tiles는, 공식적으로는 retired 상태이다.
tiles.xml가 필요한데, 이 파일의 스펙에 대해서는
tiles.apache.org/framework/tutorial/basic/pages.html 참고
컨트롤러가 ModelAndView mv = new ModelAndView("notice.list"); //꼭 .으로 구분하는건아님. 단 제일편함
이렇게 notice.list를 반환하면 tiles.xml에서 <definition name="notice.list">를 찾는다.
template="/WEB-INF/view/customer/inc/layout.jsp"
그리고 나머지 put-attribute의 value에 주소 넣어서 다 갖다붙인다. 물론 /WEB-INF/부터 써줘야함
그럼 이렇게 필요한 페이지의 목록을 정의했다면, 어디에 어떻게 붙일지도 정의해주어야 한다.
tiles.xml의 <put-attribute name="header">를 사용하고자 한다면?
(Tiles가 제공하는 태그 라이브러리를 이용해야 한다. <%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>를 맨 위에 추가해놓고(메이븐에 타일 org.apache.tiles tiles-jsp 추가해야함))
header부분에다가 <tiles:insertAttribute name="header"/> 이렇게 하면된다.
--패턴--
<definition name="notice.list" ...> ... </definition>
<definition name="notice.detail" ...> ... </definition>
일 때...
<definition name="notice.*" ...> ... </definition>으로 와일드카드 사용 가능
-> 이렇게 하면 <put-attribute name="body" value="/WEB-INF/view/customer/notice/{1}.jsp" />처럼
와일드카드에 들어온 문자열을 대입할 수 있음. notice.*.*처럼 2개면 {1}, {2} 사용 가능ㅇㅇ
(<definition name="REGEXP:정규식" ... 도 사용 가능하다..;;)
루트에 있는 걸 *로 찾아버리면 notice.*가 검색이 안되니까
Controller가 반환할 때부터, 그리고 <definition>에서 각각 root.something, root.* 로 하면 된다.
'콤퓨타 왕기초 > Spring' 카테고리의 다른 글
[JDBC] JDBC (0) | 2021.05.01 |
---|---|
[Spring MVC] 데이터 서비스 클래스 (0) | 2021.04.29 |
[Spring MVC] 정적인 리소스 서비스하기 (0) | 2021.04.26 |
[Spring MVC] ViewResolver (0) | 2021.04.26 |
[Spring MVC] Spring Dispatcher를 Front Controller로 설정하기 (0) | 2021.04.26 |