0

我有 2 个 jsf 页面,每个页面都有一个托管 bean。我正在从第二页导航到第一页,并且想要销毁其中的实体对象。我的问题是,在我将其设置为 null 之后,它仍然会进入getDetails创建新实体的方法。

getDetails退出此页面时如何防止它进入该方法?我怎样才能正确地摧毁这个实体?我做错了吗?

这是我的代码:

public class page2MB {

@EJB
private page2SessionBean page2SessionBean;
private Page2 page2;

public page2MB() {
}

public Page2 getDetails()
{
    if(page2 == null)
    {
        Map requestParams = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();   
        page2 = new Page2();  
        page2.setPage2PK(new Page2PK(Short.parseShort((String)requestParams.get("param1")),
                                          Short.parseShort((String)requestParams.get("param2"))));            

        page2 = page2SessionBean.find(page2);    
    }        
    return page2;
}

public String exit() 
{       
    try
    {
        page2 = null;
        return "page1";
    }
    catch(Exception exp)
    {                      
        exp.printStackTrace();
        return "";
    } 
    finally
    {

    }
}    
}

page2.xhtml:

<f:view>
       <h:form>                              
            <h:panelGrid columns="2">                
                <h:inputText id="page2PKfield1" value="#{page2MB.details.page2PK.field1}"/>                                                                   
                <h:inputText id="page1MBfield1" value="#{page1MB.details.field1}"/>                                                   
                <h:inputText id="page2MBfield2" value="#{page2MB.details.page2PK.field2}"/>                                            
                <h:inputText id="field2Desc" value="#{page2MB.details.field2Desc}"/>                    
            </h:panelGrid>                                
            <h:commandButton id="exit"   value="יציאה" action="#{page2MB.exit}" immediate="true"></h:commandButton>                                     
        </h:form>
    </f:view>

提前致谢。

4

1 回答 1

2

因为它必须是会话范围的。我在此页面上有更多需要处于会话范围模式的操作。

不要在尽可能广泛的范围内将属于不同范围的数据混合在单个 bean 中。在不同的范围内创建单独的 bean,这些 bean 适合 bean 保存的数据,并使用@ManagedProperty.

@ManagedBean
@SessionScoped
public class SessionBean {

    private Object sessionData;

    // ...
}
@ManagedBean
@ViewScoped
public class ViewBean {

    @ManagedProperty("#{sessionBean}")
    private SessionBean sessionBean;

    private Object viewData;

    // ...
}

也不要在吸气剂中做生意。而是在@PostConstruct方法中进行。

也可以看看:

于 2012-07-31T12:15:28.490 回答