All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.springframework.web.servlet.view.UrlBasedViewResolver Maven / Gradle / Ivy

There is a newer version: 5.3.34
Show newest version
/*
 * Copyright 2002-2004 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.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.web.servlet.view;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.web.servlet.View;

/**
 * Simple implementation of ViewResolver that allows for direct resolution of
 * symbolic view names to URLs, without explicit mapping definition. This is
 * appropriate if your symbolic names match the names of your view resources
 * in a straightforward manner, without the need for arbitrary mappings.
 *
 * 

Supports AbstractUrlBasedView subclasses like InternalResourceView, * VelocityView and FreeMarkerView. The view class for all views generated * by this resolver can be specified via the "viewClass" property. * *

View names can either be resource URLs themselves, or get augmented by a * specified prefix and/or suffix. Exporting an attribute that holds the * RequestContext to all views is explicitly supported. * *

Example: prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="test" -> * "/WEB-INF/jsp/test.jsp" * *

As a special feature, redirect URLs can be specified via the "redirect:" * prefix. E.g.: "redirect:myAction.do" will trigger a redirect to the given * URL, rather than resolution as standard view name. This is typically used * for redirecting to a controller URL after finishing a form workflow. * *

Furthermore, forward URLs can be specified via the "forward:" prefix. E.g.: * "forward:myAction.do" will trigger a forward to the given URL, rather than * resolution as standard view name. This is typically used for controller URLs; * it is not supposed to be used for JSP URLs - use logical view names there. * *

Note: This class does not support localized resolution, i.e. resolving * a symbolic view name to different resources depending on the current locale. * *

Note: When chaining ViewResolvers, a UrlBasedViewResolver always needs * to be last, as it will attempt to resolve any view name, no matter whether * the underlying resource actually exists. * * @author Juergen Hoeller * @since 13.12.2003 * @see #setViewClass * @see #setPrefix * @see #setSuffix * @see #setRequestContextAttribute * @see #REDIRECT_URL_PREFIX * @see AbstractUrlBasedView * @see InternalResourceView * @see org.springframework.web.servlet.view.velocity.VelocityView * @see org.springframework.web.servlet.view.freemarker.FreeMarkerView */ public class UrlBasedViewResolver extends AbstractCachingViewResolver { /** * Prefix for special view names that specify a redirect URL (usually * to a controller after a form has been submitted and processed). * Such view names will not be resolved in the configured default * way but rather be treated as special shortcut. */ public static final String REDIRECT_URL_PREFIX = "redirect:"; /** * Prefix for special view names that specify a forward URL (usually * to a controller after a form has been submitted and processed). * Such view names will not be resolved in the configured default * way but rather be treated as special shortcut. */ public static final String FORWARD_URL_PREFIX = "forward:"; private Class viewClass; private String prefix = ""; private String suffix = ""; private String contentType; private boolean redirectContextRelative = true; private boolean redirectHttp10Compatible = true; private String requestContextAttribute; /** Map of static attributes, keyed by attribute name (String) */ private final Map staticAttributes = new HashMap(); /** * Set the view class that should be used to create views. * @param viewClass class that is assignable to the required view class * (by default, AbstractUrlBasedView) * @see AbstractUrlBasedView */ public void setViewClass(Class viewClass) { if (viewClass == null || !requiredViewClass().isAssignableFrom(viewClass)) { throw new IllegalArgumentException( "Given view class [" + (viewClass != null ? viewClass.getName() : null) + "] is not of type [" + requiredViewClass().getName() + "]"); } this.viewClass = viewClass; } /** * Return the required type of view for this resolver. * This implementation returns AbstractUrlBasedView. * @see AbstractUrlBasedView */ protected Class requiredViewClass() { return AbstractUrlBasedView.class; } /** * Set the prefix that gets applied to view names when building a URL. * @param prefix view name prefix */ public void setPrefix(String prefix) { this.prefix = prefix; } /** * Set the suffix that gets applied to view names when building a URL. * @param suffix view name suffix */ public void setSuffix(String suffix) { this.suffix = suffix; } /** * Set the content type for all views. * May be ignored by view classes if the view itself is assumed * to set the content type, e.g. in case of JSPs. * @param contentType the content type */ public void setContentType(String contentType) { this.contentType = contentType; } /** * Set whether to interpret a given redirect URL that starts with a * slash ("/") as relative to the current ServletContext, i.e. as * relative to the web application root. *

Default is true: A redirect URL that starts with a slash will be * interpreted as relative to the web application root, i.e. the context * path will be prepended to the URL. *

Redirect URLs can be specified via the "redirect:" prefix. * E.g.: "redirect:myAction.do" * @see RedirectView#setContextRelative * @see #REDIRECT_URL_PREFIX */ public void setRedirectContextRelative(boolean redirectContextRelative) { this.redirectContextRelative = redirectContextRelative; } /** * Set whether redirects should stay compatible with HTTP 1.0 clients. *

In the default implementation, this will enforce HTTP status code 302 * in any case, i.e. delegate to HttpServletResponse.sendRedirect. * Turning this off will send HTTP status code 303, which is the correct * code for HTTP 1.1 clients, but not understood by HTTP 1.0 clients. *

Many HTTP 1.1 clients treat 302 just like 303, not making any * difference. However, some clients depend on 303 when redirecting * after a POST request; turn this flag off in such a scenario. *

Redirect URLs can be specified via the "redirect:" prefix. * E.g.: "redirect:myAction.do" * @see RedirectView#setHttp10Compatible * @see #REDIRECT_URL_PREFIX */ public void setRedirectHttp10Compatible(boolean redirectHttp10Compatible) { this.redirectHttp10Compatible = redirectHttp10Compatible; } /** * Set the name of the RequestContext attribute for all views. * @param requestContextAttribute name of the RequestContext attribute * @see AbstractView#setRequestContextAttribute */ public void setRequestContextAttribute(String requestContextAttribute) { this.requestContextAttribute = requestContextAttribute; } /** * Set static attributes from a java.util.Properties object, * for all views returned by this resolver. *

This is the most convenient way to set static attributes. Note that * static attributes can be overridden by dynamic attributes, if a value * with the same name is included in the model. *

Can be populated with a String "value" (parsed via PropertiesEditor) * or a "props" element in XML bean definitions. * @see org.springframework.beans.propertyeditors.PropertiesEditor * @see AbstractView#setAttributes */ public void setAttributes(Properties props) { setAttributesMap(props); } /** * Set static attributes from a Map, for all views returned by this resolver. * This allows to set any kind of attribute values, for example bean references. *

Can be populated with a "map" or "props" element in XML bean definitions. * @param attributes Map with name Strings as keys and attribute objects as values * @see AbstractView#setAttributesMap */ public void setAttributesMap(Map attributes) { if (attributes != null) { this.staticAttributes.putAll(attributes); } } /** * Allow Map access to the static attributes for views returned by * this resolver, with the option to add or override specific entries. *

Useful for specifying entries directly, for example via * "attributesMap[myKey]". This is particularly useful for * adding or overriding entries in child view definitions. */ public Map getAttributesMap() { return this.staticAttributes; } protected void initApplicationContext() { super.initApplicationContext(); if (this.viewClass == null) { throw new IllegalArgumentException("viewClass is required"); } } /** * This implementation returns just the view name, * as this ViewResolver doesn't support localized resolution. */ protected String getCacheKey(String viewName, Locale locale) { return viewName; } /** * Overridden to implement check for "redirect:" prefix. *

Not possible in loadView, as overridden loadView versions in * subclasses might rely on the superclass always creating instances * of the required view class. * @see #loadView * @see #requiredViewClass */ protected View createView(String viewName, Locale locale) throws Exception { // Check for special "redirect:" prefix. if (viewName.startsWith(REDIRECT_URL_PREFIX)) { String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length()); return new RedirectView( redirectUrl, this.redirectContextRelative, this.redirectHttp10Compatible); } // Check for special "forward:" prefix. if (viewName.startsWith(FORWARD_URL_PREFIX)) { String forwardUrl = viewName.substring(FORWARD_URL_PREFIX.length()); return new InternalResourceView(forwardUrl); } // Else fall back to superclass implementation: calling loadView. return super.createView(viewName, locale); } /** * Creates a new instance of the specified view class and configures it. * Does not perform any lookup for pre-defined View instances. */ protected View loadView(String viewName, Locale locale) throws BeansException { AbstractUrlBasedView view = (AbstractUrlBasedView) BeanUtils.instantiateClass(this.viewClass); view.setBeanName(viewName); view.setUrl(this.prefix + viewName + this.suffix); if (this.contentType != null) { view.setContentType(this.contentType); } view.setRequestContextAttribute(this.requestContextAttribute); view.setAttributesMap(this.staticAttributes); return view; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy