본문 바로가기

Programming/Spring

spring : 2개의 viewResolver를 통한 tiles 뷰환경에서 ajax json 전송처리

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