我正在使用Primefaces 3.4.1、Glassfish 3.1.1和Netbeans 7.2。
我有一个calendarAdmin.xhtml页面,其中包含一个 primefaces 时间表。单击计划时间段后,它将弹出一个对话框,询问新的事件信息,例如持续时间和事件名称等。
<h:form id="forminput" prependId="false">
<p:messages autoUpdate="true"/>
<p:growl id="growl" showDetail="true" sticky="false"/>
<p:ajaxStatus>
<f:facet name="start">
<h:graphicImage value="images/loading.gif" />
</f:facet>
<f:facet name="complete">
<h:outputText value="" />
</f:facet>
</p:ajaxStatus>
<h:panelGrid columns="1" style="width: 100%;">
<p:selectOneMenu id="som_room"
value="#{calendarAdmin.selectedroomid}"
effect="fold"
validator="#{calendarAdmin.validateRoom}"
binding="#{calendarAdmin.somRoom}"
style="width:260px">
<p:ajax event="change"
update="@form"/>
<f:selectItem itemLabel="#{bundle.AllRoomsLabel}" itemValue="100"/>
<f:selectItems value="#{calendarAdmin.rooms}" />
</p:selectOneMenu>
<p:schedule value="#{calendarAdmin.lazyEventModel}"
widgetVar="myschedule"
firstHour="6">
<p:ajax event="dateSelect"
listener="#{calendarAdmin.onDateSelect}"
update="newEventDetails"
oncomplete="newEventDialog.show()" />
<p:ajax event="eventSelect"
listener="#{calendarAdmin.onEventSelect}"
update="viewEventDetails"
oncomplete="viewEventDialog.show()" />
</p:schedule>
</h:panelGrid>
<p:dialog widgetVar="newEventDialog" header="#{bundle.AddLabel} #{bundle.EventLabel} #{bundle.NewLabel}?"
showEffect="clip"
hideEffect="clip"
modal="true">
<h:panelGrid id="newEventDetails" columns="3">
<h:outputText value="#{calendarAdmin.startDate}"
style="font-style: italic; font-weight: bold;">
<f:convertDateTime type="date" pattern="EEE, dd MMM, yyyy HH:mm"/>
</h:outputText>
<h:outputText value="#{bundle.UntilLabel}" style="font-weight: bold;"/>
<h:outputText id="endtime" value="#{calendarAdmin.endDate}"
style="font-style: italic; font-weight: bold;">
<f:convertDateTime type="date" pattern="EEE, dd MMM, yyyy HH:mm"/>
</h:outputText>
<h:outputText value=""/>
<h:outputText value=""/>
<h:outputText value=""/>
<h:outputText value="#{bundle.NameLabel} #{bundle.RoomLabel}"/>
<h:outputText value=""/>
<p:selectOneMenu id="som_roomnewevent"
value="#{calendarAdmin.neweventroomid}"
effect="fold"
validator="#{calendarAdmin.validateRoom}"
binding="#{calendarAdmin.somRoomNewEvent}"
style="width:200px;">
<f:selectItems value="#{calendarAdmin.rooms}" />
</p:selectOneMenu>
<h:outputText value="#{bundle.NameLabel} #{bundle.EventLabel}"/>
<h:outputText value=""/>
<p:inputText value="#{calendarAdmin.neweventname}"
required="true"
size="22"/>
<h:outputText value="#{bundle.DurationLabel} (#{bundle.MinuteLabel})"/>
<h:outputText value=""/>
<p:selectOneMenu id="som_newduration"
value="#{calendarAdmin.neweventduration}"
binding="#{calendarAdmin.somNewDuration}"
style="width:200px;">
<p:ajax update="forminput:endtime"
event="change"
listener="#{calendarAdmin.addTime}"/>
<f:selectItem itemLabel="30 Minit" itemValue="30"/>
<f:selectItem itemLabel="1 Jam" itemValue="60"/>
<f:selectItem itemLabel="1 Jam 30 Minit" itemValue="90"/>
<f:selectItem itemLabel="2 Jam" itemValue="120"/>
<f:selectItem itemLabel="2 Jam 30 Minit" itemValue="150"/>
<f:selectItem itemLabel="3 Jam" itemValue="180"/>
<f:selectItem itemLabel="3 Jam 30 Minit" itemValue="210"/>
<f:selectItem itemLabel="4 Jam" itemValue="240"/>
<f:selectItem itemLabel="4 Jam 30 Minit" itemValue="270"/>
<f:selectItem itemLabel="5 Jam" itemValue="300"/>
<f:selectItem itemLabel="5 Jam 30 Minit" itemValue="330"/>
<f:selectItem itemLabel="6 Jam" itemValue="360"/>
<f:selectItem itemLabel="6 Jam 30 Minit" itemValue="390"/>
<f:selectItem itemLabel="7 Jam" itemValue="420"/>
<f:selectItem itemLabel="7 Jam 30 Minit" itemValue="450"/>
<f:selectItem itemLabel="8 Jam" itemValue="480"/>
<f:selectItem itemLabel="8 Jam 30 Minit" itemValue="510"/>
<f:selectItem itemLabel="9 Jam" itemValue="540"/>
<f:selectItem itemLabel="9 Jam 30 Minit" itemValue="570"/>
<f:selectItem itemLabel="10 Jam" itemValue="600"/>
<f:selectItem itemLabel="10 Jam 30 Minit" itemValue="630"/>
</p:selectOneMenu>
<h:panelGroup>
<p:commandButton value="#{bundle.OnLabel}"
action="#{calendarAdmin.addEventEx}"
oncomplete="myschedule.update(); newEventDialog.hide();"
update="growl"/>
<p:commandButton value="#{bundle.OffLabel}"
oncomplete="myschedule.update(); newEventDialog.hide();"/>
</h:panelGroup>
</h:panelGrid>
</p:dialog>
我正在使用LazyScheduleModel使用数据库中的事件填充时间表;这是来自支持 bean calendarAdmin ViewScoped bean 的我的 PostConstruct。
@PostConstruct
public void init() {
try {
LogController.log.info("Initializing viewRoomBookingSchedule bean");
fc = FacesContext.getCurrentInstance();
bundle = fc.getApplication().getResourceBundle(fc, "bundle");
LogController.log.info("Loading room names for the select one box");
wfrooms = wfRoomFacade.selectAll();
LogController.log.info("Putting all other room labels into the select one box");
for (WfRoom wfr : wfrooms) {
rooms.put(wfr.getWfRoomName(), wfr.getIdWfRoom());
}
LogController.log.info("Initialize selected room id to all rooms with value 100");
selectedroomid = 100;
lazyEventModel = new LazyScheduleModel() {
@Override
public void loadEvents(Date start, Date end) {
LogController.log.info("Loading events for room " + selectedroomid + " starting from " + start.toString() + " until " + end.toString());
List<WfRoombookingschedule> wfroombookingschedules = loadSchedules(start, end);
if (wfroombookingschedules != null) {
for (WfRoombookingschedule wfrbs : wfroombookingschedules) {
Date combinedDateAndTime = workflowUtil.getDateTime(wfrbs.getWfRoombookingscheduleDate(), wfrbs.getWfRoombookingscheduleTime());
Date eventEndDate = workflowUtil.addMinutes(combinedDateAndTime, wfrbs.getWfRoombookingscheduleDuration());
String styleClass;
if (wfrbs.getIdWfRoombooking().getIdWfRoom().getIdWfRoom() == applicationConfig.getRoomEdit1()) {
styleClass = "edit1";
} else if (wfrbs.getIdWfRoombooking().getIdWfRoom().getIdWfRoom() == applicationConfig.getRoomEdit2()) {
styleClass = "edit2";
} else if (wfrbs.getIdWfRoombooking().getIdWfRoom().getIdWfRoom() == applicationConfig.getRoomSuaraMalaysia()) {
styleClass = "suaramalaysia";
} else if (wfrbs.getIdWfRoombooking().getIdWfRoom().getIdWfRoom() == applicationConfig.getRoomStudioMusic()) {
styleClass = "studiomusic";
} else if (wfrbs.getIdWfRoombooking().getIdWfRoom().getIdWfRoom() == applicationConfig.getRoomTalkMusic()) {
styleClass = "talkmusic";
} else {
styleClass = "defaultroom";
}
if (wfrbs.getIdWfRoombooking().getIdWfEventtype().getIdWfEventtype() != 2) {
addEvent(new DefaultScheduleEvent(wfrbs.getIdWfRoombooking().getIdWfSpecialevent().getWfSpecialeventName(), combinedDateAndTime, eventEndDate, styleClass));
} else {
addEvent(new DefaultScheduleEvent(wfrbs.getIdWfRoombooking().getIdWfStudiobooking().getWfStudiobookingTitle(), combinedDateAndTime, eventEndDate, styleClass));
}
}
}
}
};
} catch (Exception ex) {
LogController.log.fatal(ex.toString());
}
}
如果用户单击新事件对话框上的“是”按钮,托管 bean 会将他重定向到createEventBooking.xhtml,他将能够在其中修改/确认新事件详细信息,并且他可以单击保存按钮将新事件保存到数据库中。成功持久化到数据库后,支持 bean createEventBooking bean 会将用户重定向回calendarAdmin.xhtml,如下所示:
public String saveEvent() {
try {
......
**return "/calendarAdmin?faces-redirect=true";**
这就是问题发生的时候,它可以回到calendarAdmin.xhtml,但日程是空的,我放在calendarAdmin.xhtml顶部的那个小 ajax 状态 gif 文件一直在无限期地旋转。如果我从 Netbeans 运行按钮中重新运行应用程序,并尝试打开calendarAdmin.xhtml,同样的事情会再次发生。那个 ajax 状态图标无限期地旋转。我尝试用 F5 刷新页面,但仍然是同样的问题。
从 MySQL Workbench 检查时,我看到新事件已成功创建,没有任何问题。但是为什么带有primefaces schedule的页面无法加载包括新创建的事件在内的事件?
我做了进一步的测试,我重新启动了 glassfish 3.1.1 服务器,停止并启动服务器 glassfish,重新运行应用程序,重新打开calendarAdmin.xhtml,然后页面正确打开,包括新创建的事件在内的事件正确加载。