当前位置: 首页 > 面试题库 >

Spring中的JSF View范围

秋阳旭
2023-03-14
问题内容

@ViewScoped Spring 3.0中是否有类似JSF的范围?我有一个使用JSF + Spring的应用程序,其中后备bean由Spring管理。我没有在Spring中找到像JSF wiew scope这样的范围。但是它对我没有用。

这是我对自定义Spring范围的尝试:

import java.util.Map;

import javax.faces.context.FacesContext;

import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.Scope;

/**
 * Implements the JSF View Scope for use by Spring. This class is registered as a Spring bean with the CustomScopeConfigurer.
*/
public class ViewScope implements Scope {

    public Object get(String name, ObjectFactory<?> objectFactory) {

        System.out.println("**************************************************");
        System.out.println("-------------------- Getting objects For View Scope ----------");
        System.out.println("**************************************************");
        if (FacesContext.getCurrentInstance().getViewRoot() != null) {
            Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();
            if (viewMap.containsKey(name)) {
                return viewMap.get(name);
            } else {
                Object object = objectFactory.getObject();
                viewMap.put(name, object);
                return object;
            }
        } else {
            return null;
        }
    }

    public Object remove(String name) {
        System.out.println("**************************************************");
        System.out.println("-------------------- View Scope object Removed ----------");
        System.out.println("**************************************************");

        if (FacesContext.getCurrentInstance().getViewRoot() != null) {
            return FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove(name);
        } else {
            return null;
        }
    }

    public void registerDestructionCallback(String name, Runnable callback) {
        // Do nothing
    }

    public Object resolveContextualObject(String key) {         return null;
    }

    public String getConversationId() {
        return null;
    }

}

application-context.xml:

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
            <map>
                <entry key="view">
                    <bean class="com.delta.beans.ViewScope"/>
                </entry>
            </map>
        </property>
 </bean>

问题答案:
public class ViewScopeCallbackRegistrer implements ViewMapListener {

  @SuppressWarnings("unchecked")
  @Override
  public void processEvent(SystemEvent event) throws AbortProcessingException {
    if (event instanceof PostConstructViewMapEvent) {
      PostConstructViewMapEvent viewMapEvent = (PostConstructViewMapEvent) event;

      UIViewRoot viewRoot = (UIViewRoot) viewMapEvent.getComponent();

      viewRoot.getViewMap().put(
          ViewScope.VIEW_SCOPE_CALLBACKS,
          new HashMap<String, Runnable>()
      );

    } else if (event instanceof PreDestroyViewMapEvent) {
      PreDestroyViewMapEvent viewMapEvent = (PreDestroyViewMapEvent) event;

      UIViewRoot viewRoot = (UIViewRoot) viewMapEvent.getComponent();

      Map<String, Runnable> callbacks = (Map<String, Runnable>) viewRoot
          .getViewMap().get(ViewScope.VIEW_SCOPE_CALLBACKS);

      if (callbacks != null) {
        for (Runnable c : callbacks.values()) {
          c.run();
        }
        callbacks.clear();
      }
    }
  }

  @Override
  public boolean isListenerForSource(Object source) {
    return source instanceof UIViewRoot;
  }
}


 类似资料:
  • 问题内容: 有人可以解释一下我一直只使用“原型”的Spring bean的作用域吗,但是还有其他参数可以代替吗? 我在说什么的例子 问题答案: 从Spring规范开始,支持五种类型的bean作用域: 1.单身人士(默认*) 每个Spring IoC容器将单个bean定义的作用域限定为单个对象实例。 2.原型 将单个bean定义的作用域限定为任意数量的对象实例。 3.要求 将单个bean定义的范围限

  • 如果我有一个Web应用程序,它的应用程序上下文加载了我的webapp和所有作业配置文件的所有内容,如果我的作业中有一个没有范围="步骤"的简单ItemReader,那么阅读器是单例的,对吗?所以如果我通过SimpleJobLauncher从控制器启动两次作业,我会使用同一个bean,对吗?除非我放入范围="步骤",以便每个作业执行一个bean? 另一方面,如果我从CommandLineJobRun

  • 从WebSocketendpoint,我尝试调用单例服务。但是我无法使用来自WebSocket的请求或会话范围。 谢谢你的帮助!

  • 我们有一个媒体对象: } 通道父级的急切获取在常规存储库方法中有效,但在使用规范时无效。 规格如下: 当指定channelType时,“搜索”规范正常工作,因此连接正在工作。如何指定应急切获取连接? 我尝试添加 然后Hibernate抛出一个异常: 组织。冬眠QueryException:查询指定了联接获取,但所获取关联的所有者不在选择列表中[FromElement{explicit,not a

  • 我们知道Spring框架提供了单例、原型、请求、会话、全局会话bean范围。 我们还知道Spring Web流提供了flow Scope、viewScope、Request estScope、flash Scope、versationScope。 因此,如果我在spring MVC项目中提到一个组件,比如说Student,作为@Component@Scope=singleton。对于每个请求,它会

  • 我试图在会话范围内创建一个Spring bean: 当我尝试在servlet过滤器中从Application Context获取类时,如下所示: 我收到以下错误: 如果我将范围定义为< code>prototype,就不会有任何问题!如何从applicationContext中检索会话范围的spring bean?