【问题标题】:Jsf2 view parameters and viewscoped beansjsf2视图参数和viewscoped beans
【发布时间】:2011-06-19 08:37:49
【问题描述】:


如何从 viewscoped bean 访问视图参数?
我有一个几乎与此内容相同的页面:

<f:metadata>
    <f:viewParam name="name" value="#{goToUserpageRequest.name}" />
</f:metadata>

<ui:define name="content">
    <h:outputText value="#{user.name}" styleClass="text"></h:outputText>
    <h:outputText value="#{user.description}" styleClass="text"></h:outputText>
</ui:define>

GoToUserpageRequest 是我用来重定向到此页面的 bean,因此我可以发送 name 的值。
用户是我的 viewscoped bean。我想将 viewParam 名称的值传递给 user.name。我该怎么做?
提前致谢!

【问题讨论】:

    标签: java jsf jsf-2


    【解决方案1】:

    对于您的情况,有一种更简单的方法,这是我在寻找相同情况的解决方案时刚刚想到的。 只需在您的 xhtml 中一起使用它:

    <f:metadata>
        <f:viewParam name="name" value="#{goToUserpageRequest.name}" />
    </f:metadata>
    
     <f:event type="preRenderView" listener="#{MY_BEAN.setName(goToUserpageRequest.name)}"/>
    

    这样您就可以将 goToUserpageRequest.name 值发送回重定向视图的 bean(我称为 MY_BEAN)

    【讨论】:

      【解决方案2】:

      您可以使用context 中的external context 获取此信息。请参阅request parameters

      但是,我会尝试在其中使用request 范围bean 和inject 视图和参数范围值。然后,您可以从那里操作您的视图范围对象。这种方法更容易进行单元测试。


      编辑:

      这是一个示例实现:

      @ManagedBean @RequestScoped
      public class NameUpdater {
          @ManagedProperty("#{param.name}") private String name;
          public String getName() { return name; }
          public void setName(String name) { this.name = name; }
      
          @ManagedProperty("#{user}") private User user;
          public User getUser() { return user; }
          public void setUser(User user) { this.user = user; }
      
          @PostConstruct public void init() {
              if(name != null) user.setName(name);
          }
      }
      

      为了创建请求范围的 bean,绑定表达式将更改为:

      <h:outputText value="#{nameUpdater.user.name}" />
      

      【讨论】:

      • 我应该从哪里操作视图范围的对象?因为我在请求中重定向。
      • @bliof - 在请求范围对象中执行你的逻辑
      • 而不是使用视图范围的视图?以及如何传递描述示例的值?可能有点太长了..
      • @bliof - 我添加了一个示例 - 视图和参数值被注入到请求范围人工制品中;表达式更改为通过请求范围一引用视图范围的工件;当@PostConstruct 被调用时,参数值被设置到视图范围对象中。这是 JSF 托管 bean 的一个限制,您无法将其注入更广泛的范围。
      猜你喜欢
      • 1970-01-01
      • 2011-11-02
      • 2013-11-20
      • 2013-02-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      相关资源
      最近更新 更多