Package org.springframework.web.servlet.view

# Class AbstractView

java.lang.Object
org.springframework.context.support.ApplicationObjectSupport
org.springframework.web.context.support.WebApplicationObjectSupport
org.springframework.web.servlet.view.AbstractView

All Implemented Interfaces:
  `org.springframework.beans.factory.Aware`, `org.springframework.beans.factory.BeanNameAware`, `org.springframework.context.ApplicationContextAware`, `org.springframework.web.context.ServletContextAware`, `View`

Direct Known Subclasses:
  `AbstractFeedView`, `AbstractJackson2View`, `AbstractPdfView`, `AbstractUrlBasedView`, `AbstractXlsView`, `MarshallingView`

public abstract class AbstractView extends org.springframework.web.context.support.WebApplicationObjectSupport implements View, org.springframework.beans.factory.BeanNameAware
Abstract base class for `View` implementations. Subclasses should be JavaBeans, to allow for convenient configuration as Spring-managed bean instances.

Provides support for static attributes, to be made available to the view, with a variety of ways to specify them. Static attributes will be merged with the given dynamic attributes (the model that the controller returned) for each render operation.

Extends `WebApplicationObjectSupport`, which will be helpful to some views. Subclasses just need to implement the actual rendering.

Author:
  Rod Johnson, Juergen Hoeller
See Also:
  - `setAttributes(java.util.Properties)`
  - `setAttributesMap(java.util.Map<java.lang.String, ?>)`
  - `renderMergedOutputModel(java.util.Map<java.lang.String, java.lang.Object>, jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse)`

## Field Summary

Fields
Modifier and Type
Field
Description
`static final String`
`DEFAULT_CONTENT_TYPE`
Default content type.

### Fields inherited from class org.springframework.context.support.ApplicationObjectSupport

`logger`

### Fields inherited from interface org.springframework.web.servlet.View

`PATH_VARIABLES, RESPONSE_STATUS_ATTRIBUTE, SELECTED_CONTENT_TYPE`

## Constructor Summary

Constructors
Constructor
Description
`AbstractView()`

## Method Summary

Modifier and Type
Method
Description
`void`
`addStaticAttribute(String name, Object value)`
Add static data to this view, exposed in each view.
`protected Map<String,Object>`
`createMergedOutputModel(Map<String,?> model, HttpServletRequest request, HttpServletResponse response)`
Creates a combined output Map (never `null`) that includes dynamic values and static attributes.
`protected RequestContext`
`createRequestContext(HttpServletRequest request, HttpServletResponse response, Map<String,Object> model)`
Create a RequestContext to expose under the specified attribute name.
`protected ByteArrayOutputStream`
`createTemporaryOutputStream()`
Create a temporary OutputStream for this view.
`protected void`
`exposeModelAsRequestAttributes(Map<String,Object> model, HttpServletRequest request)`
Expose the model objects in the given map as request attributes.
`protected String`
`formatViewName()`
`protected boolean`
`generatesDownloadContent()`
Return whether this view generates download content (typically binary content like PDF or Excel files).
`Map<String,Object>`
`getAttributesMap()`
Allow `Map` access to the static attributes of this view, with the option to add or override specific entries.
`String`
`getBeanName()`
Return the view's name.
`String`
`getContentType()`
Return the content type for this view.
`String`
`getRequestContextAttribute()`
Return the name of the RequestContext attribute, if any.
`protected HttpServletRequest`
`getRequestToExpose(HttpServletRequest originalRequest)`
Get the request handle to expose to `renderMergedOutputModel(java.util.Map<java.lang.String, java.lang.Object>, jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse)`, i.e.
`Map<String,Object>`
`getStaticAttributes()`
Return the static attributes for this view.
`boolean`
`isExposePathVariables()`
Return whether to add path variables to the model or not.
`protected void`
`prepareResponse(HttpServletRequest request, HttpServletResponse response)`
Prepare the given response for rendering.
`void`
`render(Map<String,?> model, HttpServletRequest request, HttpServletResponse response)`
Prepares the view given the specified model, merging it with static attributes and a RequestContext attribute, if necessary.
`protected abstract void`
`renderMergedOutputModel(Map<String,Object> model, HttpServletRequest request, HttpServletResponse response)`
Subclasses must implement this method to actually render the view.
`void`
`setAttributes(Properties attributes)`
Set static attributes for this view from a `java.util.Properties` object.
`void`
`setAttributesCSV(String propString)`
Set static attributes as a CSV string.
`void`
`setAttributesMap(Map<String,?> attributes)`
Set static attributes for this view from a Map.
`void`
`setBeanName(String beanName)`
Set the view's name.
`void`
`setContentType(String contentType)`
Set the content type for this view.
`void`
`setExposeContextBeansAsAttributes(boolean exposeContextBeansAsAttributes)`
Set whether to make all Spring beans in the application context accessible as request attributes, through lazy checking once an attribute gets accessed.
`void`
`setExposedContextBeanNames(String... exposedContextBeanNames)`
Specify the names of beans in the context which are supposed to be exposed.
`void`
`setExposePathVariables(boolean exposePathVariables)`
Specify whether to add path variables to the model or not.
`void`
`setRequestContextAttribute(String requestContextAttribute)`
Set the name of the RequestContext attribute for this view.
`protected void`
`setResponseContentType(HttpServletRequest request, HttpServletResponse response)`
Set the content type of the response to the configured `content type` unless the `View.SELECTED_CONTENT_TYPE` request attribute is present and set to a concrete media type.
`String`
`toString()`
`protected void`
`writeToResponse(HttpServletResponse response, ByteArrayOutputStream baos)`
Write the given temporary OutputStream to the HTTP response.

