Backing Bean A에서 Backing Bean B로 JSF 속성 전송
-
15-11-2019 - |
문제
나는 현재 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으로는 직접 열거나 북마크할 수 없습니다. 그렇지 않습니까?;)