[SPRING] Spring에서 다중 ViewResolvers를 사용하는 방법?
SPRINGSpring에서 다중 ViewResolvers를 사용하는 방법?
나는 아파치 타일 (2.1.2)을 사용하는 대부분의 웹 페이지가있는 웹 응용 프로그램에서 작업하고 있지만 그 중 일부는 단순한 jsp이어야합니다.
InternalResourceViewResolver와 UrlBasedViewResolver가 모두 상관없이 뷰를 확인하려고 시도 할 것이므로 어떤 순서로 사용하든 관계없이 일반 JSP 페이지 나 타일 페이지에서 오류가 발생한다는 문제가 있습니다.
다음은 config입니다.
<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="0"/>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="1"/>
</bean>
내가 뭘하려고하는지 명확하게하기 위해서, 나는 다음과 같은 뷰 상태를 가질 수 있어야한다 :
<view-state id="someState" view="/someDir/foo"><!--render foo.jsp -->
<transition on="foo" to="bar"/>
</view-state>
<view-state id="someState" view="something.core"><!--render tile defintion named 'something.core' -->
<transition on="foo" to="bar"/>
</view-state>
누구든지 타일 정의와 일반 jsp를 렌더링 할 수 있도록 구성하는 방법을 알고 있습니까?
해결법
-
==============================
1.당신이 말했듯이, 당신은 이것을 함께 연결할 수 없습니다. 두 상태에 대한 javadoc은 둘 다 해석자 체인의 끝에 있어야 함을 분명히합니다.
당신이 말했듯이, 당신은 이것을 함께 연결할 수 없습니다. 두 상태에 대한 javadoc은 둘 다 해석자 체인의 끝에 있어야 함을 분명히합니다.
이 togather를 실제로 사용해야하는 경우 뷰 이름을 사용하는 ViewResolver의 간단한 사용자 정의 구현을 작성하고 두 개의 "실제"뷰 확인자 중 어느 쪽이 위임 할 것인지 결정합니다. 이것은 뷰 이름을 기반으로 호출 할 resolver를 알 수 있다고 가정합니다.
따라서 다음과 같이 사용자 정의 ViewResolver를 정의 할 수 있습니다.
public class MyViewResolver implements ViewResolver { private ViewResolver tilesResolver; private ViewResolver jspResolver; public void setJspResolver(ViewResolver jspResolver) { this.jspResolver = jspResolver; } public void setTilesResolver(ViewResolver tilesResolver) { this.tilesResolver = tilesResolver; } public View resolveViewName(String viewName, Locale locale) throws Exception { if (isTilesView(viewName)) { return tilesResolver.resolveViewName(viewName, locale); } else { return jspResolver.resolveViewName(viewName, locale); } } private boolean isTilesView(String viewName) { ..... } }
위임 할 리졸버를 결정하려면 isTilesView 메서드를 구현해야합니다.
XML 설정에서이 새로운 뷰 해석기를 정의하고 다른 버전보다 먼저 표시되는지 확인하십시오.
<bean class="MyViewResolver"> <property name="tilesResolver" ref="tilesViewResolver"/> <property name="jspResolver" ref="viewResolver"/> </bean>
-
==============================
2.나는 * -servlet.xml 설정 파일을 두 개로 나눠서 같은 문제를 해결했다. 필자의 경우 메인 애플리케이션은 Tiles를 사용하지만, 간단한 JSP로 QUnit 테스트를 원한다.
나는 * -servlet.xml 설정 파일을 두 개로 나눠서 같은 문제를 해결했다. 필자의 경우 메인 애플리케이션은 Tiles를 사용하지만, 간단한 JSP로 QUnit 테스트를 원한다.
app-servlet.xml에는 Tiles보기 확인자 만 포함되며 tests-servlet.xml에는 JSP보기 확인자 만 포함되며 web.xml 매핑은 URL을 기반으로하는 올바른 서블릿에 요청을 발송합니다.
<servlet-mapping> <servlet-name>app</servlet-name> <!-- will reach app-servlet.xml --> <url-pattern>/foo</url-pattern> <!-- will use "foo" Tile --> <url-pattern>/bar</url-pattern> <!-- will use "bar" Tile --> </servlet-mapping> <servlet-mapping> <servlet-name>tests</servlet-name> <!-- will reach tests-servlet.xml --> <url-pattern>/foo-test</url-pattern> <!-- will use foo-test.jsp --> <url-pattern>/bar-test</url-pattern> <!-- will use bar-test.jsp --> </servlet-mapping>
-
==============================
3.자신이 올바른 길을 가고있는 것처럼 보이지만, 일부보기 확인자는 항상보기를 해결 한 것처럼 행동한다는 점을 명심해야합니다. 이러한 확인자를 주문할 때 마지막으로 넣어야합니다. 나는 Tiles view가 그러한 것이라고 생각한다.
자신이 올바른 길을 가고있는 것처럼 보이지만, 일부보기 확인자는 항상보기를 해결 한 것처럼 행동한다는 점을 명심해야합니다. 이러한 확인자를 주문할 때 마지막으로 넣어야합니다. 나는 Tiles view가 그러한 것이라고 생각한다.
편집 : whoops ... 예, 다른 포스터가 올바른지,이 확인자는 둘 다 '항상 일치'할 것이므로 둘 다 체인에서 사용할 수는 없습니다. 또 다른 대안은 구성된 타일 뷰를 찾을 수없는 경우 TilesView를 확장하여 간단한 JSP 렌더링을 시도하는 것입니다.
-
==============================
4.예. 프로젝트에서 뷰 분석기를 원하는 수만큼 사용할 수 있습니다.
예. 프로젝트에서 뷰 분석기를 원하는 수만큼 사용할 수 있습니다.
따라서 동일한 프로젝트에서 '분석기보기'와 '내부보기 분석기'를 모두 사용할 수 있습니다. .
ContentNegotiatingViewResolver를 설정해야한다. .
보기 확인자에게 순서 값을 제공하십시오.
<property name="order" value="int Value here" />
마치 타일 resolver 2와 internalviewresolver 3을 보았습니다. 타일이 보이지 않으면 타일 정의를 먼저 검사합니다. InternalViewResolver에서 검사됩니다.
여기에 나를 위해 일하는 몇 가지 구성이 있습니다.
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="order" value="1" /> <property name="mediaTypes"> <map> <entry key="json" value="application/json" /> <entry key="html" value="text/html" /> </map> </property> <property name="parameterName" value="accept"></property> <property name="favorParameter" value="true"></property> <property name="defaultContentType" value="text/html"></property> <property name="viewResolvers"> <list> <ref bean="tilesViewResolver" /> <ref bean="internalViewResolver" /> </list> </property> <property name="defaultViews"> <list> <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" /> </list> </property> <property name="ignoreAcceptHeader" value="true" /> </bean> <!-- Configures the Tiles layout system --> <bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer" id="tilesConfigurer"> <property name="definitions"> <list> <value>/WEB-INF/layouts/layouts.xml</value> <!-- Scan views directory for Tiles configurations --> <value>/WEB-INF/views/**/views.xml</value> </list> </property> </bean> <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView"> <property name="order" value="3" /> </bean> <bean id="internalViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="order" value="2" /> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean>
-
==============================
5.이 문제는 다음과 같이 일반 jsp의 레이아웃에 타일 정의를 추가하는 것으로 해결되었습니다.
이 문제는 다음과 같이 일반 jsp의 레이아웃에 타일 정의를 추가하는 것으로 해결되었습니다.
<definition name="plain-jsp.layout" template="/WEB-INF/layouts/plainJsp.jspx" > <put-attribute name="content" value=""/> </definition>
그런 다음이 레이아웃을 간단한 jsp 파일을 포함하는 템플릿으로 사용할 수 있습니다.
<definition name="catalog/details" extends="plain-jsp.layout"> <put-attribute name="content" value="/WEB-INF/views/catalog/details.jspx"/> </definition>
레이아웃 템플릿 파일 :
<html xmlns:tiles="http://tiles.apache.org/tags-tiles" xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"> <jsp:output doctype-root-element="HTML"/> <jsp:directive.page contentType="text/html;charset=UTF-8" /> <jsp:directive.page pageEncoding="UTF-8" /> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=8" /> </head> <body> <div id="content"> <tiles:insertAttribute name="content"/> </div> </body> </html>
from https://stackoverflow.com/questions/1029193/how-to-use-multiple-viewresolvers-in-spring by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] @RestController 대 @RepositoryRestResource를 사용하는 경우 (0) | 2019.01.26 |
---|---|
[SPRING] JpaTest를 수행 할 때 @SpringBootConfiguration을 찾을 수 없습니다. (0) | 2019.01.26 |
[SPRING] Spring MVC에서 컨트롤러의 라이프 사이클 (0) | 2019.01.26 |
[SPRING] Spring HATEOAS 임베디드 리소스 지원 (0) | 2019.01.26 |
[SPRING] 스프링 3 MVC 애플리케이션을위한 maven 2 아키타 입을 가지고 있습니까? (0) | 2019.01.26 |