### Methods inherited from class org.springframework.web.context.support.WebApplicationObjectSupport

`getServletContext, getTempDir, getWebApplicationContext, initApplicationContext, initServletContext, isContextRequired, setServletContext`

### Methods inherited from class org.springframework.context.support.ApplicationObjectSupport

`getApplicationContext, getMessageSourceAccessor, initApplicationContext, obtainApplicationContext, requiredContextClass, setApplicationContext`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

## Field Details

### DEFAULT_CONTENT_TYPE

public static final String DEFAULT_CONTENT_TYPE
Default content type. Overridable as bean property.

See Also:
  - Constant Field Values

## Constructor Details

### AbstractView

public AbstractView()

## Method Details

### setContentType

public void setContentType(@Nullable String contentType)
Set the content type for this view. Default is "text/html;charset=ISO-8859-1".

May be ignored by subclasses if the view itself is assumed to set the content type, for example, in case of JSPs.

### getContentType

@Nullable public String getContentType()
Return the content type for this view.

Specified by:
  `getContentType` in interface `View`
Returns:
  the content type String (optionally including a character set), or `null` if not predetermined

### setRequestContextAttribute

public void setRequestContextAttribute(@Nullable String requestContextAttribute)
Set the name of the RequestContext attribute for this view. Default is none.

### getRequestContextAttribute

@Nullable public String getRequestContextAttribute()
Return the name of the RequestContext attribute, if any.

### setAttributesCSV

public void setAttributesCSV(@Nullable String propString) throws IllegalArgumentException
Set static attributes as a CSV string. Format is: attname0={value1},attname1={value1}

"Static" attributes are fixed attributes that are specified in the View instance configuration. "Dynamic" attributes, on the other hand, are values passed in as part of the model.

Throws:
  `IllegalArgumentException`

### setAttributes

public void setAttributes(Properties attributes)
Set static attributes for this view from a `java.util.Properties` object.

"Static" attributes are fixed attributes that are specified in the View instance configuration. "Dynamic" attributes, on the other hand, are values passed in as part of the model.

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 Also:
  - `PropertiesEditor`

### setAttributesMap

public void setAttributesMap(@Nullable Map<String,?> attributes)
Set static attributes for this view from a Map. This allows to set any kind of attribute values, for example bean references.

