Introduction
In addition to the existing JSF 1.x scopes – Request, Session, and Application, JSF 2 introduced two new scopes to the managed bean lifecycle.
View Scope
This scope persists the state of request parameters in the FacesContext View Map until the current view being rendered is discarded. As long as a user is interacting with the current page, request parameter state is maintained.
Flash Scope
First seen in the Ruby on Rails framework, this scope is for short lived conversations that only need to propagate parameters from one request to the next in the request processing lifecycle. Thereafter, the state of request parameters is discarded from the FacesContext View Map.
Implementing the JSF View Scope in Spring 3
Spring 3 supports the following
bean scopes out-of-the-box:
- singleton – Scopes a single bean definition to a single object instance per Spring IoC container.
- prototype – Scopes a single bean definition to any number of object instances.
- request – Scopes a single bean definition to the lifecycle of a single HTTP request; that is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.
- session – Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.
- globalSession – Scopes a single bean definition to the lifecycle of a global HTTP Session. Typically only valid when used in a portlet context. Only valid in the context of a web-aware Spring ApplicationContext.
In addition to the above scopes it is possible to create custom scopes. To support the JSF2 managed bean View Scope in the Spring Spring IoC container it is necessary to create a custom scope which implements the org.springframework.beans.factory.config.Scope
interface. Beans created using this interface should then be registered with the Spring Custom Scope Configurer.
Create the View Scope implementation
First, create the View Scope bean implementing the required logic for the get()
and remove()
methods.
1 | package net.comdynamics.myapp.web.spring.customscope; |
5 | import javax.faces.context.FacesContext; |
7 | import org.springframework.beans.factory.ObjectFactory; |
8 | import org.springframework.beans.factory.config.Scope; |
11 | * Implements the JSF View Scope for use by Spring. This class is registered as a Spring bean with the CustomScopeConfigurer. |
13 | public class ViewScope implements Scope { |
15 | public Object get(String name, ObjectFactory objectFactory) { |
16 | if (FacesContext.getCurrentInstance().getViewRoot() != null ) { |
17 | Map viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap(); |
18 | if (viewMap.containsKey(name)) { |
19 | return viewMap.get(name); |
21 | Object object = objectFactory.getObject(); |
22 | viewMap.put(name, object); |
30 | public Object remove(String name) { |
31 | if (FacesContext.getCurrentInstance().getViewRoot() != null ) { |
32 | return FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(name); |
38 | public void registerDestructionCallback(String name, Runnable callback) { |
42 | public Object resolveContextualObject(String key) { |
46 | public String getConversationId() { |
Register the View Scope implementation
To enable the View Scope implementation in your web application, register the custom Scope implementation in your application context.
1 | xml version = "1.0" encoding = "UTF-8" ?>
|
8 | class = "org.springframework.beans.factory.config.CustomScopeConfigurer" > |
9 | < b:property name = "scopes" > |
12 | < b:bean class = "net.comdynamics.myapp.web.spring.customscope.ViewScope" /> |
Important
If you specify @Scope("view")
in your managed bean and the JSF page is loaded, failure to register the custom scope bean in your Spring application context will result in an error similar to the following:
1 | javax.servlet.ServletException: No Scope registered for scope 'view' |
2 | javax.faces.webapp.FacesServlet.service(FacesServlet.java:323) |
Create your JSF managed bean
1 | package net.comdynamics.myapp.web; |
3 | import javax.inject.Named; |
4 | import org.springframework.context.annotation.Scope; |
7 | * ReportListPage JSF backing bean. |
9 | @Named ( "reportListPage" ) |
11 | public class ReportListPage extends BasePage { |
14 | @Named ( "reportService" ) |
15 | private ReportService reportService; |
17 | public ReportListPage() { |
20 | public ReportService getReportService() { |
24 | public void setReportService(ReportService ReportService) { |
25 | this .reportService = reportService; |
When the user loads the page bound to the above backing bean, request parameters entered in form fields will be persisted in the FacesContext View Map on form submissions until they navigate to another page in the application.
Conclusion
Support for the JSF 2 View Scope in Spring 3 can be realised by implementing a custom Scope and registering it as a bean in the Spring application context.
Key benefits provided by View Scope are persisting of request parameters across form submissions for the same page, thereby removing the need to manage request parameter state within the web application session.
2 comments:
Great Article
JSF Online Training | JSF Training | JSF Training Courses | Java Training Institutes in Chennai | Java Training in Chennai | Java Course in Chennai | JSF Interview Questions
www0626
canada goose outlet
longchamp bags
barbour jackets
san francisco 49ers jerseys
pandora charms
indianapolis colts jerseys
air jordan shoes
oakley sunglasses
pandora charms
givenchy handbags
Post a Comment