当我点击页面时,我的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应该初始化,但事实并非如此。 当我调试我的代码时,我没有到达构造函数。
答案 0 :(得分:1)
我还看到了原始的JSF源代码。
您的HTTP请求根本没有点击FacesServlet
。它是负责执行所有JSF工作的人,例如创建托管bean和生成HTML。
您应确保您的HTTP请求网址与webapp <url-pattern>
中配置的FacesServlet
的{{1}}相匹配。如果是web.xml
,那么您应该按*.jsf
而不是/products.jsf
打开页面。
或者,您也可以将/products.xhtml
的{{1}}更改为<url-pattern>
,这样您就无需使用虚拟网址。以前在JSF 1.x中,这曾经最终在每次调用自身的无限循环中结束,但是由于JSF 2.x这种情况不再发生并且应该可以正常工作。
FacesServlet
答案 1 :(得分:0)
首先,(eager = true)仅适用于@ApplicationScoped
托管bean,并且意味着在应用程序初始化时将创建bean,因此在这种情况下,您应该删除它。
我建议您检查一下producten属性是否有getter方法,因为您没有在代码中指定它。您也可以尝试使用@ViewScoped
等其他范围。