В Spring MVC я могу получить доступ к своим бобам в JSP использование exposedContextBeanNames JstlView (или exposeContextBeansAsAttributes). Например, затем, в моем JSP я могу записать ($ {properties.myProperty). Но когда тот же JSP является частью представления мозаик, эти свойства не доступны. Возможно настроить Мозаики правильно или получить доступ к этим свойствам в другом отношении?
Я использую Spring MVC 3.0.2 и Мозаики 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);
}
}
Конфигурация Spring:
<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. Я сделал некоторые тесты, но возможно необходимо сделать намного больше.
Как вы заметили, эта функциональность является частью InternalResourceViewResolver
и InternalResourceView
, тогда как материал Tiles наследуется непосредственно от UrlBasedViewResolver
и AbstractUrlBasedView
, поэтому вы не можете его использовать.
Если посмотреть на код, то нет причин, почему эти вещи нельзя было поместить в AbstractUrlBasedView
. Магия происходит в InternalResourceView.getRequestToExpose
, и она выглядит вполне применимой и к AbstractUrlBasedView
.
В краткосрочной перспективе я предлагаю создать подклассы UrlBasedViewResolver
и TilesView
, копируя getRequestToExpose
из InternalResourceView
. В более долгосрочной перспективе я рекомендую вам обратиться в SpringSource с просьбой переместить эту функциональность вверх по иерархии классов в AbstractUrlBasedView
, сделав ее более широко доступной.