0

当用户单击带有该产品名称的链接时,我想显示有关该产品的详细信息。

在调试我的代码时,我看到details下面代码中显示的方法没有运行。

我的代码:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets">
<h:body>
    <ui:composition template="/Shared/layout.xhtml" >
        <ui:define name="title">Product</ui:define>
        <ui:define name="body">
            <div id="contents" >
                <h3> List Product in Site </h3>
                <ul>
                    <ui:repeat value="#{productBean.listProduct}" var="p">
                        <div id="list-item">
                            <div class='item' >
                                <div class='item-img' >
                                    <h:form>
                                        <input type="hidden" name="productId" value="#{p.productId}" />
                                        <h:commandLink action="#{productBean.details}">
                                            <h:graphicImage url="#{p.picture}" alt='No Picture' />
                                        </h:commandLink>
                                    </h:form>
                                </div>
                                <h:form>
                                    <input type="hidden" name="productId" value="#{p.productId}" />
                                    <h:commandLink value="#{p.name}" action="#{productBean}" >
                                    </h:commandLink>
                                </h:form>
                            </div>    
                        </div>
                    </ui:repeat>
                </ul>
                <h:form>
                    <h:commandLink value="text" action="#{productBean.test}">  <!-- test -->
                    </h:commandLink>
                </h:form>
            </div>
        </ui:define>
    </ui:composition>
</h:body>

产品豆:

@ManagedBean
@RequestScoped
public class ProductBean implements Serializable {

    private List<Products> listProduct;
    private List<Categories> listCategory;
    private Products product;

    public Products getProduct() {
        return product;
    }

    public void setProduct(Products product) {
        this.product = product;
    }

    public ProductBean() {
        listCategory = new ProductsDB().listCategory();
    }
    private int categoryId;

    public int getCategoryId() {
        return categoryId;
    }

    public void setCategoryId(int categoryId) {
        this.categoryId = categoryId;
    }

    public String listProductByCt() {
        try {
            String value = FacesContext.getCurrentInstance().
                    getExternalContext().getRequestParameterMap().get("categoryId");
            setCategoryId(Integer.parseInt(value));
            if (categoryId == 0) {
                return "index";
            }
            listProduct = new ProductsDB().listProducts(categoryId);
            return "product";
        } catch (Exception e) {
            return "error";
        }
    }

    public String details() {
        String s = "";
        try {
            String productId = FacesContext.getCurrentInstance().
                    getExternalContext().getRequestParameterMap().get("productId");
            if (productId != null) {
                product = new ProductsDB().getProductById(productId);
                return "details";
            }
        } catch (Exception e) {
            return "error";
        }
        return "error";
    }

    public String test()
    {
        return "s";
    }



    public List<Categories> getListCategory() {
        return listCategory;
    }

    public void setListCategory(List<Categories> listCategory) {
        this.listCategory = listCategory;
    }

    public List<Products> getListProduct() {
        return listProduct;
    }

    public void setListProduct(List<Products> listProduct) {
        this.listProduct = listProduct;
    }
}

我也尝试过另一种名为test. 这也是从 on 上的操作引用的products.xhtml,但该操作未放置在<ui:repeat>. 在这种情况下,该方法会被执行。

测试方法:

public String test() {
    String productId = "IP16G";
    product = new ProductsDB().getProductById(productId);
    return "details";
}
4

2 回答 2

4

您使用的是哪个版本的 JSF?

您在 a 中显示的具有不同形式和隐藏输入的代码ui:repeat并不是真正地道的 JSF。您的第一个命令链接的操作中还有一个错字。它说produtBean,但我想它应该是productBean。如果您单击该命令链接,JSF 会给您一个例外。

你有那个例外,还是什么都没发生?

如果什么都没发生,一个可能的原因是您用于呈现命令链接 ( #{productBean.listProduct}) 的数据在回发后不再可用。您使用什么方法来获取这些数据以及您的 bean 的范围是什么?在许多情况下,您应该在请求不是@ViewScoped回发时使用和初始化数据。

此外,请确保没有默认<ui:repeat>设置为渲染属性的父组件。false如果此属性将true在生命周期的某个时间点设置为,这很可能是在处理单击链接之后。如果发生这种情况,它仍然会false在处理点击时发生,这会导致它被默默地忽略。

您可以通过将您的测试命令链接放在旁边来测试最后一个效果<ui:repeat>

<ui:repeat value="#{productBean.products}" var="product">
    ...
</ui:repeat>
<h:commandLink value="test" action="#{productBean.test}" />

尽管您使用多个表单和隐藏字段的方法确实有效,但更惯用的 JSF 版本将是:

<h:form>
    <ui:repeat value="#{productBean.products}" var="product">
        <h:commandLink action="#{productBean.details(product)}">
            <h:graphicImage url="#{product.picture}" alt="No Picture" />
        </h:commandLink>

        <h:commandLink value="#{product.name}" action="#{productBean.details(product)}" />
    </ui:repeat>
</h:form>

使用您的 beandetails方法:

public String details(Product product) {
    this.product = product;
    return "details";
}

(越来越离题,但如果您的方法所做的只是返回导航案例,您可能需要考虑使用直接链接,例如<h:link>将产品的 Id 作为参数。这将使用 GET 转到您的目标页面,在这种情况下更清洁)

编辑

为了测试问题是否不在其他地方,请尝试以下代码。它是一个页面和一个支持 bean。将这些添加到您的项目并请求页面。这应该有效。

formloop.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">

    <h:body>

        <ui:repeat value="#{formInLoopBacking.items}" var="item">
            <h:form>
                <h:commandLink value="#{item}" action="#{formInLoopBacking.action}"/>
            </h:form>
        </ui:repeat>

    </h:body>
</html>

FormInLoopBacking.java

import javax.faces.bean.ManagedBean;

@ManagedBean
public class FormInLoopBacking {

    private String[] items = {"A", "B"};

    public String[] getItems() {
        return items;
    }

    public void action() {
        System.out.println("Action called");
    }

}
于 2012-09-16T11:30:34.927 回答
0

通过查看您上面的代码

你有打开<ui:repeat>标签但没有关闭它并尝试将整个<ui:repeat>放在一个表单中并检查你的页面是<h:form>一个h:form. 如果它不起作用,那么检查你的 bean 是否在视图范围内,如果没有放在视图范围内。

于 2012-09-16T11:11:09.203 回答