2

小さな CRUD アプリケーションに @ViewScoped Bean を使用しています。編集ページと表示ページがありますが、ボタン (編集) をクリックすると、編集フォームがレンダリングされます。編集フォームが表示された後、保存ボタンまたはキャンセル ボタンは関数を呼び出さず、ページ全体をレンダリングします。actionListener の関数はまったく呼び出されず、すべてが初期化されます。Bean とページに何か問題がありますか?? 私はリッチフェイスとフェイスレットでJSF 2を使用しています。

          //ViewScoped Bean   

            /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package com.legendMgr.Legend;

    import java.io.Serializable;
    import java.sql.SQLException;
    import java.util.List;


    import java.util.logging.Logger;
    import javax.annotation.PostConstruct;

    import javax.faces.application.FacesMessage;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;

import javax.faces.context.FacesContext;

/**
 *
 * @author kitex
 */
@ManagedBean(name = "legendbean")
@ViewScoped
public class LegendController implements Serializable {

    LegendDTO legendDTO;
    String selectedLegend;
    List<LegendDTO> legendDTOs;
    boolean edit;

    public List<LegendDTO> getLegendDTOs() {
        return legendDTOs;
    }

    public void setLegendDTOs(List<LegendDTO> legendDTOs) {
        this.legendDTOs = legendDTOs;
    }

    @PostConstruct
    void initialiseSession() {
        FacesContext.getCurrentInstance().getExternalContext().getSession(true);
    }

    public LegendController() {
        if (!edit) {
            legendDTO = new LegendDTO();
            legendDTO.getList().add(new Legend());
            legendDTOs = getLegends();
        }
    }


    public String getSelectedLegend() {
        return selectedLegend;
    }

    public void setSelectedLegend(String selectedLegend) {
        this.selectedLegend = selectedLegend;
    }

    public boolean isEdit() {
        return edit;
    }

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

    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)) {
            edit = false;
            Logger.getLogger(LegendController.class.getName()).warning("Save Legend Edit" + edit);
        } else {

            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Could Not Save Confim if you have already defined Legend " + legendDTO.getLegendName() + "!"));
        }
        return "";
    }

    public String cancel() {
        edit = false;
        legendDTO = new LegendDTO();
        legendDTO.getList().add(new Legend());
         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 void editLegendType(LegendDTO dto) {
        edit = true;
        Logger.getLogger(LegendController.class.getName()).warning("DTO : " + dto.legendName);
        legendDTO = dto;
        LegendDAO dao = new LegendDAO();
        Logger.getLogger(LegendController.class.getName()).warning("Edit dto set");
        try {
            List<Legend> legends = dao.getDetailForEditLegend(dto.getLegendName());
            if (legends == null || legends.isEmpty()) {
                dto.getList().add(new Legend());
            } else {
                dto.setList(legends);
            }
        } catch (SQLException ex) {
            Logger.getLogger(LegendController.class.getName()).warning("SQL EXception has occoured");
        }
        Logger.getLogger(LegendController.class.getName()).warning("In Edit Legend Function The size of list" + dto.getList().size());

    }
}

