newlecture: spring MVC (2) : Tiles

조성우·2021년 7월 18일
0

Spring

목록 보기
2/4

https://www.youtube.com/watch?v=F8-elAVTSzE
뉴렉쌤 항상 감사합니다 !

문제점.. 어느 한 부분을 수정하면 모두 수정해야 한다.

이렇게 집중 할 수 있도록 해야 한다.

jsp 에 저런 기능이 있지만.. 이 역시 중복을 야기한다.

이때 바로 Tiles를 사용하는 것이다.

Tiles


notice/list 요청은 일반적인 jsp 요청으로
notice.list 요청은 tiles가 조립하는 요청으로 가게끔 한다.


참고로 Tiles는 은퇴했다ㅠㅠ

Tiles 초기 설정

<tiles-definitions>
  <definition name="notice.list" template="/WEB-INF/view/customer/inc/layout.jsp">
    <put-attribute name="title" value="Tiles tutorial homepage" />
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="visual" value="/WEB-INF/view/customer/inc/visual.jsp" />
    <put-attribute name="aside" value="/WEB-INF/view/customer/inc/aside.jsp" />
    <put-attribute name="body" value="/WEB-INF/view/customer/notice/list.jsp" />
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
  </definition>
  <definition name="notice.detail" template="/WEB-INF/view/customer/inc/layout.jsp">
    <put-attribute name="title" value="Tiles tutorial homepage" />
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="visual" value="/WEB-INF/view/customer/inc/visual.jsp" />
    <put-attribute name="aside" value="/WEB-INF/view/customer/inc/aside.jsp" />
    <put-attribute name="body" value="/WEB-INF/view/customer/notice/detail.jsp" />
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
  </definition>
</tiles-definitions>

내 경우는 위와 같은 설정이 나왔다

page마다 저렇게 할 수는 없으니.. 리펙터링 예정이다


Tiles 다운
pom파일 > Dependencies탭 > add > org.apache tiles-jsp

<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>

layout.jsp에 위 문장을 추가하자

<tiles:insertAttribute name="header" />

각 layout의 위치에 위와 같이 설정하면 된다

<tiles:getAsString name="title" />

공통으로 놓을 문자열은 위와 같이 설정한다.

    <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>

    <bean name="" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
    	<property name="prefix" value="/WEB-INF/view/" />
    	<property name="suffix" value=".jsp" />
    	<property name="order" value="2"></property>
    </bean>

disaptcher-servlet.xml에 위 설정을 추가한다.

jstl lib가 없을 경우 500에러가 나는데
maven에서 추가해주자 (javax.servlet.jstl)

다 되면 위와 같이 뜬다.

  <definition name="notice.*" template="/WEB-INF/view/customer/inc/layout.jsp">
    <put-attribute name="title" value="공지사항" />
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="visual" value="/WEB-INF/view/customer/inc/visual.jsp" />
    <put-attribute name="aside" value="/WEB-INF/view/customer/inc/aside.jsp" />
    <put-attribute name="body" value="/WEB-INF/view/customer/notice/{1}.jsp" />
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
  </definition>

위와 같이 설정을 바꾸면 list나 detail 등의 요청에 대해 대응이 가능하다.

notice.*.*.* 이렇게 level이 3단계까지 내려가는 요청이 오면
~/notice/{1}/{2}/{3} 이렇게 설정해주면 된다

root의 index 페이지를 설정해보자

  <definition name="*" template="/WEB-INF/view/inc/layout.jsp">
    <put-attribute name="title" value="공지사항목록" />
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="body" value="/WEB-INF/view/{1}.jsp" />
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
  </definition>

위와 같이 설정할때
* 요청이 notice.*의 요청까지 가로챌 수 있다
그렇다고 순서를 뒤바꾸면.. 무한 루프에 빠질 가능성이 있다.

* -> root.* 로 바꾸고
IndexController도 return "root.*";로 바꾸자

profile
가장 아름다운 하나의 해답이 존재한다

0개의 댓글