4.4. View scope
Prev | 4. Rendering views | Next

## 4.4. View scope

A view-state allocates a new `viewScope` when it enters. This scope may be referenced within the view-state to assign variables that should live for the duration of the state. This scope is useful for manipulating objects over a series of requests from the same view, often Ajax requests. A view-state destroys its viewScope when it exits.

### Allocating view variables

Use the `var` tag to declare a view variable. Like a flow variable, any `@Autowired` references are automatically restored when the view state resumes.

    <var name="searchCriteria" class="com.mycompany.myapp.hotels.SearchCriteria" />

### Assigning a viewScope variable

Use the `on-render` tag to assign a variable from an action result before the view renders:

    <on-render>
        <evaluate expression="bookingService.findHotels(searchCriteria)" result="viewScope.hotels" />
    </on-render>

### Manipulating objects in view scope

Objects in view scope are often manipulated over a series of requests from the same view. The following example pages through a search results list. The list is updated in view scope before each render. Asynchronous event handlers modify the current data page, then request re-rendering of the search results fragment.

    <view-state id="searchResults">
        <on-render>
            <evaluate expression="bookingService.findHotels(searchCriteria)"
                      result="viewScope.hotels" />
        </on-render>
        <transition on="next">
            <evaluate expression="searchCriteria.nextPage()" />
            <render fragments="searchResultsFragment" />
        </transition>
        <transition on="previous">
            <evaluate expression="searchCriteria.previousPage()" />
            <render fragments="searchResultsFragment" />
        </transition>
    </view-state>

Prev | Up | Next
4.3. Specifying view identifiers | Home | 4.5. Executing render actions