簡體   English   中英

從支持bean A到支持bean B的JSF屬性轉移

[英]JSF property transfer from backing bean A to backing bean B

我現在正在深入研究JSF 2.0,並且對托管bean屬性從一個視圖到另一個視圖的“傳輸”缺乏一點了解。 我搜索了一下,但沒有找到一個非常好的例子,所以如果有人能指點我一個教程或稍微解釋一下,我真的很感激。

所以這是我的場景:

我正在開發一個小型游樂場日歷應用程序。 第一個視圖select.xhtml包含日歷選擇器,用戶可以在其中選擇特定日期:

<html>
  ...
  <h:form>

    <!-- Calendar selector from primefaces -->
    <p:calendar value="#{calendarSelect.date}" mode="inline" navigator="true" />

    <p:commandButton value="Show entries for date" action="day" />
    ...

我相應的支持bean看起來像這樣:

@ManagedBean(name="calendarSelect")
@RequestScoped
public class CalendarSelectComponent {

  private Date date = null;

  ... // Getters and setters

現在,當我從select.xhtml提交表單時,我轉發到day.xhtml

<html>
  ...
  <h:form>

    The current day ist:
    <h:outputText value="#{calendarEdit.date}">
      <f:convertDateTime pattern="dd.MM.yyyy" />
    </h:outputText>

支持bean現在看起來像這樣:

@ManagedBean(name="calendarEdit")
@ViewScoped
public class CalendarEditComponent implements Serializable {

  private Date date = null;
  private CalendarEntryBean currentEntry = null;
  private List<CalendarEntryBean> allEntries = null;

  ....

我現在正在嘗試解決問題:如何將date參數從選擇器傳輸到編輯器

我嘗試了很多選項,一個是這樣的:

<p:commandButton value="Show entries for date" action="day" />
  <f:setPropertyActionListener target="#{calendarEdit.date}" value="#{calendarSelect.date}" />
</p:commandButton>

調試器顯示,確實,該date的財產calendarEdit會填充值calendarSelect ,但由於day.xhtml是一個新的觀點,新的CalendarEditComponent正在創建支持bean,而不是一個我已經填充了日期從select視圖中的select器。

我已經讀過一個解決方案是創建一個SessionScoped支持bean,它確實保留了它的所有值。 但這不是我認為它應該工作的方式,因為我不需要會話中的信息,我只是希望它從A到B“旅行”。基於會話的方法的另一個缺點是我可以每個會話只使用一個選擇器和一個編輯器 - 如果您考慮多窗口瀏覽等,我認為這是不可接受的。

我真的不認為我是第一個遇到這種情況的人,我確信JSF為此提供了一個優雅的解決方案,但我無法找到解決方案。

再一次,如果有人知道如何處理這個 - 我正在聽! ;-)

<f:setPropertyActionListener>在表單提交的調用操作階段執行。 所以它期望價值在那時仍然存在。 但由於您的select bean是請求作用域,因此在表單提交期間它不存在。 您希望傳遞一個請求參數,該參數在渲染響應期間在輸出中內聯。 您可以使用<f:param>執行此操作。

<p:commandButton value="Show entries for date" action="day" />
  <f:param name="date" value="#{calendarSelect.dateAsString}" />
</p:commandButton>

它將作為請求參數提供(請注意,由於HTTP的性質,它只能理解字符串)。 您可以讓JSF將請求參數設置為托管屬性,但由於您的編輯bean是視圖范圍的,因此@ManagedProperty無法實現。 你必須通過ExternalContext自己收集它。

String dateAsString = externalContext.getRequestParameterMap().get("date");

沒錯,那太笨拙了。 我只是使用相同的bean和視圖,並通過rendered屬性切換選擇/編輯表單的可見性。 編輯視圖畢竟不能通過簡單的GET直接打開/收藏,不是嗎? ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM