0

こんにちは、次の問題があります。

search.xhtml という名前の検索ページがあり、バーコードを検索できます。この値は一意であるため、結果は常にデータベースからの 1 つまたは 0 個のオブジェクトになります。

<p:panelGrid columns="1" style="margin:20px;">
  <h:form>
    <p:messages id="messages" globalOnly="true" showDetail="false" />
    <p:message for="barcode" />

    <p:inputText id="barcode" value="#{searchForm.barCode}"
                 required="true" requiredMessage="Value needed" />

    <p:commandButton value="search"
                     action="#{searchForm.searchBarcode}" id="search"/>

  </h:form>
</p:panelGrid>

これはバッキングビーンです:

@ManagedBean
@ViewScoped
public class SearchForm extends BasePage {
  private Long barCode;

  @ManagedProperty("#{daoManager}")
  public DaoManager daoManager;

  public void setDaoManager(DaoManager daoManager) {
    this.daoManager = daoManager;
  }
  public Long getBarCode() {
    return barCode;
  }
  public void setBarCode(Long barCode) {
    this.barCode = barCode;
  }
  public String searchBarcode() {
    //request to dao to get the object
    DataList<Data> data = daoManager.findbybarcode(barCode);
    if (data.size() == 0) {
      this.addMessage(FacesMessage.SEVERITY_ERROR,
                      "Not Found: " + barCode);
      return null;
    } else {       
      getFacesContext().getExternalContext().
        getRequestMap().put("id", data.getId());
      return "details";
    }
  }

したがって、パラメーター ID を期待する詳細ページに移動すると、これは詳細ページに送信されません。

バッキング Bean の詳細ページ:

@ManagedBean
@ViewScoped
public class DetailBean extends BasePage implements Serializable {
  @PostConstruct
  public void init() {
    if (id != null) {
      //Go on with the stuff
    } else {
      addMessage(FacesMessage.SEVERITY_ERROR,"Object not found");
    }       
  }
}

私は何を間違っていますか?そして、これは JSF の間違った使い方でしょうか? リストを生成して結果をクリックできることは知っていますが、それは私が望むものではありません。また、最初の Bean からバーコードを取得してパラメーターとして渡すこともできますが、詳細ページでオブジェクトからの ID のみを受け入れるようにします。では、私の考えは間違っていますか?または、このようにする解決策はありますか?

4

1 に答える 1

1

私の理解が正しければ、あなたはバーコードの ID をdetailsページに渡したいと考えています。はい、これは可能です。

getFacesContext().getExternalContext().getRequestMap().put("id", data.getId()); 

次の行は、クライアントが送信したばかりのリクエストに ID パラメーターを挿入していますが、ナビゲーション アクションのdetails結果は別のリクエストになります。代わりにこれを試してください:

return "details?faces-redirect=true&id=" + data.getId();

これにより、リクエストでリクエスト パラメータとして渡されたバーコードの ID を持つ HTTP GET ナビゲーション アクションが返されます。

于 2012-05-15T12:13:01.213 に答える