Spring MVC表单taglib有多精确?我的推理是否与特定示例有关

时间:2015-12-04 16:11:31

标签: java spring jsp spring-mvc spring-form

我正在开发一个Spring MVC应用程序,我对如何提交表单有以下疑问:

<form:form action="consultazioneRicercaForm" method="post" modelAttribute="consultazioneFilter" id="ricercaForm">

    <div class="form-group">
        <div class="row">
            <div class="col-md-4">
                <label style="display: block;">Regione:</label>
                    <%-- <form:select path="codiceRegione" id="selReg" class="requiredGroup1 form-control" name="selReg"> --%>
                <form:select path="codiceRegione" id="selReg" class="form-control" name="selReg">
                <form:option value="" label="--SELEZIONARE UNA REGIONE--"/>
                <form:options items="${listaRegioni}" itemLabel="desReg" itemValue="codReg" />
                </form:select>
            </div>

            <div class="col-md-4">
                <label style="display: block;">Provincia:</label>
                <form:select path="codiceProvincia" id="selProv" class="form-control"></form:select>
            </div>

            <div class="col-md-4">
                <label style="display: block;">Codice Meccanografico:</label>
                <form:input path="codiceMeccanografico"  id="selCodMec" class="form-control" name="codMec" minlength="4" />
                <%-- <form:input path="codiceMeccanografico"  id="selCodMec" class="requiredGroup1 form-control" name="codMec" minlength="4" /> --%>
                </div>

            </div>
            <div class="row" style="margin-top: 30px;">
                <div class="col-md-4">
                    <label style="display: block;">Stato Progetto:</label>
                    <form:select path="statoProgetto" id="selStatoProgetto" class="form-control">
                        <form:option value="" label="--STATO PROGETTO--"/>
                        <form:options itemLabel="descrizione" itemValue="codice" items="${listaDescrizioneStatoProgetto}"/>
                    </form:select>
                </div>

                <div class="col-md-4">
                    <label style="display: block;">Gruppo Tipologie Progetto:</label>
                    <form:select path="gruppoTipologie" id="selGruppoTipologie" class="form-control" name="selGruppoTipologie">
                        <form:option value="" label="--GRUPPO TIPOLOGIE--"/>
                        <form:options itemLabel="desTipGru" itemValue="codTipGru"  items="${listaGruppi}"/>
                    </form:select>
                </div>

                <div class="col-md-4">
                    <label style="display: block;">Tipologia Progetto:</label>
                    <%-- <form:select path="tipologiaProgetto"  id="selTipologiaProgetto" class="form-control">
                            <form:option value="" label="--TIPOLOGIA--"/>
                            <form:options itemLabel="descrizione" itemValue="codice" items="${listaDescrizioneTipologiaProgetto}" />
                        </form:select> --%>
                        <form:select path="tipologiaProgetto" id="selTipologiaProgetto" class="form-control">
                        </form:select>
                    </div>
                </div>

                <div class="row" id="dataTrasmissioneDiv" style="margin-top: 30px;">
                    <div class="col-md-4">
                        <label  id="dataTrasmissioneLabel" style="display: block;">Data Trasmissione:</label>
                        <form:select path="dataTrasmissione" id="selDataTrasmissione" class="form-control">
                            <form:option value="" label="--DATA TRASMISSIONE--"/>
                            <form:options itemLabel="descrizione" itemValue="codice"  items="${listaDateTrasmissione}"/>
                        </form:select>
                    </div>
                </div>

                <div class="row" style="margin-top: 30px;">
                    <div class="col-md-12">
                        <input type="button" value="Cerca" class="btn btn-default" onClick="submitConsultazione()" />
                        <input type="button" value="Pulisci filtri" class="btn btn-default" onClick="pulisciFiltriConsultazione()" />
                    </div>
                </div>
            </div>
        </form:form>

如您所见,此表单使用Spring MVC taglib。

在特定情况下,此表单以这种方式声明:

<form:form action="consultazioneRicercaForm" method="post" modelAttribute="consultazioneFilter" id="ricercaForm">

根据我的理解(如果我做错了断言,请纠正我)意味着:

  • action =&#34; consultazioneRicercaForm&#34; :这是我提交表单时调用的资源(所以我需要一个控制器方法来处理对的POST请求consultazioneRicercaForm 资源)。

  • 方法=&#34;发布&#34; :表示该请求是 POST 请求。

  • modelAttribute =&#34; consultazioneFilter&#34; :这是一个模型属性(由控制器在模型中推出,呈现包含前一个表单的页面)存储了表单中插入的值。

因此,这意味着当用户提交表单时,必须从处理 consultazioneRicercaForm 资源的控制器中检索此inynialized模型属性。

我的推理是否正确?

现在我的主要疑问是。正如您所看到的,此表单不是以经典方式提交的,而是有这个按钮:

<input type="button" value="Cerca" class="btn btn-default" onClick="submitConsultazione()" />

单击它时,调用 submitConsultazione() JavaScriot函数,这是代码:

function submitConsultazione() {    
    if($('#ricercaForm').valid()){
    var fd = new FormData();

    var filtro = {
            selReg : $('#selReg').val(),
            selProv : $('#selProv').val(),
            selCodMec : $('#selCodMec').val(),
            selTipologiaProgetto : $('#selTipologiaProgetto').val(),
            selStatoProgetto : $('#selStatoProgetto').val(),
            selDataTrasmissione : $('#selDataTrasmissione').val(),
            selGruppoTipologie : $('#selGruppoTipologie').val(),
        };
        fd.append('filtro', JSON.stringify(filtro));

        $.ajax({
            type : "POST",
            url : "ricericaConsultazione",
            data : fd,
            processData : false,
            contentType : false
        }).done(function(response) {

            // $('#outputRicerca').html(response);
            sostituisciFrammentoJsp('outputRicerca', response);
            showSuccessMessage('Ricerca completata');
        }).error(function(xhr) {
            manageError(xhr);
        });
    }
}

所以基本上这个函数是手动检索在表单字段中插入的值,并将这些值放入一个JSON对象中,该对象将被检索到处理Http POST请求的方法 ricericaConsultazione resource(与前一个表单上action属性定义的资源不同)。

那究竟是什么意思呢?看来他们已经声明了一个使用 form taglib 的Spring表单,但是没有使用表单taglib 功能,而是手动执行表单sumbit。

是真的还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

是。声明Spring表单并手动完成表单提交,这在javascript函数submitConsultazione()中发生。

但是这里有弹簧形式的用法。

  1. 如果你注意到,有一些形式:选择元素,当渲染时将呈现为html选择,其中也包含一些选项。我们可以使用form:options标记来获取项目列表,项目标签和项目值,而不是循环遍历所有值并打印它们。

  2. 模型属性(也称为表单bean)可能包含一些值。因此,要使用我们可以手动执行的那些值填充相应的html表单字段

    <input value="${formBean.stringValueProperty}" >
    

    或通过spring form标签

    <form:input path="stringValueProperty" />
    

    表单标记可以轻松预先填充值。

  3. 使用Spring表单标签及其工作原理:
    Spring表单用于在呈现和处理提交的请求时绑定html字段和表单bean。在渲染html时,必须正确生成表单bean属性名,以便在处理提交的请求时,请求参数正确映射到表单bean属性。

    虽然我觉得Spring表单标签没有按原样使用。不确定此代码作者的要求和意图。