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>
您可能还需要一个。我不确定。
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
@Kitex已将CDI-on-tomcat detials添加到答案中 – kostja 2012-08-08 14:37:40