우선 ajax를 통해서 json 데이터를 전송시에 구현방법은
json 양식을 따르는(?) jsp를 작성하여서 client에 전송하도록 하였습니다.
따라서 SpringMVC의 controller 는 jsp파일 네임과 동일한 값을 return해야합니다.
(이를 논리적인 뷰 이름 이라고 하더군요.
/views/home.jsp 를 예로 들자면
/views/ >> 접두어
home >> 논리적인 뷰 이름
.jsp >> 접미어 라고 합니다. )
modelAndView를 사용하든, model을 사용하든 String을 이용하던 말이죠.
controller의 일이 끝나면 viewResolver에게 요청이 넘어가게 됩니다.
viewResolver는 controller 에서 넘어온 논리적인 뷰 이름과 동일한 jsp 등의 파일 등을 찾아서
data(model) 를 binding한 후에 클라이언트에게 넘겨줍니다.
그런데 tiles를 이용하여 view layer look and feel을 구성하면 TilesView 를 이용해야합니다.
모든 request는 tilesview가 적용된 resolver로 가게 되기 때문에 ajax를 이용해서 data만 가져오려던게
page를 다시 호출하게 되는 상황이 올 수 있죠.
그렇지 않더라도 tiles를 적용하면 definition 으로 각 view를 설정해주어야하는데(dynamic tiles 미적용시에)
여기에서 해당하는 view를 못찾게 되면 no mapping view라면서 404를 보게 됩니다.
(view look and feel은 spring in action 3판에서 본 용어로
application look and feel 이란 표현을 사용하더군요~)
이때 해결할 수 있는 방법은 viewResolver에 우선순위를 주어서 2개이상을 정의하는 것입니다.
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list><value>/views/**/views.xml</value></list>
</property>
</bean>
<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
</bean>
application-servlet에 정의한 xml에는 보통 위와 같이 tiles를 적용하게 될 것입니다.
이렇게 작성하면 모든 view들은 tiles가 적용되게 되죠.
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list><value>/views/**/views.xml</value></list>
</property>
</bean>
<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
<property name="order" value="1" />
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/views/" />
<property name="suffix" value=".jsp" />
<property name="order" value="2" />
</bean>
위와 같이 viewResolver를 적용하게되면 우선 모든 view들은 tiles를 정의한 각 views.xml의 definition들에서
binding될 jsp 등의 view 파일들을 찾게됩니다.
만약 각 views.xml에서 view 파일을 못찾게 되면 우선순위가 2인 InternalResourceViewResolver 에서
해당 view 파일을 찾게 됩니다.
filter chaining 과는 좀 다르지만 여튼 좀 비슷해보이죠??
참고로 prefix property는 접두어 suffix property는 접미어입니다 ^^;;
이를 응용하게 되면 다양한 viewResolver를 적용하여 spring에서 제공하는 여러 viewResolver들을 통해
강력한 애플리케이션을 구축할 수 있겠지요~?
'Programming > Spring' 카테고리의 다른 글
spring MVC의 주요 구성 요소 (0) | 2011.01.05 |
---|