반응형
<Tiles 기본>
- tiles 란?
- 반복적으로 사용되는 header, footer와 같은 정보를 한곳에 모아둔 프레임 워크
- tiles3로 오면서 설정이 더욱 간단해 졌다. tiles3는 spring3.2 버전 이상부터 쓰일 수 있으니 참고바람.
- pom.xml에 3가지 dependency를 추가한다.
pom.xml
<
dependency
>
<
groupId
>org.apache.tiles</
groupId>
<
artifactId
>tiles-extras</
artifactId>
<
version
>3.0.0</
version
>
</
dependency
>
<
dependency
>
<
groupId>org.apache.tiles</
groupId>
<
artifactId>tiles-jsp</
artifactId>
<
version
>3.0.0</
version
>
</
dependency
>
<
dependency
>
<
groupId>org.apache.tiles</
groupId>
<
artifactId>tiles-servlet</
artifactId>
<
version
>3.0.0</
version
>
</
dependency
></
p
>
- tiles를 유동적으로 사용하고 싶다면 다음과 같이 설정한다. 우선 모든 view들은 tiles를 정의한 tiles 설정 파일의 definition들에서
binding될 jsp 등의 view 파일들을 찾게됩니다. 만약 각 views.xml에서 view 파일을 못찾게 되면 우선순위가 2인 InternalResourceViewResolver 에서 해당 view 파일을 찾게 됩니다.
참고 >>
view resolver
- View Resolver는 Spring의 DispatcherServlet이 Controller의 응답 결과를 가져올 때, 어떤 방식으로 view 객체를 가져올지 정하고 해당 객체를 생성한다.
- View Resolver를 구현한 클래스는 InternalResourceViewResolver, BeanNameViewResolver, XmlViewResolver, UrlBasedViewResolver 등이 있다.
- DispatcherServlet은 여러개의 ViewResolver를 가질 수 있는데, 'order' property에 따라 어떤 ViewResolver를 결정할지 우선순위를 정할 수 있다. 우선순위를 명시하지 않으면 가장 낮은 우선순위를 가진다.
- 우선순위가 높은 ViewResolver에게 View 객체를 요청하는데, 만약 null을 리턴한다면 그 다음 우선순위의 ViewResolver에게 객체를 요청하게 된다.
- InternalResourceViewResolver는 항상 mapping되는 view 객체를 리턴하고, 없다고 null을 반환하지 않으므로 항상 가장 낮은 우선순위로 두어야한다.
dispatcher-servlet.xml
<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" />
<property name="order" value="1" />
</bean>
// tiles의 우선순위를 1로 설정해둔다.
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="2"></property>
</bean>
//기존에 써있던 view resolver 에서 우선순위만 바꿔줬다.
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles/tiles.xml</value>
</list>
</property>
</bean>
//tiles관련 설정파일
//만약 여러개 하고 싶다면 list의 value를 추가해주면 된다.
- 다음은 tiles 설정파일 tills.xml
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<definition name="default" template="/WEB-INF/views/layout/layout.jsp">
<put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
<put-attribute name="body" value=""/>
<put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
</definition>
//기본적인 defiinition 태그를 하나 만들어둔다.
<definition name="tiles" extends="default">
<put-attribute name="body" value="/WEB-INF/views/layout/mainTest.jsp" />
</definition>
// defiinition 을 상속받아 여러 타일즈를 만들수 있다.
</tiles-definitions>
빨간색으로 표시한 definition name="tiles" <- 이부분이 중요하다. 이부분때문에 오류가 많이난다.
- layout.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
</head>
<body>
<div id="wrap">
<div >
<div>
<div>
<tiles:insertAttribute name="header" />
</div>
</div>
<div>
<div>
<tiles:insertAttribute name="body" />
</div>
</div>
<div>
<div>
<tiles:insertAttribute name="footer" />
</div>
</div>
</div>
</div>
</body>
</html>
기본적으로 만들고 싶은 틀을 html 형식으로 만들어 준다. <tiles:insertAttribute name="footer" /> 의 name은 tiles.xml에서 설정한 name과 같아야 한다.
- Controller mapping 추가
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String hello(Locale locale, Model model) {
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "tiles";
}
return 값과 definition에서 정의한 name이 반드시 일치하게 해야 404 에러가 안난다. 기본적인 설정은 완료하였다.
응용버전은 추후 추가하도록 하겠다.
- 기본적인 부분 완성! - header.jsp , footer.jsp, mainTest.jsp 는 커밋해놓았으니 각자 코드를 확인해보기 바란다!
<Tiles 응용>
앞서 소개한 tiles 를 우리 프로젝트에 응용할 수 있도록 해보겠다.
우리가 앞서 소개한 부분은 defulat이다. 근데 나는 left 메뉴가 있는화면도 필요하다면 tiles.xml에 <definition>을 추가할 수 있다.
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
<definition name="default" template="/WEB-INF/views/layout/layout.jsp">
<put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
<put-attribute name="body" value=""/>
<put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
</definition>
<1>
<definition name="withLeft" template="/WEB-INF/views/layout/layout_left.jsp">
<put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
<put-attribute name="left" value=""/>
<put-attribute name="body" value=""/>
<put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
</definition>
<definition name="tiles" extends="default">
<put-attribute name="body" value="/WEB-INF/views/layout/mainTest.jsp" />
</definition>
<2>
<definition name="user/*/*" extends="withLeft">
<put-attribute name="left" value="/WEB-INF/views/layout/left.jsp"/>
<put-attribute name="body" value="/WEB-INF/views/{1}/{2}.jsp" />
</definition>
</tiles-definitions>
<1> template을 다르게 해서 definition을 추가했다. 이를 상속받아 <2>를 추가했다.
여기서 중요한것은 <2>번이다. 다들 이를 응용하여 개발하면 된다.
definition name="/" -- > controller mapping 형태를 말한다.
참고>>>
definition name 형식 -
- ? : 한 글자, * : 아무글자나, [abc] : abc로 시작
IssueController.java
@RequestMapping(value={"/issue/list"} , method=RequestMethod.GET)
public String showIssueList(HttpServletRequest request) {
return "issue/issueList";
}
}
/issue/list를 매핑하여 issue/issueList를 return 한다.
그러면 issue가 {1} issueList가 {2}가 된다.
즉 issue 폴더 아래에 있는 issueList에 적용한다는 것이다.
http://localhost:8081/toyProject/issue/list 를 호출하면 다음과 같은 화면이 나온다.
layout_left.jsp 가 적용된 화면이니 이를 응용하여 프로젝트에 활용하면 된다 . 끝!
출처: http://creator1022.tistory.com/176 [무한도전]
반응형
'개발공부 > Spring' 카테고리의 다른 글
예외처리(1) (0) | 2020.10.01 |
---|---|
Spring에서 Bean을 주입하는 방식 (0) | 2020.03.16 |
SPRING AOP (0) | 2018.07.02 |
SLF4J와 Logback (1) | 2018.06.26 |