//xhtml コード

       <?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:rich="http://richfaces.org/rich"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <ui:composition template="/legendTemplate.xhtml">
            <ui:define name="windowTitle">Change Legend</ui:define>
            <ui:define name="content">


                <h:messages globalOnly="true"/>
                <rich:panel id="firstPanel">
                    <h:form id="nis_viewLegend">
                        <rich:dataTable id="data_tbl" value="#{legendbean.legendDTOs}" var="legendDTOvar" style="width:100%" rendered="#{!legendbean.edit and not empty legendbean.legendDTOs}">
                            <rich:column>
                                <f:facet name="header">
                                    <h:outputText value="Description"/>
                                </f:facet>
                                <h:outputText value="#{legendDTOvar.desc}"/>
                            </rich:column>

                            <rich:column>
                                <f:facet name="header">
                                    <h:outputText value="Legend Type"/>
                                </f:facet>
                                <h:outputText value="#{legendDTOvar.legendName}"/>
                            </rich:column>

                            <rich:column>
                                <f:facet name="header">
                                    <h:outputText value="Legend Type"/>
                                </f:facet>
                                <h:outputText value="#{legendDTOvar.legendFor}"/>
                            </rich:column>

                            <rich:column>

                                <a4j:commandLink value="Delete" actionListener="#{legendbean.deleteLegendType(legendDTOvar)}" render=":firstPanel"/>
                                <h:outputText value="/"/>
                                <a4j:commandLink value="Edit" actionListener="#{legendbean.editLegendType(legendDTOvar)}" render=":secondPanel :editLegendForm :nis_viewLegend"/>

                            </rich:column>

                        </rich:dataTable>
                    </h:form>
                </rich:panel>

                <rich:panel id="secondPanel">
                    <h:form id="editLegendForm" rendered="#{legendbean.edit}">
                        <h:outputText value="Legend Name"/><br/>
                        <h:inputText value="#{legendbean.legendDTO.legendName}"  readonly="true"/><br/>

                        <h:outputText value="Description"/><br/>
                        <h:inputText value="#{legendbean.legendDTO.desc}"/><br/>

                        <h:outputText value="Legend For"/><br/>
                        <h:inputText value="#{legendbean.legendDTO.legendFor}"/><br/>
                        <br/> 
                        <h:outputText value="Range"  />  
                        <rich:dataTable id="editDataPnl" 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>
                                <f:facet name="header">
                                    <h:outputText value="Lower Range"/>
                                </f:facet>
                                <h:inputText value="#{legend.lowerRange}"/>
                            </rich:column>

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

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

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

                        <br/>
                        <center>
                            <a4j:commandButton value="SAVE" action="#{legendbean.saveLegend()}" render=":firstPanel :secondPanel"/>
                            <a4j:commandButton value="CANCEL" action="#{legendbean.cancel()}" render=":firstPanel :secondPanel"/>
                        </center>
                    </h:form>
                </rich:panel>

            </ui:define>

        </ui:composition>
    </h:body>
</html>
4

3 に答える 3

1

たとえば、ViewScopeでは、ビューが作成さform.xhtmlれると、このビューから離れない限り、そのデータは存続します。void同じビューを維持するには、戻りタイプ(通常はプロパティで使用されます)のメソッドを呼び出すactionListenerか、ナビゲーションの結果を返す場合はnullを返す必要があります。

  • メソッド式

あなたの場合、あなたのメソッドは無効ですが、それをアクションリスナーに渡す代わりに、ビューで呼び出しています。

次のように同様のコードを変更してみてください。

<a4j:commandButton value="SAVE" actionListener="#{legendbean.saveLegend()}" render="mainPnl"/>

これに:

<a4j:commandButton value="SAVE" actionListener="#{legendbean.saveLegend}" render="mainPnl"/>

actionListenerプロパティはすでにメソッド式を期待しているため。

  • dataTable内のフォーム

また、dataTable内にフォームがあることに気づきました。フォームには奇妙な動作が発生する可能性がありidます。これは、結果のページで繰り返されるためです。そのためには、フォームをdataTableの外に配置してみてください。

さらに良いことに、ネストされたフォームは無効なHTMLコードであるため、コード全体を囲むフォームを1つだけにすることができます。

legendTemplate.xhtmlネストされたフォームに対しても確認することをお勧めします。

  • 豆の構造

Beanの状態を初期化する@PostContructには、Beanコンストラクターの代わりにメソッドを使用することをお勧めします。

これから変更してみてください:

        public LegendController() {
            legendDTO = new LegendDTO();
            legendDTO.getList().add(new Legend());
        }

これに:

        @PostConstruct
        public void reset() {
            legendDTO = new LegendDTO();
            legendDTO.getList().add(new Legend());
        }

そして、コンストラクターを削除します。

同じビュー(別名.xhtmlページ)にいる限り、Beanデータを保持する必要があります。

お役に立てば幸いです。

于 2012-10-09T10:32:00.417 に答える
0

空の文字列を返す代わりに、関数 saveLegend() および cancel() に対して null を返そうとしましたか?

public String saveLegend() {
     ---------
     return null;
}

public String cancel() {
     ----------
     return null;
}

ajax リクエストの場合、リターンは無効になることもあります。しかし、リッチフェイスがnullを返すことを正しく覚えていれば、唯一の解決策です。試してみる。:) cancel() は、Bean を再初期化するときに機能します。

Bento の回答によると、actionListener を使用して値を渡すことはできません。代わりにアクションを使用してください。

参考文献:

于 2012-10-19T19:16:45.110 に答える