0

2 つの jsf ページがあり、それぞれにマネージド Bean があります。2 番目のページから最初のページに移動し、その中のエンティティ オブジェクトを破棄したいと考えています。私の問題は、それを 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をもう一方の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 に答える