如何在Request-Scoped控制器之间传递参数?

时间:2011-07-15 09:16:24

标签: java jsf jsf-2

我有一个简单的JSF-Page,并希望将参数从page1传递给page2。 每个页面都有自己的控制器,在请求范围内。

两个控制器看起来像这样: 控制器1:

@Component("requestController1")
@Scope("request")
public class RequestController1 {

private List<Product> products;
private Product selectedProduct;

@PostConstruct
public void init() {
       //load products from db
}

public void setProducts(List<Product> products) {
    this.products = products;
}

public List<Product> getProducts() {
    return products;
}

public void setSelectedProduct(Product selectedProduct) {
    this.selectedProduct = selectedProduct;
}

public Product getSelectedProduct() {
    return selectedProduct;
}

控制器2:

@Component("requestController2")
@Scope("request")
public class RequestController2 {

private Long selectedProductId;

    @PostConstruct
public void init() {
selectedProductId = (Long) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("selectedProductId");
}

    public void setSelectedProductId(Long selectedProductId) {
    this.selectedProductId = selectedProductId;
}

public Long getSelectedProductId() {
    return selectedProductId;
}
}

现在我想通过将selectedProductId传递给controller2来从page1导航到page2。请注意,两个控制器都在请求范围内,我想使用commandButton进行导航。

<h:commandButton value="Continue" action="requestParam2.jsf?faces-redirect=true">
                <f:param name="selectedProductId" value="#{requestController1.selectedProduct.id}"></f:param>
            </h:commandButton>

似乎f:param在这里不起作用。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

试试这个: <h:commandButton value="Continue" action="requestParam2.jsf?faces-redirect=true&selectedProductId=#{requestController1.selectedProduct.id}"/>

在JSF1中h:commandButton不支持f:param标签 - 如果我没记错的话。您始终可以使用h:commandLink并使用一些CSS样式。

此外,您需要调用getRequestParameterMap()来读取请求参数。 getRequestMap()从servlet请求范围获取条目 - 不完全是你想要的。