我有一个页面通过查询字符串接收一个id号并显示相关文章。
我将<f:viewParams>
与preRenderView事件一起使用,并在@PostConstruct方法中从db加载数据:
@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发送查询字符串参数,因此没有加载数据。
如何传播查询字符串参数?
答案 0 :(得分:1)
afaik,modify方法应该返回一个以“?includeViewParams = true”结尾的动作字符串。只有这样才能传播视图参数(理论上它应该与faces-include-view-params一起使用,当与face-redirect配对时,它会减少伤害眼睛。)
ADDENDUM:如果您需要(如注释中所述)在init方法中使用该参数,那么从JSF角度来看,它们不是真正的输入。您没有获得验证,转换等。但如果您只想获取原始值,请使用:
@ManagedParam("#{param.id}")
private String id;
// getter and setter for param goes here (obligatory!)
在调用init之前会注入Id。请注意,这基本上是一种绕过viewparams的方法。您可以使用除String之外的其他类型,但任何转换错误都会以异常结束,因此最好将其保留为字符串并手动进行任何转换。
但问题的根源似乎是滥用@PostConstruct;可能你想填写你曾经处于预渲染阶段,大致如此:
<f:event type="preRenderView" listener="#{beanThatNeedsId.init}"/>