"Static" attributes are fixed attributes that are specified in the View instance configuration. "Dynamic" attributes, on the other hand, are values passed in as part of the model.

Can be populated with a "map" or "props" element in XML bean definitions.

Parameters:
  `attributes` - a Map with name Strings as keys and attribute objects as values

### getAttributesMap

public Map<String,Object> getAttributesMap()
Allow `Map` access to the static attributes of this view, 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.

### addStaticAttribute

public void addStaticAttribute(String name, Object value)
Add static data to this view, exposed in each view.

"Static" attributes are fixed attributes that are specified in the View instance configuration. "Dynamic" attributes, on the other hand, are values passed in as part of the model.

Must be invoked before any calls to `render`.

Parameters:
  `name` - the name of the attribute to expose
  `value` - the attribute value to expose
See Also:
  - `render(java.util.Map<java.lang.String, ?>, jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse)`

### getStaticAttributes

public Map<String,Object> getStaticAttributes()
Return the static attributes for this view. Handy for testing.

Returns an unmodifiable Map, as this is not intended for manipulating the Map but rather just for checking the contents.

Returns:
  the static attributes in this view

### setExposePathVariables

public void setExposePathVariables(boolean exposePathVariables)
Specify whether to add path variables to the model or not.

Path variables are commonly bound to URI template variables through the `@PathVariable` annotation. They are effectively URI template variables with type conversion applied to them to derive typed Object values. Such values are frequently needed in views for constructing links to the same and other URLs.

Path variables added to the model override static attributes (see `setAttributes(Properties)`) but not attributes already present in the model.

By default this flag is set to `true`. Concrete view types can override this.

Parameters:
  `exposePathVariables` - `true` to expose path variables, and `false` otherwise

### isExposePathVariables

public boolean isExposePathVariables()
Return whether to add path variables to the model or not.

### setExposeContextBeansAsAttributes

public void setExposeContextBeansAsAttributes(boolean exposeContextBeansAsAttributes)
Set whether to make all Spring beans in the application context accessible as request attributes, through lazy checking once an attribute gets accessed.

This will make all such beans accessible in plain `${...}` expressions in a JSP 2.0 page, as well as in JSTL's `c:out` value expressions.

Default is "false". Switch this flag on to transparently expose all Spring beans in the request attribute namespace.

NOTE: Context beans will override any custom request or session attributes of the same name that have been manually added. However, model attributes (as explicitly exposed to this view) of the same name will always override context beans.

See Also:
  - `getRequestToExpose(jakarta.servlet.http.HttpServletRequest)`

### setExposedContextBeanNames

public void setExposedContextBeanNames(String... exposedContextBeanNames)
Specify the names of beans in the context which are supposed to be exposed. If this is non-null, only the specified beans are eligible for exposure as attributes.

If you'd like to expose all Spring beans in the application context, switch the `"exposeContextBeansAsAttributes"` flag on but do not list specific bean names for this property.

### setBeanName

public void setBeanName(@Nullable String beanName)
Set the view's name. Helpful for traceability.

Framework code must call this when constructing views.

Specified by:
  `setBeanName` in interface `org.springframework.beans.factory.BeanNameAware`

### getBeanName

@Nullable public String getBeanName()
Return the view's name. Should never be `null`, if the view was correctly configured.

### render

public void render(@Nullable Map<String,?> model, HttpServletRequest request, HttpServletResponse response) throws Exception
Prepares the view given the specified model, merging it with static attributes and a RequestContext attribute, if necessary. Delegates to renderMergedOutputModel for the actual rendering.

Specified by:
  `render` in interface `View`
Parameters:
  `model` - a Map with name Strings as keys and corresponding model objects as values (Map can also be `null` in case of empty model)
  `request` - current HTTP request
  `response` - he HTTP response we are building
Throws:
  `Exception` - if rendering failed
See Also:
  - `renderMergedOutputModel(java.util.Map<java.lang.String, java.lang.Object>, jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse)`

### createMergedOutputModel

