0

私はこれをJSF2.0で行っています。同じコントローラーでページの追加と表示を実装しました。同じコントローラーを使用するのがベストプラクティスかどうかわかりませんね。この例のようにすべての追加、編集、表示に1つのページを使用しますが、ページが異なります。したがって、ビューページから編集ページに移行するとき、値を保持したいのですが、できません。同じコントローラー内の異なるページ間で値を保持するにはどうすればよいですか?出力コンソールには、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.
    }
}
4

1 に答える 1

1

コードの重複を防ぎ、別々のビューを使用することで使いやすさが向上する場合は、複数のビューに同じコントローラーを使用することは問題ありません。

残念ながら、View スコープを引き続き使用することはできません。ただし、いくつかの代替手段があります。新しいカスタムConversation スコープを使用するか、 Session スコープにフォールバックすることができます。どちらにも長所と短所があります。会話スコープでは、自分でスコープを処理する必要があります。セッション スコープを使用すると、不必要に多くのデータをセッションに入れる可能性があります。

したがって、どちらかを選択する必要がある場合は、セッション スコープではなく会話スコープを使用する方が、面倒ですが、よりクリーンなソリューションとして使用できます。

編集: 会話スコープは JSF 機能ではなく、 CDIに由来することに注意してください。つまり、Bean の注釈を @ManagedBean から @Named に変更する必要があります。

EDIT2: tomcat で CDI を使用するには、クラスパスに 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 に答える