(問題已解決) 我有一個jsf2-spring-hibernate項目,每次點擊按鈕時,bean中的構造函數和postconstruct都被調用,我想要執行的實際點擊偵聽器被忽略。注意bean是sessionscoped(不是請求),可能它應該是viewscoped--但是這會干擾Spring嗎?注2:我嘗試過ViewScoped和相同的結果。沒有調用ajax事件,但jsf2 spring bean在用戶點擊時調用構造函數和postconstruct
該避讓我的問題是,clickListener(下同)不執行
<h:selectOneListbox id="listBox" value="#{ScheduleMB.clients}" size="5"
rendered="#{ScheduleMB.showClients}" >
<f:selectItems value="#{ScheduleMB.clientList}" var="c"
itemLabel="#{c.lastName}" itemValue="#{c.lastName}" />
<f:ajax event="click" listener="#{ScheduleMB.clickListener}"
render="group" />
</h:selectOneListbox>
什麼,我試圖做的是有客戶的名單,當用戶點擊一個按鈕顯示(按鈕未顯示以上,但包括在下面的完整jsf2頁面)。當用戶點擊列表框時,clicklistener被激活,bean處理點擊的值。
2nd編輯 - 我的facelet包含綁定到bean,這似乎是導致bean在viewscope中重建的原因,但不是sessionscope。
編輯 - 我做了一些修改1)我確定我的bean擴展的類是抽象的。這允許ajax代碼工作,但即使在viewcoped時構造函數仍然運行多次,我不確定應該發生。 2)將範圍更改爲會話,其他更改一切正常。
所以我的問題是,爲什麼當ViewScoped的構造函數仍然發射多次?
原題:
以下是完整JSF2頁面(及以下的的javabean)。
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:t="http://myfaces.apache.org/tomahawk">
<h:form>
<h3>TimeOnly</h3>
<t:div style="position: absolute; left: 5px; top: 5px; right: 5px; width: 875px ">
<t:schedule value="#{ScheduleMB.model}" id="schedule1"
binding="#{ScheduleMB.schedule}"
rendered="true" visibleEndHour="18" visibleStartHour="8"
workingEndHour="17" workingStartHour="9" readonly="false"
theme="default" tooltip="true"
submitOnClick="true"
mouseListener="#{ScheduleMB.scheduleClicked}"
action="#{ScheduleMB.scheduleAction}" />
</t:div>
<t:div style="position: absolute; left: 925px; top: 5px; width: 210px; overflow: auto">
<h:panelGrid columns="1">
<t:inputCalendar id="scheduleNavigator"
value="#{ScheduleMB.model.selectedDate}" />
</h:panelGrid>
</t:div>
<t:div style="position: absolute; left: 890px; top: 190px; width: 325px; overflow: auto; font-size: 14px;
text-align: left; height: 270px" >
<h:panelGrid columns="1" rendered="true">
<h:outputLabel>Enter From Date:Time</h:outputLabel>
<t:inputDate popupCalendar="true" type="both" value="#{ScheduleMB.from}"/>
<h:outputLabel>Enter To Date:Time</h:outputLabel>
<t:inputDate popupCalendar="true" type="both" value="#{ScheduleMB.to}"/>
<h:outputLabel for="TitleText" value="Title:"/>
<h:panelGroup id="group">
<h:inputText id="TitleText" value="#{ScheduleMB.title}"/>
<h:commandButton value="Clients" >
<f:ajax event="click" listener="#{ScheduleMB.clientList}"
render="group"/>
</h:commandButton>
<h:selectOneListbox id="listBox" value="#{ScheduleMB.clients}" size="5"
rendered="#{ScheduleMB.showClients}" >
<f:selectItems value="#{ScheduleMB.clientList}" var="c"
itemLabel="#{c.lastName}" itemValue="#{c.lastName}" />
<f:ajax event="click" listener="#{ScheduleMB.clickListener}"
render="group" />
</h:selectOneListbox>
</h:panelGroup>
<h:outputLabel for="DescText" value="Description:"/>
<h:inputText id="DescText" value="#{ScheduleMB.description}"/>
<h:panelGroup>
<h:commandButton
actionListener="#{ScheduleMB.addNewEntry}"
value="Add entry" rendered="#{not ScheduleMB.model.entrySelected}"/>
<h:commandButton
actionListener="#{ScheduleMB.deleteSelectedEntry}"
value="Delete entry"
rendered="#{ScheduleMB.model.entrySelected}"/>
</h:panelGroup>
</h:panelGrid>
</t:div>
</h:form>
</html>
這裏是Sessionscoped豆(我避免了很多不相關的部分):
@ManagedBean(name="ScheduleMB")
@SessionScoped
public class ScheduleMB extends ScheduleBase
implements Serializable
{
Map<String,Object> clientValues = new HashMap<String,Object>();
List<Client> clientValues2 = new ArrayList<Client>();
@ManagedProperty(value="#{UserService}")
IUserService userService;
public ScheduleMB() {
clients="hello"; //I put a breakpoint here just to be sure it was called
}
@PostConstruct
public void init() {
createClientValues();
}
//This part is not executing.
public void clickListener(AjaxBehaviorEvent event){
this.title = clients;
showClients = false;
renderClientList=false;
}
public List<Client> getClientList() {
return clientValues2;
}
private void createClientValues() {
clientValues2 = userService.findAllClients();
}
public void clientList() {
showClients=true;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getClients() {
return clients;
}
public void setClients(String clients) {
this.clients = clients;
}
public boolean isRenderClientList() {
return renderClientList;
}
public void setRenderClientList(boolean renderClientList) {
this.renderClientList = renderClientList;
}
public boolean isShowClients() {
return showClients;
}
public void setShowClients(boolean showClients) {
this.showClients = showClients;
}
public IUserService getUserService() {
return userService;
}
public void setUserService(IUserService userService) {
this.userService = userService;
}
}
您使用的是什麼版本的JSF?查看[ViewScoped bug](http://java.net/jira/browse/JAVASERVERFACES-1492)並更新它是否適用於您 – kolossus