2012-01-02 33 views
2

Primefaces tabView activeIndexプロパティは常にnullになります。Primefaces tabView activeIndexプロパティは常にnullになります

マイview.jsf:

<h:form> 
<p:growl id="growl" showDetail="true" /> 
<p:tabView > 
<p:ajax event="myForm" listener="#{employeeEdit.onTabChange}" /> 
<p:tab id="basic" title="Login"> 
</p:tab> 
<p:tab id="personal" title="Personal"> 
</p:tab> 
<p:tab id="contact" title="Contact"> 
</p:tab> 
</p:tabView> 

マイedit.jsf:

<h:form prependId="false" > 
<p:tabView id="myid" activeIndex="#{employeeEdit.tabIndex}" > 
<p:tab id="basic" title="Login"> 
</p:tab> 
<p:tab id="personal" title="Personal"> 
</p:tab> 
<p:tab id="contact" title="Contact"> 
</p:tab> 
</p:tabView> 

バッキングBean: EmployeeEdit.java:

@Component("employeeEdit") 
@ViewScoped 
@Repository 
public class EmployeeEdit implements Serializable{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -2784529548783517864L; 
    private EmployeeDTO employeeDTO = new EmployeeDTO(); 
    public static HibernateTemplate hibernateTemplate; 
    private int tabIndex; 

    @Autowired 
    public void setSessionFactory(SessionFactory sessionFactory) 
    { 
     System.out.println("in SessionFactory" +sessionFactory); 
     this.hibernateTemplate = new HibernateTemplate(sessionFactory); 
     System.out.println("in SessionFactory" +hibernateTemplate); 

    } 


    public int onTabChange(TabChangeEvent event) { 

     System.out.println("tab id = " + event.getTab().getId()+event.getTab().getTitle()); 
     if(event.getTab().getId().equals("personal")) 
     { 
      tabIndex =0; 
     } 
     else if(event.getTab().getId().equals("address")) 
     { 
      tabIndex =1; 
     } 
     else 
     { 
      tabIndex =2; 
     } 
     System.out.println("tabIndex = "+tabIndex); 
     return tabIndex; 
    } 



    public void edit() throws IOException 
    { 

     FacesContext.getCurrentInstance().getExternalContext().redirect("/employeeedit.jsf"); 
    } 



    public void cancel() throws IOException 
    { 
     FacesContext.getCurrentInstance().getExternalContext().redirect("/employeelist.jsf"); 
    } 

    public EmployeeDTO getEmployeeDTO() { 
     return employeeDTO; 
    } 

    public void setEmployeeDTO(EmployeeDTO employeeDTO) { 
     this.employeeDTO = employeeDTO; 
    } 

    public int getTabIndex() { 
     return tabIndex; 
    } 

    public void setTabIndex(int tabIndex) { 
     this.tabIndex = tabIndex; 
    } 
} 

しかし、いつものtabIndex = 0を得ます。なぜこれが起こっているのですか? AJAXは正常に動作しています。しかし、ビュー・ページの「編集」ボタンをクリックすると、tabIndexがnullになります。 view.jsfで は、私のコマンドボタンが

<p:commandButton value="Edit" actionListener="#{employeeEdit.edit}" /> 

マイprimefacesバージョンです:上記のGoogle Cloud SQLとprimefaces-3.0.M3

+0

マネージドBean( 'EmployeeEdit')全体を投稿できますか?今はあなたが働いている部分だけを掲載しています。 –

+0

はい、上記に投稿しました。 –

+1

'EmployeeEdit'を' @ SessionScoped'にするとどうなりますか? –

答えて

0
public void edit() throws IOException { 
    FacesContext.getCurrentInstance().getExternalContext().redirect("/employeeedit.jsf"); 
} 

あなたedit方法は、新しいビューにリダイレクトあなたの@ViewScopedマネージド・ビーンEmployeeEditが破棄されたときです。それが再びインスタンス化されるとき(0はJavaでint秒のデフォルト値であるから。)ので、tabIndexは0に初期化され

名前が@ViewScopedを示唆したように、いくつかのPPRにしたいとき、一つのビューのために良いです同じビュー。したがって、他のビューにリダイレクトしたときに破棄されます。

このような場合は、@SessionScopedを使用できます。これは、セッションが終了するまで続きます。

+0

AJAX event = "tabChange"リスナーが動作しています。私がタブを変更しなかったとき、前のタブインデックスが来ています。これは、 '' private int tabIndex; 'は次回' EmployeeEdit.java) 'に0に設定されません。これをどのように解決できますか? –

1

実際には、@SessionScoped beanを使用する必要はないと思います。実際には、このBeanのデータを頻繁に再利用しないと、リソースが大量に消費される可能性があります。

私はあなたの豆@ViewScopedを保ち、<f:param>を利用するべきだと思います。

<p:tabView id="myid" activeIndex="#{param.tabIndex}" > 
    ... 
</p:tabView> 

<p:commandButton value="Edit" action="employeeedit" ajax="false"> 
    <f:param name="tabIndex" value="#{employeeEdit.tabIndex}" /> 
</p:commandButton> 

これはあなたにいくつかのリソースを節約することができ、あなただけのユーザーヨーヨーに編集ページをリダイレクトするedit機能は必要ありません:あなたはこれを試すことができます。

+0

"リダイレクト機能では、同じ編集ページにリダイレクトされているようです。"いいえ、彼は実際には 'view.jsf'から' edit.jsf'にリダイレクトしています。 –

+0

@βнɛƨнǤʋяʋиɢ:私を訂正してくれてありがとう^^。私は自分の答えを更新しました。 –

+0

+1。これは私のものよりよく見えます。 –

関連する問題