문제

나는 현재 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" />
    ...

내 해당 백킹 빈은 다음과 같습니다.

@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>

이제 Backing 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 Backing Bean이 생성되고 있는데 내가 입력한 날짜가 선택기의 날짜로 채워져 있지 않습니다. select 보다.

나는 한 가지 해결책이 SessionScoped 모든 값을 유지하는 백업 빈입니다.그러나 이것은 내 생각에 그것이 작동해야 한다고 생각하는 방식이 아닙니다. 왜냐하면 나는 실제로 정보가 필요하지 않기 때문입니다. 세션, 나는 단순히 A에서 B로 "이동"하기를 원합니다.세션 기반 접근 방식의 또 다른 단점은 세션당 하나의 선택기와 하나의 편집기만 사용할 수 있다는 것입니다. 다중 창 탐색 등을 생각한다면 이는 허용되지 않습니다.

나는 실제로 그러한 시나리오를 접한 첫 번째 사람이라고 생각하지 않으며 JSF가 이에 대한 우아한 솔루션을 제공한다고 확신하지만 해당 솔루션을 찾지 못했습니다.

그러니 다시 한 번 말씀드리지만, 이 문제에 접근하는 방법을 아시는 분 계시다면 제가 듣고 있겠습니다!;-)

도움이 되었습니까?

해결책

그만큼 <f:setPropertyActionListener> 양식 제출의 호출 작업 단계에서 실행됩니다.따라서 해당 시점에 값이 여전히 존재할 것으로 예상합니다.그러나 선택 빈은 요청 범위이므로 양식 제출 중에는 더 이상 존재하지 않습니다.대신 렌더링 응답 중에 출력에 인라인되는 요청 매개변수를 전달하려고 합니다.당신은 이것을 할 수 있습니다 <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");

사실, 그건 서투른 일이다.나는 이것을 위해 동일한 빈과 뷰를 사용하고 선택/편집 양식의 가시성을 다음과 같이 전환했을 것입니다. rendered 기인하다.편집 보기는 결국 간단한 GET으로는 직접 열거나 북마크할 수 없습니다. 그렇지 않습니까?;)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top