Struts 2 jQuery 表单提交将目标内容嵌套在目标内

Struts 2 jQuery form submission nests target contents inside the target

提问人:karmapolice 提问时间:10/26/2023 最后编辑:Roman Ckarmapolice 更新时间:10/30/2023 访问量:21

问:

我在JSP中有这个形式:

<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
<script>
    migas([
        { enlace: '<a href="#"><s:text name="breadcrumb.tituloFormAlta" /></a>', activo: false },
        { enlace: '<s:text name="breadcrumb.subtituloFormAlta" />', activo: true }
    ]);
</script>
<div id="ventanaAltaAplicacion" class="relative">
    <div class='col-12 tituloSeccion p-2 mt-2 mb-2'>
        <i class="fa-solid fa-square me-2"></i>
        <s:text name="altaAplicacion.tituloFormulario" />
    </div>
    <div class='col-12 p-0 mb-2 border'>
        <s:form id="formAltaAplicacion" name="formAltaAplicacion" cssClass="formulario needs-validation"
                validate="true">

            <div class="titulo p-2">
                <s:text name="altaAplicacion.datosForm" />
            </div>

            <div id="f1" class="border pt-3">

                <div class="row p-0 m-0">
                    <div class="col-6 p-0">
                        <div class="row p-0 m-0 mb-3">
                            <label for="nombreAplicacion" class="col-sm-2 col-form-label ">
                                <s:text name="altaAplicacion.nombre" />
                            </label>
                            <div class="col-sm-10">
                                <s:textfield id="nombreAplicacion" name="altaAplicacionBean.nombre" theme="simple"
                                             cssClass="form-control" cssError="form-control invalid"
                                             placeholder="Nombre de la aplicación" required="true"
                                />
                                <div class="invalid-feedback">
                                    <s:fielderror fieldName="altaAplicacionBean.nombre" />
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="col-6 p-0">
                        <div class="row p-0 m-0 mb-3">
                            <label for="tituloAplicacion" class="col-sm-2 col-form-label ">
                                <s:text name="altaAplicacion.titulo" />
                            </label>
                            <div class="col-sm-10">
                                <s:textfield id="tituloAplicacion" name="altaAplicacionBean.titulo" theme="simple"
                                             cssClass="form-control" cssError="form-control invalid"
                                             placeholder="Título de la aplicación" required="true"/>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="row p-0 m-0">
                    <div class="row p-0 m-0 mb-3">
                        <label for="descripcion" class="col-sm-2 col-form-label">
                            <s:text name="altaAplicacion.descripcion" />
                        </label>
                        <div class="col-sm-10">
                            <s:textarea id="descripcion" name="altaAplicacionBean.descripcion" theme="simple" rows="5" cols="45"
                                        cssClass="form-control" placeholder="Descripción de la aplicación"
                                        required="false"/>
                        </div>
                    </div>
                </div>

                <div class="row p-0 m-0">
                    <div class="row p-0 m-0 mb-3">
                        <label for="wsRespuesta" class="col-sm-2 col-form-label">
                            <s:text name="altaAplicacion.wsRespuesta" />
                        </label>
                        <div class="col-sm-10">
                            <s:textfield id="wsRespuesta" name="altaAplicacionBean.wsRespuesta" theme="simple"
                                         cssClass="form-control" cssError="form-control invalid"
                                         placeholder="%{getText('altaAplicacion.plhRespuesta')}" required="false"/>

                        </div>
                    </div>
                </div>

                <div class="row p-0 m-0">
                    <div class="row p-0 m-0 mb-3">
                        <label for="wsRespuesta" class="col-sm-2 col-form-label">
                            <s:text name="altaAplicacion.wsIntermedio" />
                        </label>
                        <div class="col-sm-10">
                            <s:textfield id="wsIntermedio" name="altaAplicacionBean.wsIntermedio" theme="simple"
                                         cssClass="form-control" cssError="form-control invalid"
                                         placeholder="%{getText('altaAplicacion.plhWsIntermedio')}" required="false"/>
                        </div>
                    </div>
                </div>

                <div class="mb-3 row">
                    <div class="col-12 text-center">
                        <s:url var="guardarAltaAplicacion" action="guardarAltaAplicacion"/>
                        <sj:a
                                id="guardarAltaBoton"
                                formIds="formAltaAplicacion"
                                targets="ventanaAltaAplicacion"
                                button="true"
                                href="%{guardarAltaAplicacion}"
                                onBeforeTopics="onBeforeLoading"
                                onSuccessTopics="onCompleteLoading"
                                onErrorTopics="onErrorLoading"
                                cssClass="btn btn-light"
                        >
                            <s:text name="boton.guardar" />
                        </sj:a>
                    </div>
                </div>

                <s:if test="hasActionMessages()">
                    <div id="resultsId" class="row p-0 m-0">
                        <div class="row p-0 m-0 mb-3">
                            <s:actionmessage />
                        </div>
                    </div>
                </s:if>
            </div>
        </s:form>
    </div>
