2012-09-06 55 views
0

(問題已解決) 我有一個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; 
} 
} 

回答

0

想通了什麼問題是,如何解決它。原來的症狀是,我的f:ajax點擊事件沒有激發關聯的bean方法,並且儘管使用了viewcoped,但每個交互都構造了bean。我仔細檢查了這個bean並注意到它的父類不是抽象的,並且有一個不一致的範圍。我取消了範圍,並將其抽象化。我還將主bean的作用域更改爲會話,因爲facelet綁定到bean,這也會導致在viewscoped下每次交互都會調用構造函數。問題解決了。

+0

您使用的是什麼版本的JSF?查看[ViewScoped bug](http://java.net/jira/browse/JAVASERVERFACES-1492)並更新它是否適用於您 – kolossus

相關問題