Primefaces tabView activeIndex属性始终为null

时间:2012-01-02 14:07:36

标签: java google-app-engine jsf-2 primefaces

Primefaces tabView activeIndex属性始终为null。

我的观点.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}" />

我的主要版本是:使用Google Cloud SQL的primefaces-3.0.M3

2 个答案:

答案 0 :(得分:1)

实际上,我认为您可能不需要使用@SessionScoped bean。事实上,如果您不经常重复使用此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功能只是为了将用户重定向到编辑页面。

答案 1 :(得分:0)

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

上面的edit方法,重定向到新视图,即@ViewScoped托管bean EmployeeEdit被销毁时的情况。因此,当它再次被实例化时,tabIndex被初始化为0(因为0是Java中int的默认值。)

顾名思义@ViewScoped适用于一个视图,当想要在同一视图上使用某个PPR时。因此,当您重定向到其他视图时,它会被销毁。

在这种情况下,您可以使用@SessionScoped,只要会话持续,就会持续。