2

私はGWTPに精通しています。Piritiマッパーを使用して、JSON値を含むテーブルを出力しようとしました。これは実際のプロジェクトのコードではなく、GWTPを理解するための試みにすぎないため、これは最も美しいソリューションではない可能性があります(実際、確実なソリューションではありません)。この手順に関与する2人のプレゼンターは次のとおりです。

FirstPresenter(を使用します。つまり、ウィジェットです。ここでウィジェットを使用する必要があるかどうかはわかりませんが、この会話ProductListPresenterによれば、ウィジェットでうまくいく可能性があります):

public class FirstPresenter extends
        Presenter<FirstPresenter.MyView, FirstPresenter.MyProxy> {

    public static final Object SLOT_RATE = new Object();
    public static final Object SLOT_PRODUCT = new Object();
    private IndirectProvider<ProductListPresenter> productListFactory;

    public interface MyView extends View {
        public Panel getListProductPanel();
    }

    @Inject ProductListPresenter productListPresenter;

    @ProxyCodeSplit
    @NameToken(NameTokens.first)
    public interface MyProxy extends ProxyPlace<FirstPresenter> {
    }

    @Inject
    public FirstPresenter(final EventBus eventBus, final MyView view,
            final MyProxy proxy, Provider<ProductListPresenter> productListFactory) {
        super(eventBus, view, proxy);

        this.productListFactory = new StandardProvider<ProductListPresenter>(productListFactory);
    }

    @Override
    protected void revealInParent() {
    }

    @Override
    protected void onBind() {
        super.onBind();
    }

    @Inject
    PlaceManager placeManager;

    @Override
    protected void onReset() {
        super.onReset();
        setInSlot(SLOT_PRODUCT, null);
        for (int i = 0; i < 2; i++) { //TODO: change hardcoded value 

            productListFactory.get(new AsyncCallback<ProductListPresenter>() {

                @Override
                public void onSuccess(ProductListPresenter result) {
                        addToSlot(SLOT_PRODUCT, result);
                }

                @Override
                public void onFailure(Throwable caught) {

                }
            });

        }
    }

}

ProductListPresenter:_

public class ProductListPresenter extends
        PresenterWidget<ProductListPresenter.MyView> {

    @Inject ProductListPiritiJsonReader reader;

    public interface MyView extends View {
        public Label getNameLabel();
        public Label getCompanyLabel();
        public Label getSerialLabel();
        public Label getPricesLabel();
    }

    @Inject
    public ProductListPresenter(final EventBus eventBus, final MyView view) {
        super(eventBus, view);
    }

    @Override
    protected void onBind() {
        super.onBind();
    }

    @Override
    protected void onReset() {
        super.onReset();

        try {
            RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, "/jsongwtproject/products.json");
            rb.setCallback(new RequestCallback() {
                @Override
                public void onResponseReceived(Request request, Response response) {
                    ProductList productList = reader.read(response.getText());
                    for (Product product : productList.getProductList()) {
                        fetchDataFromServer();
                    }
                }
                @Override
                public void onError(Request request, Throwable exception) {
                    Window.alert("Error occurred" + exception.getMessage());
                }
            });
            rb.send();
        } 
        catch (RequestException e) {
            Window.alert("Error occurred" + e.getMessage());
        }
    }
    //Takes the JSON string and uses showProductListData(String jsonString)  method
    public void fetchDataFromServer() {
        try {
            RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, "/jsongwtpproject/products.json");
            rb.setCallback(new RequestCallback() {
                @Override
                public void onResponseReceived(Request request, Response response) {
                    showProductListData(response.getText());                    
                }
                @Override
                public void onError(Request request, Throwable exception) {
                    Window.alert("Error occurred" + exception.getMessage());
                }
            });
            rb.send();
        } 
        catch (RequestException e) {
            Window.alert("Error occurred" + e.getMessage());
        }
    }
    //Uses Piriti mappers to take JSON values
    private void showProductListData(String jsonString) {
        ProductList productList = reader.read(jsonString);
        for (Product product : productList.getProductList()) {
            StringBuffer priceSb = new StringBuffer();
            for (Double price : product.getPrices()) {
                priceSb.append(price + ", ");
            }

            getView().getNameLabel().setText(product.getName());
            getView().getCompanyLabel().setText(product.getCompany());
            getView().getSerialLabel().setText(product.getSerialNumber());
            getView().getPricesLabel().setText(priceSb.toString());
            //break;

        }
    }   

}

そしてProductListView.ui.xml

<g:HTMLPanel>
<table border="1">
    <tr>
        <td><g:Label ui:field="nameLabel" /> </td>
        <td><g:Label ui:field="companyLabel" /> </td> 
        <td><g:Label ui:field="serialLabel" /> </td>
        <td><g:Label ui:field="pricesLabel" /> </td> 
    </tr>
    </table>
</g:HTMLPanel> 

現在、JSONには2つの製品があります。

このコードで何が起こるかを次に示します。最初の行が表示され、次に's値Product1を含む最初の行に変更され、次に' s値が含まれ、次に' sが表示され、その後2番目の行が表示されます。 's値を含む2番目の行に変更し、次に' s値を含み、次に'sを含みます。Product2Product1Product2Product1Product2Product1Product2

したがって、2つの積と2つの行があり、このコードでは値が2回変更されますが、最終的にテーブルにはProduct2の値のみが含まれます。break;コメントがない場合、Product1の値は最初の行に2回出力され、次に2番目の行に出力され、テーブルにはこれらProduct1の値のみが含まれます。

私はそれがなぜ起こるのか理解しています。しかし、私はまだ正しい出力を作成する方法を理解していません。誰かが正しい出力を行う方法を教えてくれたり、例を教えてくれたら(またはウィジェットの使用法など、どの部分がひどく間違っているかを教えてくれたら)素晴らしいと思います。

4

1 に答える 1

1

コードの問題は、ProductListView.ui.xmlに実際のテーブルがないことです。

もちろん、サーバーから2つのレコードが取得された場合、コードのこの部分は2回呼び出されます。

getView().getNameLabel().setText(product.getName());
getView().getCompanyLabel().setText(product.getCompany());
getView().getSerialLabel().setText(product.getSerialNumber());
getView().getPricesLabel().setText(priceSb.toString());

2番目の呼び出しは、最初の呼び出しの値を上書きします。

コードを改善するためのポイント:

  1. 実際のテーブルビューを作成するためのCellTableについて読むことをお勧めします。
  2. PresenterWidget自体をデータホルダーとして使用しないでください。代わりに、データベースに渡されるDTOを作成し、これを使用してデータを取得します。
于 2012-05-10T08:43:51.483 に答える