4

リストを持つDTOがあります。ユーザーが追加ボタンをクリックしたときに、データテーブルに新しい行を追加したい。しかし、クリックするとdto ieコンストラクターが呼び出され、値が初期化され、リストサイズは0になります。Beanは会話スコープです。会話スコープ Bean を使用しているときに、同じビューの会話を開始および終了する必要がありますか? 編集に同じ Bean を使用していますが、うまく機能しています。richfaces 4 と jsf 2 と ajax を使用しているときに初期化の問題を解決する方法。

意見:

                    <rich:panel id ="dataPnl">
                        <rich:dataTable value="#{legendbean.legendDTO.list}" var="legend" style="width:100%">

                            <rich:column>
                                <f:facet name="header">
                                    <h:outputText value="SN"/>
                                </f:facet>
                                <h:inputText value="#{legend.sn}"/>
                            </rich:column>

                            <rich:column>
                                <f:facet name="header">
                                    <h:outputText value="Description"/>
                                </f:facet>
                                <h:inputText value="#{legend.desc}"/>
                            </rich:column>


                            <rich:column>
                                <a4j:commandLink value="Add" actionListener="#{legendbean.addLegendRange()}" render="nisForm:dataPnl"/>
                                <h:outputText value=" / "/>
                                <a4j:commandLink value="Remove" actionListener="#{legendbean.removeLegendRange(legend)}" render="nisForm:dataPnl"/>
                            </rich:column>

                        </rich:dataTable>
                    </rich:panel>                 

豆 :

@Named("legendbean")
@ConversationScoped
public class LegendController implements Serializable {

    LegendDTO legendDTO = new LegendDTO();
    String selectedLegend;
    boolean edit;
    @Inject
    private Conversation conversation;

    public boolean isEdit() {
        return edit;
    }

    public void setEdit(boolean edit) {
        this.edit = edit;
    }

    public LegendController() {
        Logger.getLogger(LegendController.class.getName()).warning("The value of Edit is : " + edit);
        if (!edit) {
            legendDTO.getList().add(new Legend());
            Logger.getLogger(LegendController.class.getName()).warning("The size of list" + legendDTO.getList().size());
        }
    }

    public LegendDTO getLegendDTO() {
        return legendDTO;
    }

    public void setLegendDTO(LegendDTO legendDTO) {
        this.legendDTO = legendDTO;
    }

    public void addLegendRange() {
        Logger.getLogger(LegendController.class.getName()).warning("List Size " + legendDTO.getList().size());
        legendDTO.getList().add(new Legend());
        Logger.getLogger(LegendController.class.getName()).warning("List Size " + legendDTO.getList().size());
    }

    public void removeLegendRange(Legend legend) {
        if (legendDTO.getList().size() != 1) {
            legendDTO.getList().remove(legend);
        }
    }

    public String saveLegend() {
        Logger.getLogger(LegendController.class.getName()).warning("Save Legend Edit" + edit);
        LegendDAO dao = new LegendDAO();
        if (dao.addLegend(legendDTO, edit)) {
            if (edit) {
                conversation.end();
                edit = false;
                Logger.getLogger(LegendController.class.getName()).warning("Save Legend Edit" + edit);
                return "VIEWLEGEND";
            } else {
                legendDTO = new LegendDTO();
                legendDTO.getList().add(new Legend());              
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Saved !"));
                return "";
            }
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Could Not Save Confim if you have already defined Legend " + legendDTO.getLegendName() + "!"));
            return "";
        }
    }

    public List<LegendDTO> getLegends() {
        LegendDAO dao = new LegendDAO();
        return dao.getLegendDTO();
    }

    //All function from here are for legend  delete
    public void deleteLegendType(LegendDTO dto) {
        LegendDAO dao = new LegendDAO();
        if (dao.deleteLegendType(dto.getLegendName())) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Deleted !"));
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Deleted Error !"));
        }
    }

    //All function from here is to legend edit
    public String editLegendType(LegendDTO dto) {
        conversation.begin();
        edit = true;
        legendDTO = dto;
        LegendDAO dao = new LegendDAO();
        dto.getList().clear();
        try {
            List<Legend> legends = dao.getDetailForEditLegend(dto.getLegendName());
            dto.setList(legends);
        } catch (SQLException ex) {
            Logger.getLogger(LegendController.class.getName()).warning("SQL EXception has occoured");
        }
        Logger.getLogger(LegendController.class.getName()).warning("The size of list" + dto.getList().size());
        return "addLegend";
    }

    public String cancel() {
        conversation.end();
        return "VIEWLEGEND";
    }
}
4

2 に答える 2

2

CDI / Seamアノテーションの使用に制限されていない場合は@ManagedBean(name="legendbean")javax.faces.bean.ManagedBeanパッケージから使用するBeanを変更してから、@ViewScopedクラスでアノテーションを使用して、ユーザーが同じページにいる限り、使用することを保証できます。管理対象Beanの同じインスタンス。セットアップで他に何も変更する必要はありません。すべて@Injectが通常どおり機能します。バッキングを初期化するlegendDTO.listには、ViewScoped JSF Beanのメソッドに@PostConstructJSFアノテーションを付け、そこにリストポピュレーションロジックを配置します。リストを空に再初期化することなく、リストに安全に追加/削除できます。ただし、このリストへの変更をデータベースにコミットすることを忘れないでください。

安全な方法として、ユーザーがデータベースから何かを削除したいことを確認できるポップアップを表示することをお勧めします。乾杯

于 2012-09-11T01:13:14.507 に答える
2

はい、会話 (および会話スコープ Bean) が複数の要求にまたがるようにするには、長時間の会話を開始する必要があります。そうしないと、JSF リクエストの最後で会話が強制終了されます (会話はデフォルトで一時的なものです。 ConversationScoped javadocを参照してください)。

また、あなたのような場合の一般的な解決策は、ViewScoped Bean を使用することですが、アノテーションは JSF2 固有であり、CDI には表示されません (CDI に移植するか、seam-faces モジュールを使用できます。詳細: http://www. verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/ )。

于 2012-09-10T20:40:48.957 に答える