L'accès beans Spring à partir d'un Tuiles de vue (JSP)
Dans Spring MVC, je peux accéder à mes haricots dans la JSP en utilisant JstlView de exposedContextBeanNames (ou exposeContextBeansAsAttributes). Par exemple, alors, dans ma JSP je peux écrire (${propriétés.myProperty). Mais quand même JSP est une partie d'un tuiles de vue, ces propriétés ne sont pas accessibles. Est possible de configurer les Tuiles correctement ou accéder à ces propriétés d'une autre manière?
Je suis à l'aide de Spring MVC 3.0.2 et de Tuiles 2.2.1. Voici un peu de ma configuration:
<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>
EDIT: j'ai mis en place Skaffman de la solution.
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);
}
}
Printemps de configuration:
<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>
Si vous avez un problème, prendre un coup d'oeil à TilesExposingBeansView.renderMergedOutputModel. J'ai fait quelques tests, mais c'est peut-être nécessaire de faire beaucoup plus.
- avez-vous de google pour le printemps tuiles de l'intégration?
- Oui, j'ai googlé. J'ai quelques problèmes avec les versions précédentes, mais maintenant, tout était ok, sauf pour ce problème. J'ai cherché mais j'ai rien trouvé 🙁
- l'homme, le printemps et l'apache doit vous écrire un chèque pour cela 😉 beau travail
Vous devez vous connecter pour publier un commentaire.
Comme vous l'avez remarqué, cette fonctionnalité fait partie de
InternalResourceViewResolver
etInternalResourceView
, tandis que les Tuiles des trucs hérite directement deUrlBasedViewResolver
etAbstractUrlBasedView
, de sorte que vous ne pouvez pas faire usage de il.Regardant le code, il n'y a aucune raison pourquoi ce genre de choses ne pouvait pas avoir été mis en
AbstractUrlBasedView
. La magie qui se passe dansInternalResourceView.getRequestToExpose
, et il semble parfaitement applicable àAbstractUrlBasedView
trop.Dans le court terme, je propose de sous-classement
UrlBasedViewResolver
etTilesView
, la copie de lagetRequestToExpose
des trucs deInternalResourceView
. À plus long terme, je vous encourage à déposer un problème avec SpringSource en leur demandant de déplacer cette fonctionnalité haut de la hiérarchie de classe enAbstractUrlBasedView
, de le rendre plus largement disponibles.Avez-vous essayé d'utiliser ServletContextAttributeExporter dans le fichier de configuration xml?
Dès le Printemps 3.0 il y a maintenant un TilesViewResolver.