[SPRING] Tiles view (JSP)에서 Spring 빈에 접근하기
SPRINGTiles view (JSP)에서 Spring 빈에 접근하기
Spring MVC에서는 JstlView의 exposedContextBeanNames (또는 exposeContextBeansAsAttributes)를 사용하여 JSP로 Bean에 액세스 할 수있다. 예를 들어, 내 JSP에서 ($ {properties.myProperty)를 쓸 수있다. 그러나 동일한 JSP가 타일보기의 일부인 경우 이러한 속성에 액세스 할 수 없습니다. 타일을 올바르게 구성하거나 이러한 속성에 다른 방식으로 액세스 할 수 있습니까?
저는 Spring MVC 3.0.2와 Tiles 2.2.1을 사용하고 있습니다. 여기에 약간의 구성이 있습니다.
<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="order" value="1"/>
<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="order" value="2"/>
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
<property name="exposedContextBeanNames">
<list><value>properties</value></list>
</property>
</bean>
편집 : 나는 Skaffman의 솔루션을 구현했습니다.
TilesExposingBeansViewResolver.java:
package es.kcsolutions.util.spring.servlet.view;
import org.springframework.web.servlet.view.*;
public class TilesExposingBeansViewResolver extends UrlBasedViewResolver {
private Boolean exposeContextBeansAsAttributes;
private String[] exposedContextBeanNames;
public void setExposeContextBeansAsAttributes(boolean exposeContextBeansAsAttributes) {
this.exposeContextBeansAsAttributes = exposeContextBeansAsAttributes;
}
public void setExposedContextBeanNames(String[] exposedContextBeanNames) {
this.exposedContextBeanNames = exposedContextBeanNames;
}
@Override
protected AbstractUrlBasedView buildView(String viewName) throws Exception {
AbstractUrlBasedView superView = super.buildView(viewName);
if (superView instanceof TilesExposingBeansView) {
TilesExposingBeansView view = (TilesExposingBeansView) superView;
if (this.exposeContextBeansAsAttributes != null) view.setExposeContextBeansAsAttributes(this.exposeContextBeansAsAttributes);
if (this.exposedContextBeanNames != null) view.setExposedContextBeanNames(this.exposedContextBeanNames);
}
return superView;
}
}
TilesExposingBeansView.java:
package es.kcsolutions.util.spring.servlet.view;
import java.util.*;
import javax.servlet.http.*;
import org.springframework.web.context.support.ContextExposingHttpServletRequest;
import org.springframework.web.servlet.view.tiles2.TilesView;
public class TilesExposingBeansView extends TilesView {
private boolean exposeContextBeansAsAttributes = false;
private Set<String> exposedContextBeanNames;
public void setExposeContextBeansAsAttributes(boolean exposeContextBeansAsAttributes) {
this.exposeContextBeansAsAttributes = exposeContextBeansAsAttributes;
}
public void setExposedContextBeanNames(String[] exposedContextBeanNames) {
this.exposedContextBeanNames = new HashSet<String>(Arrays.asList(exposedContextBeanNames));
}
protected HttpServletRequest getRequestToExpose(HttpServletRequest originalRequest) {
if (this.exposeContextBeansAsAttributes || this.exposedContextBeanNames != null)
return new ContextExposingHttpServletRequest(originalRequest, getWebApplicationContext(), this.exposedContextBeanNames);
return originalRequest;
}
@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest requestToExpose = getRequestToExpose(request);
exposeModelAsRequestAttributes(model, requestToExpose);
super.renderMergedOutputModel(model, requestToExpose, response);
}
}
스프링 구성 :
<bean id="tilesViewResolver" class="es.kcsolutions.util.spring.servlet.view.TilesExposingBeansViewResolver">
<property name="order" value="1"/>
<property name="viewClass" value="es.kcsolutions.util.spring.servlet.view.TilesExposingBeansView"/>
<property name="exposedContextBeanNames">
<list><value>properties</value></list>
</property>
</bean>
문제가 있으면 TilesExposingBeansView.renderMergedOutputModel을 살펴보십시오. 나는 몇 가지 검사를했지만 어쩌면 더 많은 것을 만들어야 할 필요가있을 것입니다.
해결법
-
==============================
1.아시다시피이 기능은 InternalResourceViewResolver 및 InternalResourceView의 일부이며 Tiles는 UrlBasedViewResolver 및 AbstractUrlBasedView에서 직접 상속되므로 사용할 수 없습니다.
아시다시피이 기능은 InternalResourceViewResolver 및 InternalResourceView의 일부이며 Tiles는 UrlBasedViewResolver 및 AbstractUrlBasedView에서 직접 상속되므로 사용할 수 없습니다.
코드를 살펴보면이 항목을 AbstractUrlBasedView에 넣을 수 없었습니다. Magic은 InternalResourceView.getRequestToExpose에서 발생하며 AbstractUrlBasedView에도 완벽하게 적용됩니다.
단기적으로, UrlBasedViewResolver와 TilesView를 서브 클래 싱하여 InternalResourceView에서 getRequestToExpose를 복사하는 것이 좋습니다. 장기적으로 SpringSource에이 기능을 클래스 계층 구조 위로 옮겨서 AbstractUrlBasedView로 옮겨 봄으로써 더 널리 사용 가능하게하는 문제를 제기하시기 바랍니다.
-
==============================
2.xml 구성 파일에서 ServletContextAttributeExporter를 사용하려고 시도 했습니까?
xml 구성 파일에서 ServletContextAttributeExporter를 사용하려고 시도 했습니까?
<bean class="org.springframework.web.context.support.ServletContextAttributeExporter"> <property name="attributes"> <map> <entry key="<bean key here>"> <ref bean="<bean name here" /> </entry> </map> </property> </bean>
-
==============================
3.Spring 3.0부터는 TilesViewResolver가있다.
Spring 3.0부터는 TilesViewResolver가있다.
from https://stackoverflow.com/questions/2848415/accessing-spring-beans-from-a-tiles-view-jsp by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 현재 스레드에 대한 세션이 없습니다 (Spring 3.1.X 및 Hibernate 4). (0) | 2018.12.24 |
---|---|
[SPRING] 양식이있는 봄 mvc 날짜 형식 : 입력 (0) | 2018.12.24 |
[SPRING] Spring @JsonIgnore가 작동하지 않음 (0) | 2018.12.24 |
[SPRING] Spring 3 빈 인스턴스화 시퀀스 (0) | 2018.12.24 |
[SPRING] Spring IoC를 사용하여 enum 값 설정하기 (0) | 2018.12.24 |