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>

ProductBean:

@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。これも のアクションから参照されます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>で設定されている render 属性を持つの親コンポーネントがないことを確認してください。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>

Bean のdetailsメソッドを次のように使用します。

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

(トピックからさらに外れますが、メソッドがナビゲーションケースを返すだけの場合は<h:link>、製品の Id をパラメーターとして使用するなどの直接リンクの使用を検討することをお勧めします。これにより、GET を使用して目的のページに移動し、この場合ははるかにきれいです)

編集

問題が別の場所にないかどうかをテストするには、次のコードを試してください。これは、1 つのページと 1 つのバッキング Bean です。これらをプロジェクトに追加し、ページをリクエストします。これはうまくいくはずです。

フォルミンループ.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>ことを確認してください。うまくいかない場合は、Bean がビュー スコープ内にあるか、ビュー スコープ内にない場合はチェックしてください。<h:form>h:form

于 2012-09-16T11:11:09.203 に答える