【问题标题】:Jsf / Spring request scoped beanJsf / Spring请求范围bean
【发布时间】:2011-08-15 07:47:55
【问题描述】:

由于我在 javaee 编程方面没有太多经验,也没有人问,所以我想问你。 我的代码中有一件事我不喜欢并且认为它以错误的方式实现。 我的托管 bean 是请求范围的。在 jsf 中,我使用 rich:pickList 从列表中获取数据。

@Scope("request")
public class MyBean{
     private List<String> sourceList;
     ....     

     public List<String> getsourceList() {
            //if (sourceList == null)    <--- Has no sence in request scoped bean
             { sourceList = service.loadList();
             }
             return sourceList;
     }

....

}

我也有提交存储一些数据的按钮。

问题是,每次页面执行某些操作(例如单击提交按钮)时,每次都会调用此 get 方法并进入服务层,然后进入 dao 和数据库。这显然似乎不是正确的解决方案。 如何避免? 谢谢你的回答。

【问题讨论】:

    标签: spring jsf scope managed-bean


    【解决方案1】:

    在web.xml中添加Spring RequestContextListener,Spring可以添加请求范围和会话范围。

    <listener>
         <listener-class>
              org.springframework.web.context.request.RequestContextListener
         </listener-class>  
    </listener>
    

    参考: 3.4.4. The other scopes

    【讨论】:

      【解决方案2】:

      如果您使用的是 JSF 2.0,则可以通过 @ViewScoped 使用新的视图范围。

      @ManagedBean
      @ViewScoped
      public class Bean {
      
          private List<Foo> foos;
      
          @EJB
          private FooService fooService;
      
          @PostConstruct
          public void init() {
              foos = fooService.list();
          }
      
          public List<Foo> getFoos() {
              return foos;
          }
      
      }
      

      当您仍在使用 JSF 1.x 时,很高兴知道 RichFaces' &lt;a4j:keepAlive&gt;Tomahawk's &lt;t:saveState&gt; 对具有上述代码设计的请求范围 bean 具有完全相同的效果(即不要在吸气剂):

      <a4j:keepAlive beanName="#{bean}" />
      

      <t:saveState beanName="#{bean}" />
      

      我没有使用新的 RichFaces 的 @KeepAlive 注释,但关于文档,它的行为也应该相同。

      【讨论】:

        【解决方案3】:

        Spring WebFlow 中其实有一个“对话范围”:

        http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch12s06.html

        【讨论】:

          【解决方案4】:

          每个人都有这个问题,因为没有“对话”范围。您有“会话”(只要用户登录)和“请求”(一个请求/响应周期)。

          您需要一种表达“用户已开始对话”的方式,然后执行几个属于该对话的请求并最终结束。

          由于 JavaEE 不支持此功能,因此您必须模拟它。当用户开始对话时,将 bean 放在会话范围内并保留在那里。当用户完成对话后,手动删除 bean 或告诉它清理缓存。

          【讨论】:

          • 那么keepAlive功能呢?它会有所帮助还是不是一个好习惯?
          • keepAlive 功能很多。你说的是哪一个?
          • Hm :-/ 在 Spring 文档中找不到该注释。全名是什么?
          • :) 这是整个包。 org.ajax4jsf.model.KeepAlive 我已经阅读了指南,我认为这是我的 bean 所需要的。感谢您对对话范围的建议,有趣的想法:)
          • 注解@KeepAlive的全名是什么?或者你有文档的 URL 吗?
          猜你喜欢
          • 2011-11-11
          • 2013-01-21
          • 2011-08-19
          • 1970-01-01
          • 2011-09-02
          • 2014-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多