0

我在 JSF 2.0 中这样做。我已经使用相同的控制器实现了添加和查看页面。我不知道使用相同的控制器是否是最佳做法,是吗?在这个例子中,它对所有添加、编辑、查看使用单个页面,但我有不同的页面。因此,当从查看页面迁移到编辑页面时,我想保留价值,但我不能。如何在同一控制器中的不同页面之间保留价值?输出控制台显示编辑值从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.
    }
}
4

1 回答 1

1

恕我直言,对多个视图使用相同的控制器是可以的,如果它可以防止代码重复并且通过使用单独的视图来提高可用性。

不幸的是,您无法继续使用 View 范围。不过有几种选择。您可以使用新的自定义Conversation 范围,或者回退到Session 范围。两者都有优点和缺点 - 对于对话范围,您必须自己处理范围。使用 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>

您可能还需要一个beans.xml的. 不过我不确定。

于 2012-08-08T13:59:51.873 回答