JSF 2.0查询字符串传播

时间:2011-01-27 21:30:36

标签: jsf jsf-2

我有一个页面通过查询字符串接收一个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发送查询字符串参数,因此没有加载数据。

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

1 个答案:

答案 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}"/>