正如我繼續我的JSF項目我已經達到了一個點,我需要一些幫助,以進一步讓我的工作。實現Observer模式與@Dependent
首先,我的整個項目可在此鏈接:https://github.com/vasigorc/rimmaproject它編譯和運行。
兩個詞,我已經採取預約的頁面。到目前爲止,約會的唯一領域是日期。它通過primefaces日曆組件輸入。約會會話約會bean實現Observable接口(Observer設計模式的一部分)。每當日期值發生變化時,通知觀察者。觀察者是從屬的 bean,該bean調用REST客戶端以獲取所選日期的天氣預報的對象表示。一旦日期被選定最終用戶點擊提交天氣預報應該出現在同一個頁面的右側部分。
測試完成:我有單元測試了所有的部分獲取方法,以及Observer和Observable實現之間的集成。但是當我運行該應用程序時,更改日期並點擊'提交'日期不會出現。
我找不到一個計算器票這將說明了同樣的問題,但我發現它描述瞭如何實現在JSF不同的設計模式的IBM文章。他們的建議是使用事件監聽器方法。在設計我的應用程序之前,我想要徵求您的建議,試圖找到我的應用程序現在構建的缺陷。
採取預約代碼 前端 頁:
<div class="col-md-4">
<h:form>
<h:panelGrid columns="2">
<span>#{copy.pickadate}</span>
<p:calendar id="calendar" value="#{appointmentFormBean.selectedDate}" locale="fr"
mindate="today" maxdate="today+90" mode="popup"
pattern="yyyy-MM-dd">
</p:calendar>
<input id="requestButton" type="button" value="#{copy.submitButton}">
<f:ajax event="click" execute="calendar" render="out weatherwidget"></f:ajax>
</input>
</h:panelGrid>
</h:form>
</div>
<div class="col-md-4 col-md-offset-4">
<ui:include id="weatherwidget" src="restservice/weatherWidget.xhtml"/>
</div>
<div><h:outputText id="out" value="#{appointmentFormBean.selectedDate}"></h:outputText></div>
'天氣小工具':
<ui:composition>
<h:panelGrid columns="3" class="table table-bordered">
<h:outputText rendered="#{appointmentFormBean.datePickerActivated}">#{forecastBeanTwo.forecast.day}</h:outputText>
</h:panelGrid>
</ui:composition>
預約支持bean的簽名:
種@Named(value = "appointmentFormBean")
@SessionScoped
public class AppointmentFormBean implements Serializable, Observed
負責調用觀察員
public void setSelectedDate(Date selectedDate) {
this.selectedDate = selectedDate;
notifyVGObservers();
setDatePickerActivated(true);
}
@Override
public void notifyVGObservers() {
observers.stream().map((observer1) -> (VGObserver) observer1).forEach((observer) -> {
observer.update(selectedDate);
});
}
的 '觀察員' Bean的簽名和託管財產申報方法:
@ManagedBean
@Dependent
public class WeatherForecastBean implements Serializable, VGObserver
@ManagedProperty(value = "#{appointmentFormBean}")
private AppointmentFormBean formBean;
可觀察的注入點..
//point of IoC
public void setFormBean(AppointmentFormBean formBean) {
this.formBean = formBean;
formBean.registerVGObserver(this);
}
最後,更新方法:
Override
public void update(Date selectedDate) {
/*
get the 15 days from today date object
and check whether the client requested day is not
after it.
*/
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, +15);
if (selectedDate.after(cal.getTime())) {
/*
So, if the selected date is after today+15 days
then we will tell the client that we cannot grab a weathe for him
i.e. DailyForecast = UnavailableForecast.class
*/
setForecast(new UnavailableForecast());
}else{
/*
Now that we know that the selected date is within the range
of available forecasts, we need to extract the requested day
forecast (represented by a Time object)
from the total of 16 available days
*/
java.sql.Date sqlDate = utilToSql(selectedDate);
Time requestedTime = findGoodTime(dwr.getDays(),
(Time t)->sqlDate.toString().equals(t.getDay()));
setForecast(new TimeAdapter(requestedTime));
}
}
這不是一個簡單的問題。正如我所說,完整的代碼在github上可用,但也歡迎您提出任何問題。任何建議都會有很大的幫助。
在HTTP中,用戶必須發送請求才能獲得響應。 – BalusC
謝謝你的回答。我想在用戶點擊ID爲「requestButton」的按鈕時發送部分(異步)請求。 – vasigorc