JSF单一控制器和不同视图,编辑,更新页面

问题描述:

我在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. 
    } 
} 

使用用于多个视图的相同的控制器是行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