1

ポートレット ページに 2 つのドロップダウン メニューがあるフォームがあります。ユーザーが最初のメニューから値を選択するたびにフォームを送信して、2 番目のメニューに入力できるようにしたいと思います。実際の送信は、ユーザーがフォームを送信する前に識別パラメーターを設定する JavaScript を呼び出すボタンをクリックしたときに処理されます。

これは、JSP inserisciOrganoEnteBandoに正常にリダイレクトされるページのアクション Beanです。

<bean id="aggiungiEnteOrganoBando" class="it.milano.comune.pi.nomine.service.AggiungiEnteOrganoBando">
        <property name="sessionForm" value="true" />
        <property name="commandName" value="aggiungiEnteOrganoBandoForm" />
        <property name="commandClass" value="it.milano.comune.pi.nomine.backoffice.model.AggiungiEnteOrganoBandoForm" />
        <property name="formView" value="gestisciOrganiEntiBando" />
        <property name="successView" value="inserisciOrganoEnteBando" />
        <property name="entiOrganiDao" ref="entiOrganiDao" />
        <property name="entiDao" ref="entiDao" />
</bean>

コントローラーでこのonSubmitRenderメソッドを使用します。AggiungiEnteOrganoBando

protected ModelAndView onSubmitRender(RenderRequest request, RenderResponse response, Object obj, BindException exceptions)
    throws Exception {
        PortletSession session = request.getPortletSession();
        Map results = (Map) session.getAttribute("results");
        ModelAndView mav = new ModelAndView(getSuccessView(), "results", results);
        Map listaEnti= (Map)results.get("listaEnti");
        mav.addObject("listaEnti", listaEnti);
        return mav;
}

これは、JSP inserisciOrganoEnteBandoのフォームです。

<form id="insertEnteOrganoBandoForm" name="insertEnteOrganoBandoForm" method="POST" class="form-search"
    action='<portlet:actionURL>
    <portlet:param name="action" value="insertEnteOrganoBando" />
    </portlet:actionURL>'
    >
    <label for="id_ente">Ente</label>
            <select id="id_ente" name="id_ente" onchange="realSubmit('KO')">
                <option value="" label="Seleziona ente"/>
                <c:forEach var="lie" items="${listaEnti}">
                    <option value="<c:out value="${lie.key}"/>" label="<c:out value="${lie.value}"/>" />
                </c:forEach>
            </select><br>
    <label for="id_ente_organo">Organo</label>
            <select id="id_ente_organo" name="id_ente_organo">
                <option value="" label="Seleziona organo"/>
                <c:forEach var="leo" items="${listaEntiOrgani}">
                    <option value="<c:out value="${leo.key}"/>" label="<c:out value="${leo.value}"/>" />
                </c:forEach>
            </select><br>
    <label for="descrizione">Descrizione</label>
        <textarea id="descrizione" name="descrizione"></textarea><br>
    <input type="hidden" id="tipoSubmit" name="tipoSubmit"/>
    <input type="hidden" id="id_bando" name="id_bando" value="<%= id_bando %>"/>
    <input type="button" id="confirmInsertEnteOrganoBando" name="confirmInsertEnteOrganoBando" class="wpsButtonText btn" value="Aggiungi"
    onclick="realSubmit('OK')"/>
</form>

変数 *id_bando*、listaEnti、およびlistaEntiOrganiはすべて、前のコントローラーから JSP に正しく渡され、最初のドロップダウンは正しく取り込まれますが、2 番目のドロップダウンは予想どおり空です。

これはJavaScriptです:

<script type="text/javascript">
var realSubmit = function(stato){
    $("#tipoSubmit").val(stato);
    document.forms["insertEnteOrganoBandoForm"].submit();
};
</script>

この変数を使用してtipoSubmit、ユーザーが本当にフォームを送信しているのか、それとも最初のドロップダウン メニューから要素を選択しただけなのかを確認します。

これはフォームオブジェクトです:

public class InsertEnteOrganoBandoForm {

    private Long id_ente;
    private Long id_ente_organo;
    private String descrizione;
    private String tipoSubmit;
    private Long id_bando;

    public Long getId_ente() {
        return id_ente;
    }
    public void setId_ente(Long id_ente) {
        this.id_ente = id_ente;
    }
    public Long getId_ente_organo() {
        return id_ente_organo;
    }
    public void setId_ente_organo(Long id_ente_organo) {
        this.id_ente_organo = id_ente_organo;
    }
    public String getDescrizione() {
        return descrizione;
    }
    public void setDescrizione(String descrizione) {
        this.descrizione = descrizione;
    }
    public String getTipoSubmit() {
        return tipoSubmit;
    }
    public void setTipoSubmit(String tipoSubmit) {
        this.tipoSubmit = tipoSubmit;
    }
    public Long getId_bando() {
        return id_bando;
    }
    public void setId_bando(Long id_bando) {
        this.id_bando = id_bando;
    }
}

これはアクション Bean です。

<bean id="insertEnteOrganoBando" class="it.milano.comune.pi.nomine.service.InsertEnteOrganoBando">
        <property name="sessionForm" value="true" />
        <property name="commandName" value="insertEnteOrganoBandoForm" />
        <property name="commandClass" value="it.milano.comune.pi.nomine.backoffice.model.InsertEnteOrganoBandoForm" />
        <property name="formView" value="inserisciOrganoEnteBando" />
        <property name="successView" value="inserisciOrganoEnteBando" />
        <property name="bandiEntiOrganiDao" ref="bandiEntiOrganiDao" />
        <property name="entiOrganiDao" ref="entiOrganiDao" />
        <!-- <property name="validator" ref="insertEnteOrganoBandoValidator" />-->
</bean>

バリデーターは一時的に無効になり、DAO は正しく初期化されて挿入され、Bean は次のようにマップされます。

<entry key="insertEnteOrganoBando" value-ref="insertEnteOrganoBando" />

私の問題は、コントローラーformBackingObjectからメソッドが呼び出されると、オブジェクトが空のフォームでさえないことです。InsertEnteOrganoBandosessionFormnull

protected Object formBackingObject(PortletRequest request) throws Exception {
    PortletSession session = request.getPortletSession();
    InsertEnteOrganoBandoForm sessionForm = (InsertEnteOrganoBandoForm) session.getAttribute("InsertEnteOrganoBandoForm");
    if (sessionForm != null)return sessionForm;
    return super.formBackingObject(request);
}

この構造は、ポートレット内の他のすべてのページ/コントローラー/フォームなどで使用したものとまったく同じです。問題はありません。すべての名前のスペルミスや別のケースを確認しましたが、すべて問題ありません。

私は何が欠けていますか?

PS: AJAX については知っていますが、使用できません。Java 4、Spring 2、IBM WebSphere 6、Eclipse、IE9 を使用しており、Java デバッグ モードでは実行できず、JavaScript のみです。

前もって感謝します

4

1 に答える 1

1

解決策を見つけました。よくあることですが、それは私の側の単純な間違いでした。

ドロップダウン フィールドid_enteid_ente_organoは私のフォーム オブジェクトでは Long ですが、私の JSP では値"",のデフォルト オプションを入れていました<option value="" label="Seleziona organo"/>

nullこれは、フォームの送信時にそのフィールドが期待どおりに設定されず、静かに失敗した Spring ではうまく機能しませんでした。

デフォルト値を -1 に設定すると、うまくいきました。<option value="-1" label="Seleziona organo"/>

于 2013-09-20T10:22:20.693 に答える