</div>

相应的操作非常简单,除了设置操作和验证消息外,基本上什么都不做:

@SkipValidation
public String altaAplicacion() {
    return SUCCESS;
}

public String guardarAltaAplicacion() {
    addActionMessage("Alta efectuada correctamente.");
    return SUCCESS;
}

public void validate() {
    if (StringUtils.isBlank(altaAplicacionBean.getNombre())) {
        addFieldError("altaAplicacionBean.nombre", "El nombre es requerido.");
    }
}

这些在 struts.xml 中使用以下方法映射:

    <action name="altaAplicacion"
            class="es.blahblah.action.altaAplicacion.AltaAplicacionAction"
            method="altaAplicacion">
        <result name="success">/jsp/altaAplicacion/altaAplicacion.jsp</result>
        <result name="input">/jsp/altaAplicacion/altaAplicacion.jsp</result>
    </action>

    <action name="guardarAltaAplicacion"
            class="es.blahblah.action.altaAplicacion.AltaAplicacionAction"
            method="guardarAltaAplicacion">
        <result name="success">/jsp/altaAplicacion/altaAplicacion.jsp</result>
        <result name="input">/jsp/altaAplicacion/altaAplicacion.jsp</result>
    </action>

当我单击提交按钮( <sj:a id=“guardarAltaBoton” ...) 时,它工作正常,除了目标 div id=“ventanaAltaAplicacion”入到它自己的位置,所以我们从这里开始:

<div id="ventanaAltaAplicacion" class="relative">
    <div class="col-12 tituloSeccion p-2 mt-2 mb-2">
    <div class="col-12 p-0 mb-2 border">
</div>

对此:

<div id="ventanaAltaAplicacion" class="relative">
    <script>
        migas([
            { enlace: '<a href="#">Menú 1</a>', activo: false },
            { enlace: 'Formulario de Alta nueva aplicación', activo: true }
        ]);
    </script>
    <div id="ventanaAltaAplicacion" class="relative">
        <div class="col-12 tituloSeccion p-2 mt-2 mb-2">
        <div class="col-12 p-0 mb-2 border">
    </div>
</div>

它只发生一次。成功的点击效果很好,并且与嵌套的 div 保持相同的结构,所以这不是一个大问题,但我想了解为什么会发生这种情况。

javascript struts2-jquery struts2-jquery插件

评论

0赞 Roman C 10/28/2023
您应该学习 jQuery Ajax 基础知识。也许这个答案对你有帮助。
0赞 karmapolice 10/30/2023
不知道你的样品和我现在正在做的事情有什么区别。AjaxTest.action 是用 Javascript 编写的吗?
0赞 Roman C 10/30/2023
当然不是,前端是用 Java 编写的。AjaxTest.action 来自 struts2-jquery-plugin 的文档。你在 JavaScript 中所做的是难以辨认的,因为它是在插件工作的引擎盖下。

答: 暂无答案