2013-10-04 89 views
0

從本網站上的one of my previous questions我意識到我不知道任何關於自定義轉換器生命週期。我在網上搜索了一下,發現沒有用處。Jsf自定義轉換器生命cyle

我想了解一下,如果自定義轉換器是全部創建的,並在任何時候需要回收它們,或者它們是在運行中創建並銷燬的。

我想他們的主要目的是執行一些簡單輕鬆的任務,因此,如果每次在發送給用戶的jsf頁面中都找到了轉換器的新實例,那麼它們都沒有區別。

但我想使用自定義轉換器來解決它是未鋪砌方式的常見任務。我的自定義轉換會有一個沉重的初始化邏輯,所以我必須確定它的生命週期。必須爲所有人創建一次,而不是每次都需要創建。可能嗎 ?

根據我將收到的答案,我可以放棄使用自定義轉換器的想法或決定將繁重的初始化邏輯移入單數小節中。

回答

1

使用@FacesConverter註釋時,轉換器在您每次引用時都會創建一次。這意味着如果你在那裏執行慢碼,它會給你帶來問題。

或者,您可以將它們註釋爲@ManagedBean,並將其與EL reference代替原始轉換器ID一起使用。如果你想初始化它們以某種方式,你的解決方案將它們設置爲整個應用程序的範圍,使他們熱切地初始化,所以他們會被創建時,應用程序啓動時:

轉換器:

@ManagedBean(eager = true) 
@ApplicationScoped 
public class WorkerConverter implements Converter { 

    public WorkerConverter() { 
     System.out.println("Building converter..."); 
    } 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, 
      String value) { 
     Integer id = Integer.parseInt(value); 
     if (id == 1) { 
      return new Worker(1, "John"); 
     } else { 
      return new Worker(1, "Larry"); 
     } 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, 
      Object value) { 
     return ((Worker) value).getId().toString(); 
    } 

} 

管理的bean:

@ManagedBean 
@ViewScoped 
public class SelectWorkerBean { 

    public static class Worker { 
     Integer id; 
     String name; 

     public Worker(Integer id, String name) { 
      this.id = id; 
      this.name = name; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (this == obj) 
       return true; 
      if (obj == null) 
       return false; 
      if (getClass() != obj.getClass()) 
       return false; 
      Worker other = (Worker) obj; 
      if (id == null) { 
       if (other.id != null) 
        return false; 
      } else if (!id.equals(other.id)) 
       return false; 
      return true; 
     } 

     public Integer getId() { 
      return id; 
     } 

     public String getName() { 
      return name; 
     } 

     @Override 
     public int hashCode() { 
      return id; 
     } 

     @Override 
     public String toString() { 
      return "Worker [name=" + name + "]"; 
     } 

    } 

    private Worker selectedWorker; 

    private List<Worker> workers = Arrays.asList(new Worker(1, "John"), 
      new Worker(2, "Larry")); 

    public Worker getSelectedWorker() { 
     return selectedWorker; 
    } 

    public List<Worker> getWorkers() { 
     return workers; 
    } 

    public void send() { 
     System.out.println(selectedWorker + " selected"); 
    } 

    public void setSelectedWorker(Worker selectedWorker) { 
     this.selectedWorker = selectedWorker; 
    } 

} 

頁:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core"> 
<h:head> 
    <title>Test page</title> 
</h:head> 
<h:body> 
    <h:form> 
     <h:selectOneMenu value="#{selectWorkerBean.selectedWorker}" 
      converter="#{workerConverter}"> 
      <f:selectItems value="#{selectWorkerBean.workers}" var="worker" 
       itemLabel="#{worker.name}" /> 
     </h:selectOneMenu> 
     <h:commandButton value="send" action="#{selectWorkerBean.send}" /> 
    </h:form> 
</h:body> 
</html>