protected Map<String,Object> createMergedOutputModel(@Nullable Map<String,?> model, HttpServletRequest request, HttpServletResponse response)
Creates a combined output Map (never `null`) that includes dynamic values and static attributes. Dynamic values take precedence over static attributes.

### createRequestContext

protected RequestContext createRequestContext(HttpServletRequest request, HttpServletResponse response, Map<String,Object> model)
Create a RequestContext to expose under the specified attribute name.

The default implementation creates a standard RequestContext instance for the given request and model. Can be overridden in subclasses for custom instances.

Parameters:
  `request` - current HTTP request
  `model` - combined output Map (never `null`), with dynamic values taking precedence over static attributes
Returns:
  the RequestContext instance
See Also:
  - `setRequestContextAttribute(java.lang.String)`
  - `RequestContext`

### prepareResponse

protected void prepareResponse(HttpServletRequest request, HttpServletResponse response)
Prepare the given response for rendering.

The default implementation applies a workaround for an IE bug when sending download content via HTTPS.

Parameters:
  `request` - current HTTP request
  `response` - current HTTP response

### generatesDownloadContent

protected boolean generatesDownloadContent()
Return whether this view generates download content (typically binary content like PDF or Excel files).

The default implementation returns `false`. Subclasses are encouraged to return `true` here if they know that they are generating download content that requires temporary caching on the client side, typically via the response OutputStream.

See Also:
  - `prepareResponse(jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse)`
  - `ServletResponse.getOutputStream()`

### getRequestToExpose

protected HttpServletRequest getRequestToExpose(HttpServletRequest originalRequest)
Get the request handle to expose to `renderMergedOutputModel(java.util.Map<java.lang.String, java.lang.Object>, jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse)`, i.e. to the view.

The default implementation wraps the original request for exposure of Spring beans as request attributes (if demanded).

Parameters:
  `originalRequest` - the original servlet request as provided by the engine
Returns:
  the wrapped request, or the original request if no wrapping is necessary
See Also:
  - `setExposeContextBeansAsAttributes(boolean)`
  - `setExposedContextBeanNames(java.lang.String...)`
  - `ContextExposingHttpServletRequest`

### renderMergedOutputModel

protected abstract void renderMergedOutputModel(Map<String,Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception
Subclasses must implement this method to actually render the view.

The first step will be preparing the request: In the JSP case, this would mean setting model objects as request attributes. The second step will be the actual rendering of the view, for example including the JSP via a RequestDispatcher.

Parameters:
  `model` - combined output Map (never `null`), with dynamic values taking precedence over static attributes
  `request` - current HTTP request
  `response` - current HTTP response
Throws:
  `Exception` - if rendering failed

### exposeModelAsRequestAttributes

protected void exposeModelAsRequestAttributes(Map<String,Object> model, HttpServletRequest request) throws Exception
Expose the model objects in the given map as request attributes. Names will be taken from the model Map. This method is suitable for all resources reachable by `RequestDispatcher`.

Parameters:
  `model` - a Map of model objects to expose
  `request` - current HTTP request
Throws:
  `Exception`

### createTemporaryOutputStream

protected ByteArrayOutputStream createTemporaryOutputStream()
Create a temporary OutputStream for this view.

This is typically used as IE workaround, for setting the content length header from the temporary stream before actually writing the content to the HTTP response.

### writeToResponse

protected void writeToResponse(HttpServletResponse response, ByteArrayOutputStream baos) throws IOException
Write the given temporary OutputStream to the HTTP response.

Parameters:
  `response` - current HTTP response
  `baos` - the temporary OutputStream to write
Throws:
  `IOException` - if writing/flushing failed

### setResponseContentType

protected void setResponseContentType(HttpServletRequest request, HttpServletResponse response)
Set the content type of the response to the configured `content type` unless the `View.SELECTED_CONTENT_TYPE` request attribute is present and set to a concrete media type.

### toString

public String toString()

Overrides:
  `toString` in class `Object`

### formatViewName

protected String formatViewName()