Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 JSF单一控制器和不同的查看、编辑、更新页面_Jsf 2_Crud - Fatal编程技术网

Jsf 2 JSF单一控制器和不同的查看、编辑、更新页面

Jsf 2 JSF单一控制器和不同的查看、编辑、更新页面,jsf-2,crud,Jsf 2,Crud,我在JSF2.0中这样做。我已经用同一个控制器实现了添加和查看页面。我不知道使用同一个控制器是否是最好的做法,是吗?和示例中一样,它使用单个页面进行所有添加、编辑和查看,但我有不同的页面。所以,当从查看页面迁移到编辑页面时,我希望保留值,但我不能。如何在同一控制器的不同页面之间保留值?输出控制台显示edit的值从true更改为false,我在editLegendType功能中将其更改为true @ManagedBean @ViewScoped public class LegendControl

我在JSF2.0中这样做。我已经用同一个控制器实现了添加和查看页面。我不知道使用同一个控制器是否是最好的做法,是吗?和示例中一样,它使用单个页面进行所有添加、编辑和查看,但我有不同的页面。所以,当从查看页面迁移到编辑页面时,我希望保留值,但我不能。如何在同一控制器的不同页面之间保留值?输出控制台显示edit的值从true更改为false,我在editLegendType功能中将其更改为true

@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.
    }
}

在多个视图中使用相同的控制器是可以的,前提是它可以防止代码重复,并且使用单独的视图可以提高可用性

很遗憾,您无法继续使用视图范围。不过,有几种选择。您可以使用新的自定义范围,也可以返回到会话范围。两者都有优点和缺点-对于对话范围,你必须自己处理范围。对于会话范围,您可能会在会话中不必要地放置太多数据

因此,如果我必须选择,我宁愿使用会话范围而不是会话范围作为更乏味但更干净的解决方案

编辑:请注意,会话范围不是JSF特性,它来自,这意味着您必须将bean上的注释从@ManagedBean更改为@Named

EDIT2:要在tomcat上使用CDI,您需要将它放在类路径中。如果您使用的是maven,请将其添加到您的
.pom
,otherwide,下载并“手动”使用jar


您可能还需要一个。不过我不确定

导入javax.enterprise.context.Conversation;导入javax.enterprise.context.ConversationScope;导入javax.inject.inject;导入javax.inject.Named;如果我需要做更多的事情,这些软件包不可用。我正在使用tomcat 7。@Kitex已经在tomcat细节上添加了CDI
<dependency>
  <groupId>org.jboss.weld.servlet</groupId>
   <artifactId>weld-servlet</artifactId>
   <version>1.1.9-Final</version>
</dependency>
<listener>
   <listener-class>
      org.jboss.weld.environment.servlet.Listener
   </listener-class>
</listener>