Add an alwaysInclude property to TilesViewResolver

Issue: SPR-12374
This commit is contained in:
Sebastien Deleuze
2014-10-31 17:26:21 +01:00
parent 01382b8ff0
commit cfa3d358d5
5 changed files with 105 additions and 15 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2013 the original author or authors.
* Copyright 2002-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.tiles.TilesContainer;
import org.apache.tiles.access.TilesAccess;
import org.apache.tiles.renderer.DefinitionRenderer;
import org.apache.tiles.request.AbstractRequest;
import org.apache.tiles.request.ApplicationContext;
import org.apache.tiles.request.Request;
import org.apache.tiles.request.render.Renderer;
@@ -46,6 +47,7 @@ import org.springframework.web.servlet.view.AbstractUrlBasedView;
* @author Nicolas Le Bas
* @author mick semb wever
* @author Rossen Stoyanchev
* @author Sebastien Deleuze
* @since 3.2
*/
public class TilesView extends AbstractUrlBasedView {
@@ -54,6 +56,8 @@ public class TilesView extends AbstractUrlBasedView {
private boolean exposeJstlAttributes = true;
private boolean alwaysInclude = false;
private ApplicationContext applicationContext;
@@ -73,6 +77,17 @@ public class TilesView extends AbstractUrlBasedView {
this.exposeJstlAttributes = exposeJstlAttributes;
}
/**
* Specify whether to always include the view rather than forward to it.
* <p>Default is "false". Switch this flag on to enforce the use of a
* Servlet include, even if a forward would be possible.
* @see TilesViewResolver#setAlwaysInclude(Boolean)
* @since 4.1.2
*/
public void setAlwaysInclude(boolean alwaysInclude) {
this.alwaysInclude = alwaysInclude;
}
@Override
public void afterPropertiesSet() throws Exception {
super.afterPropertiesSet();
@@ -84,7 +99,6 @@ public class TilesView extends AbstractUrlBasedView {
}
}
@Override
public boolean checkResource(final Locale locale) throws Exception {
HttpServletRequest servletRequest = null;
@@ -109,6 +123,9 @@ public class TilesView extends AbstractUrlBasedView {
if (this.exposeJstlAttributes) {
JstlUtils.exposeLocalizationContext(new RequestContext(request, getServletContext()));
}
if (this.alwaysInclude) {
request.setAttribute(AbstractRequest.FORCE_INCLUDE_ATTRIBUTE_NAME, true);
}
Request tilesRequest = createTilesRequest(request, response);
this.renderer.render(getUrl(), tilesRequest);

View File

@@ -27,26 +27,20 @@ import org.springframework.web.servlet.view.UrlBasedViewResolver;
* @author Nicolas Le Bas
* @author Rossen Stoyanchev
* @author Juergen Hoeller
* @author Sebastien Deleuze
* @since 3.2
*/
public class TilesViewResolver extends UrlBasedViewResolver {
private Renderer renderer;
private Boolean alwaysInclude;
public TilesViewResolver() {
setViewClass(requiredViewClass());
}
/**
* Requires {@link TilesView}.
*/
@Override
protected Class<?> requiredViewClass() {
return TilesView.class;
}
/**
* Set the {@link Renderer} to use. If not specified, a default
* {@link org.apache.tiles.renderer.DefinitionRenderer} will be used.
@@ -56,6 +50,24 @@ public class TilesViewResolver extends UrlBasedViewResolver {
this.renderer = renderer;
}
/**
* Specify whether to always include the view rather than forward to it.
* <p>Default is "false". Switch this flag on to enforce the use of a
* Servlet include, even if a forward would be possible.
* @see TilesView#setAlwaysInclude
* @since 4.1.2
*/
public void setAlwaysInclude(Boolean alwaysInclude) {
this.alwaysInclude = alwaysInclude;
}
/**
* Requires {@link TilesView}.
*/
@Override
protected Class<?> requiredViewClass() {
return TilesView.class;
}
@Override
protected TilesView buildView(String viewName) throws Exception {
@@ -63,6 +75,9 @@ public class TilesViewResolver extends UrlBasedViewResolver {
if (this.renderer != null) {
view.setRenderer(this.renderer);
}
if (this.alwaysInclude != null) {
view.setAlwaysInclude(this.alwaysInclude);
}
return view;
}