【问题标题】:Spring onchange submit, form object is nullSpring onchange 提交,表单对象为空
【发布时间】:2013-09-19 14:45:17
【问题描述】:

我在一个带有两个下拉菜单的 portlet 页面中有一个表单;每次用户从第一个菜单中选择一个值时,我都想提交表单,以便我可以填充第二个菜单。真正的提交是在用户单击一个按钮时处理的,该按钮在提交表单之前调用了一个设置区分参数的 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>

AggiungiEnteOrganoBando 控制器中使用这个onSubmitRender 方法:

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*、listaEntilistaEntiOrgani 都正确地从前一个控制器传递给 JSP,并且第一个下拉列表正确填充,而第二个下拉列表正如预期的那样是空的。

这是 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" />

我的问题是,当从InsertEnteOrganoBando 控制器调用formBackingObject 方法时,sessionForm 对象是null,甚至不是一个空表单。

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);
}

这个结构与我在我的 portlet 中用于所有其他页面/控制器/表单/...的结构完全相同,没有问题。我检查了所有名称的拼写错误或不同的情况,一切都很好。

我错过了什么?

PS:我知道 AJAX,但我不能使用它,我正在使用 Java 4、Spring 2、IBM WebSphere 6、Eclipse、IE9,我无法进入 Java 调试模式,仅 JavaScript。

提前致谢

【问题讨论】:

    标签: java javascript spring internet-explorer-9


    【解决方案1】:

    我找到了解决方案。通常,这是我的一个简单错误。

    下拉字段 id_enteid_ente_organo 在我的表单对象中是 Long,但在我的 JSP 中,我输入了一个默认选项,其值为 ""&lt;option value="" label="Seleziona organo"/&gt;

    这在 Spring 中表现不佳,在提交表单时没有像我预期的那样将该字段设置为 null 并且默默地失败了。

    设置默认值 -1 为我完成了这项工作:&lt;option value="-1" label="Seleziona organo"/&gt;

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多