1

当我点击页面时,没有构造我的 JSF 托管 bean。

这是我的小脸:

            <h:dataTable value="#{productsBean.producten}" var="product">
                <h:column>#{product.description}</h:column>
                <h:column>#{product.price}</h:column>
                <h:column>#{product.categoryName}</h:column>
                <h:column>
                    <h:link value="Edit" outcome="/products/edit">
                        <f:param name="id" value="#{product.product_id}"/>
                    </h:link>
                </h:column>


            </h:dataTable>

这是我的 ProductsBean:

@ManagedBean(eager=true)
@RequestScoped
public class ProductsBean implements Serializable{

    private List<ProductBean> producten; //+getter
    @ManagedProperty(value = "#{applicationBean}")
    private ApplicationBean applicationBean;

    public ProductsBean() {

        Store store = applicationBean.getStore();

        for (String c : store.getCategories()) {
            for(be.kdg.shop.model.stock.Product p : store.getProductsOfCategory(c)){
                ProductBean product = new ProductBean();
                product.setProduct_id(p.getProduct_id());
                product.setDescription(p.getDescription());
                product.setCategoryName(p.getCategoryName());
                product.setPrice(p.getPrice());
            producten.add(product);
            }

        }
....

当我使用“#{productsBean.producten}”时,我的 JavaBean 应该被初始化,但它没有。当我调试我的代码时,我没有到达构造函数。

4

2 回答 2

1

我仍然看到原始的 JSF 源代码。

您的 HTTP 请求根本没有命中FacesServlet。它负责执行所有 JSF 工作,例如创建托管 bean 和生成 HTML。

您应该确保您的 HTTP 请求 URL 与webapp<url-pattern>FacesServlet配置的web.xml. 如果是例如*.jsf,那么您应该打开页面/products.jsf而不是/products.xhtml

或者,您也可以将 的 更改为<url-pattern>,这样您就无需摆弄虚拟 URL。以前在 JSF 1.x 中,这曾经以每次调用自身的无限循环结束,但从 JSF 2.x 开始,这不再发生并且应该可以正常工作。FacesServlet*.xhtml

<servlet>
    <servlet-name>facesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

也可以看看:

于 2013-01-04T11:46:06.693 回答
0

首先, (eager=true) 仅适用于@ApplicationScoped托管 bean,这意味着 bean 将在应用程序初始化时创建,因此在这种情况下您应该删除它。

我建议您检查 producten 属性是否具有 getter 方法,因为您没有在代码中指定它。您也可以尝试使用其他范围,例如@ViewScoped.

于 2013-01-04T10:17:11.197 回答