2012-08-08 21 views
0

我在JSF 2.0中這樣做。我用相同的控制器實現了添加和查看頁面。我不知道是否最好使用相同的控制器,是嗎?如在this示例中,它使用單頁進行所有添加,編輯,查看,但我有不同的頁面。所以當從視圖頁面遷移到編輯頁面時,我想保留價值,但我不能。如何保持同一控制器中不同頁面之間的值?輸出控制檯顯示的編輯變化值從真正我改爲true editLegendType功能。JSF單一控制器和不同視圖,編輯,更新頁面

@ManagedBean 
@ViewScoped 
public class LegendController implements Serializable { 

    LegendDTO legendDTO = new LegendDTO(); 
    String selectedLegend; 
boolean edit; 

public LegendController() { 
     Logger.getLogger(LegendController.class.getName()).warning("The size of list" + edit); 
    if (!edit) { 
     legendDTO.getList().add(new Legend()); 
     Logger.getLogger(LegendController.class.getName()).warning("The size of list" + legendDTO.getList().size()); 
    } 
} 


//All function from here is to legend edit 
public String editLegendType(LegendDTO dto) { 
    edit = true; 
    legendDTO = dto; 
     Logger.getLogger(LegendController.class.getName()).warning("The size of list" + edit); 
     return "addLegend";//from view page to addPage for edit. 
    } 
} 

回答

1

使用用於多個視圖的相同的控制器是行IMHO,如果它可以防止重複代碼和實用性通過使用單獨的視圖改善。

不幸的是,您無法繼續使用視圖範圍。但有幾種選擇。您可以使用新的自定義Conversation scope,或回退到會話範圍。兩者都有優點和缺點 - 對話範圍你必須自己做範圍處理。使用Session範圍,您可能會不必要地在會話中放置太多數據。

所以,如果我不得不選擇,我寧願在會話範圍內使用會話範圍作爲更乏味但更乾淨的解決方案。

編輯:請注意,通話範圍不是JSF的功能,它來自CDI,這意味着你將不得不改變對你的bean從@ManagedBean註釋,以@Named

EDIT2:要在tomcat上使用CDI,您需要將它放在類路徑中。如果您正在使用maven,請將其添加到您的.pom,在其他範圍內,下載並使用jar「手動」。

<dependency> 
    <groupId>org.jboss.weld.servlet</groupId> 
    <artifactId>weld-servlet</artifactId> 
    <version>1.1.9-Final</version> 
</dependency> 

此外,你就必須把它添加到您的web.xml

<listener> 
    <listener-class> 
     org.jboss.weld.environment.servlet.Listener 
    </listener-class> 
</listener> 

您可能還需要一個。我不確定。

+0

import javax.enterprise.context.Conversation; import javax.enterprise.context.ConversationScoped; import javax.inject.Inject; import javax.inject.Named;如果我需要做更多的事情,這些軟件包不可用。我正在使用tomcat 7. – kinkajou 2012-08-08 14:23:21

+0

@Kitex已將CDI-on-tomcat detials添加到答案中 – kostja 2012-08-08 14:37:40

相關問題