2011-01-27 84 views
1

我有一个页面通过querystring接收一个id号码并显示相关文章。JSF 2.0查询字符串传播

我用<f:viewParams>与preRenderView事件和数据从数据库中@PostConstruct方法加载:

@Named 
@RequestScoped 
public class Bean { 
    private Long id; 

    @PostCostruct 
    public void init() { 
     if (this.id != null) { 
      // load data from db 
     } 
    } 

    public String modify() { 
     // update data 
    } 
} 

当我调用数据被正确加载页面,但是当我点击修改按钮

<h:commandButton value="Modify" action="#{bean.modify}" /> 

我得到一个错误,因为没有查询字符串参数发送到bean,从而没有数据加载。

如何传播查询字符串参数?

回答

1

afaik,修改方法应返回以“?includeViewParams = true”结尾的操作字符串。只有这样视图参数才会被传播(理论上它也应该和faces-include-view-params一起工作,当与faces-redirect配对时,这会减少眼睛的伤害)。

附录:如果您需要(如注释中所述)在您的init方法中使用该参数,那么它们不是 - 从JSF角度来看 - 实际输入。你没有得到验证,转换等,但如果你只是想抓住的原始值,使用:

@ManagedParam("#{param.id}") 
private String id; 

// getter and setter for param goes here (obligatory!) 

的ID将在调用init前被注入。请注意,这基本上是一种绕过viewparams的方式。你可以使用除String之外的其他类型,但任何转换错误都将以异常结束,所以最好将它保留为字符串并手动进行任何转换。

但是,你的问题的根源似乎是滥用@PostConstruct;大概要填写您一直在预渲染阶段,大致如下所示:

<f:event type="preRenderView" listener="#{beanThatNeedsId.init}"/> 
+0

但我需要在方法返回之前id参数,甚至在调用该方法,在init方法了。 – Alf 2011-01-29 21:33:19