SPR-8431 Extract RedirectView URL creation into separate method available for subclasses to use

master
Rossen Stoyanchev 13 years ago
parent 4756badc1d
commit a58bd3073d
  1. 15
      org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/AbstractView.java
  2. 27
      org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/RedirectView.java

@ -256,6 +256,18 @@ public abstract class AbstractView extends WebApplicationObjectSupport implement
" and static attributes " + this.staticAttributes); " and static attributes " + this.staticAttributes);
} }
Map<String, Object> mergedModel = createMergedOutputModel(model, request, response);
prepareResponse(request, response);
renderMergedOutputModel(mergedModel, request, response);
}
/**
* Creates a combined output Map (never <code>null</code>) that includes dynamic values and static attributes.
* Dynamic values take precedence over static attributes.
*/
protected Map<String, Object> createMergedOutputModel(Map<String, ?> model, HttpServletRequest request,
HttpServletResponse response) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Map<String, Object> pathVars = this.exposePathVariables ? Map<String, Object> pathVars = this.exposePathVariables ?
(Map<String, Object>) request.getAttribute(View.PATH_VARIABLES) : null; (Map<String, Object>) request.getAttribute(View.PATH_VARIABLES) : null;
@ -278,8 +290,7 @@ public abstract class AbstractView extends WebApplicationObjectSupport implement
mergedModel.put(this.requestContextAttribute, createRequestContext(request, response, mergedModel)); mergedModel.put(this.requestContextAttribute, createRequestContext(request, response, mergedModel));
} }
prepareResponse(request, response); return mergedModel;
renderMergedOutputModel(mergedModel, request, response);
} }
/** /**

@ -38,7 +38,6 @@ import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.View; import org.springframework.web.servlet.View;
import org.springframework.web.util.UriTemplate; import org.springframework.web.util.UriTemplate;
import org.springframework.web.util.UriUtils; import org.springframework.web.util.UriUtils;
@ -46,9 +45,12 @@ import org.springframework.web.util.WebUtils;
/** /**
* <p>View that redirects to an absolute, context relative, or current request * <p>View that redirects to an absolute, context relative, or current request
* relative URL. By default all primitive model attributes (or collections * relative URL. The URL may be a URI template in which case the URI template
* thereof) are exposed as HTTP query parameters, but this behavior can be changed * variables will be replaced with values available in the model. By default
* by overriding the {@link #isEligibleProperty(String, Object)} method. * all primitive model attributes (or collections thereof), not used to fill
* in URI tempate variables, are exposed as HTTP query parameters, but this
* behavior can be changed by overriding the
* {@link #isEligibleProperty(String, Object)} method.
* *
* <p>A URL for this view is supposed to be a HTTP redirect URL, i.e. * <p>A URL for this view is supposed to be a HTTP redirect URL, i.e.
* suitable for HttpServletResponse's <code>sendRedirect</code> method, which * suitable for HttpServletResponse's <code>sendRedirect</code> method, which
@ -215,6 +217,17 @@ public class RedirectView extends AbstractUrlBasedView {
protected void renderMergedOutputModel( protected void renderMergedOutputModel(
Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)
throws IOException { throws IOException {
String targetUrl = createTargetUrl(model, request);
sendRedirect(request, response, targetUrl.toString(), this.http10Compatible);
}
/**
* Creates the target URL by checking if the redirect string is a URI template first,
* expanding it with the given model, and then optionally appending simple type model
* attributes as query String parameters.
*/
protected final String createTargetUrl(Map<String, Object> model, HttpServletRequest request)
throws UnsupportedEncodingException {
// Prepare target URL. // Prepare target URL.
StringBuilder targetUrl = new StringBuilder(); StringBuilder targetUrl = new StringBuilder();
@ -237,6 +250,7 @@ public class RedirectView extends AbstractUrlBasedView {
targetUrl = new StringBuilder(redirectUri.expand(model).toString()); targetUrl = new StringBuilder(redirectUri.expand(model).toString());
model = removeKeys(model, redirectUri.getVariableNames()); model = removeKeys(model, redirectUri.getVariableNames());
} }
if (this.exposeModelAttributes) { if (this.exposeModelAttributes) {
List<String> pathVarNames = getPathVarNames(request); List<String> pathVarNames = getPathVarNames(request);
if (!pathVarNames.isEmpty()) { if (!pathVarNames.isEmpty()) {
@ -245,7 +259,7 @@ public class RedirectView extends AbstractUrlBasedView {
appendQueryProperties(targetUrl, model, enc); appendQueryProperties(targetUrl, model, enc);
} }
sendRedirect(request, response, targetUrl.toString(), this.http10Compatible); return targetUrl.toString();
} }
@SuppressWarnings("serial") @SuppressWarnings("serial")
@ -278,8 +292,7 @@ public class RedirectView extends AbstractUrlBasedView {
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private List<String> getPathVarNames(HttpServletRequest request) { private List<String> getPathVarNames(HttpServletRequest request) {
String key = View.PATH_VARIABLES; Map<String, Object> map = (Map<String, Object>) request.getAttribute(View.PATH_VARIABLES);
Map<String, Object> map = (Map<String, Object>) request.getAttribute(key);
return (map != null) ? new ArrayList<String>(map.keySet()) : Collections.<String>emptyList(); return (map != null) ? new ArrayList<String>(map.keySet()) : Collections.<String>emptyList();
} }

Loading…
Cancel
Save