Проверка AJAX не выполняется для всех данных формы

Я использую проверку ajax jquery.

https://code.google.com/p/struts2-jquery/wiki/Validation

В моем struts.xml у меня есть

<action name="createChannel" class="channel.ChannelAction" method="createChannel">
<interceptor-ref name="jsonValidationWorkflowStack"/>
<result  name="success">createSuccess.jsp</result>
<result  name="input">createChannel.jsp</result>
</action>

In JSP page i have:

<s:form method="get" action="createChannel" >
<s:textfield name="channelName" label="Channel Name" />
<s:textfield name="channelBand" label="Channel Band"/>
<s:textfield name="vcFrequency" label="Video Carrier Frequency"/>
<s:textfield name="acFrequency" label="Audio Carrier Frequency"/>
<s:select name="chargeType" label="Charge Type" list="{'PrePaid','PostPaid'}"/>
<s:select name="transmissionType" label="Transmission Type" list="{'HD','Standard'}"/>
<s:textfield name="channelCharge" label="Channel Charge"/>
<sj:submit value="Submit" button="true" validate="true" targets="result"  />
</s:form>
<div id="result">Result:</div>

У меня есть канал класса модели с проверкой аннотаций как:

public class Channel {
    private int channelId;
    private String channelName;
    private String channelBand;
    private double vcFrequency;
    private double acFrequency;
    private String chargeType; //PrePaid or PostPaid
    private String transmissionType; //HD or Standard
    private double channelCharge;

    private Set<ChannelPackage> channelPackage;

    public Channel(){
        channelPackage=new HashSet<>();
    }

    public int getChannelId() {
        return channelId;
    }

    public void setChannelId(int channelId) {
        this.channelId = channelId;
    }

    @RequiredStringValidator(trim=true,type=ValidatorType.FIELD,message="Please enter valid channel name")
    public String getChannelName() {
        return channelName;
    }

    public void setChannelName(String channelName) {
        this.channelName = channelName;
    }
    @RequiredStringValidator(trim=true,type=ValidatorType.FIELD,message="Please enter valid channel band")
    public String getChannelBand() {
        return channelBand;
    }

    public void setChannelBand(String channelBand) {
        this.channelBand = channelBand;
    }
    @DoubleRangeFieldValidator(type = ValidatorType.SIMPLE,fieldName = "vcFrequency",minInclusive = "40",maxInclusive = "225",message = "The scale must be between ${minInclusive} and ${maxInclusive} (exclusive)")
    public double getVcFrequency() {
        return vcFrequency;
    }

    public void setVcFrequency(double vcFrequency) {
        this.vcFrequency = vcFrequency;
    }
    @DoubleRangeFieldValidator(type = ValidatorType.SIMPLE,fieldName = "acFrequency",minInclusive = "45",maxInclusive = "230",message = "The scale must be between ${minInclusive} and ${maxInclusive} (exclusive)")
    public double getAcFrequency() {
        return acFrequency;
    }

    public void setAcFrequency(double acFrequency) {
        this.acFrequency = acFrequency;
    }

    public String getChargeType() {
        return chargeType;
    }

    public void setChargeType(String chargeType) {
        this.chargeType = chargeType;
    }


    public String getTransmissionType() {
        return transmissionType;
    }

    public void setTransmissionType(String transmissionType) {
        this.transmissionType = transmissionType;
    }
    @DoubleRangeFieldValidator(type = ValidatorType.SIMPLE,fieldName = "channelCharge",minExclusive = "20.5",maxExclusive = "78.5",message = "The scale must be between ${minExclusive} and ${maxExclusive} (exclusive)")
    public double getChannelCharge() {
        return channelCharge;
    }

    public void setChannelCharge(double channelCharge) {
        this.channelCharge = channelCharge;
    }


    public Set<ChannelPackage> getChannelPackage() {
        return channelPackage;
    }

    public void setChannelPackage(Set<ChannelPackage> channelPackage) {
        this.channelPackage = channelPackage;
    }

    public String toString(){
        return channelId+": "+channelName;
    }

}

Мой класс действий реализует интерфейс, управляемый моделью. Моя проблема:

  • Даже если я отправляю форму с правильными данными, в моей форме отображаются сообщения об ошибках.

  • Наряду с сообщениями об ошибках возвращаемый результат ввода отображается в div результата. Это означает, что у меня есть две формы на странице jsp после нажатия кнопки отправки.

  • Если я удалю перехватчики jsonValidationWorkflowStack из struts.xml, моя форма будет отправлена ​​дважды.

Вот скриншот после отправки:

Пожалуйста, помогите мне понять это правильно.

введите здесь описание изображения


person Madeyedexter    schedule 05.12.2014    source источник


Ответы (1)


Так много вопросов в одном... Кстати, поехали:

<сильный>1. Даже если я отправлю форму с правильными данными, в моей форме будут отображаться сообщения об ошибках.

Это связано с используемым стеком Interceptor:

<interceptor-ref name="jsonValidationWorkflowStack"/>

это определяется как

<interceptor-stack name="jsonValidationWorkflowStack">
    <interceptor-ref name="basicStack"/>
    <interceptor-ref name="validation">
        <param name="excludeMethods">input,back,cancel</param>
    </interceptor-ref>
    <interceptor-ref name="jsonValidation"/>
    <interceptor-ref name="workflow"/>
</interceptor-stack>

и базовый стек

<interceptor-stack name="basicStack">
    <interceptor-ref name="exception"/>
    <interceptor-ref name="servletConfig"/>
    <interceptor-ref name="prepare"/>
    <interceptor-ref name="checkbox"/>
    <interceptor-ref name="params"/>
    <interceptor-ref name="conversionError"/>
</interceptor-stack>

Как видите, здесь нет ModelDriven Interceptor. Если вы хотите продолжать использовать ModelDriven, вам необходимо:

  • добавить ModelDriven Interceptor и
  • убедитесь, что он запускается до Validation Interceptor, иначе параметры, которые вы отправляете, не будут (пока) установлены в модели, когда будет выполняться проверка. Прочитайте этот ответ, чтобы точно понять, что я имею в виду.

Этого должно быть достаточно:

<action name="createChannel" class="channel.ChannelAction" method="createChannel">
    <interceptor-ref name="modelDriven"/>
    <interceptor-ref name="jsonValidationWorkflowStack"/>
    <result  name="success">createSuccess.jsp</result>
    <result  name="input">createChannel.jsp</result>
</action>

<сильный>2. Наряду с сообщениями об ошибках возвращаемый результат ввода отображается в div результата. Это означает, что у меня есть две формы на странице jsp после нажатия кнопки отправки.

Это очевидно, ваш дизайн такой, как он должен автоматически меняться в случае INPUT ? Вам нужно переосмыслить свой дизайн. Например, вы можете настроить таргетинг на форму, в которой находитесь, например:

<div id="result">
    <s:form method="get" action="createChannel" >
        <s:textfield name="channelName" label="Channel Name" />
        <s:textfield name="channelBand" label="Channel Band"/>
        <s:textfield name="vcFrequency" label="Video Carrier Frequency"/>
        <s:textfield name="acFrequency" label="Audio Carrier Frequency"/>
        <s:select name="chargeType" label="Charge Type" list="{'PrePaid','PostPaid'}"/>
        <s:select name="transmissionType" label="Transmission Type" list="{'HD','Standard'}"/>
        <s:textfield name="channelCharge" label="Channel Charge"/>
        <sj:submit value="Submit" button="true" validate="true" targets="result"  />
    </s:form>
</div>

Затем как в случае INPUT, так и в случае SUCCESS вы возвращаете сообщение, форма и поля повторно заполняются. Было бы лучше создать фрагмент JSP для использования на исходной странице с <s:include/>, чтобы следовать DRY.

person Andrea Ligios    schedule 06.12.2014
comment
Да, я сделал. Большое спасибо ... Это сработало! Я включил перехватчик modelDriven - person Madeyedexter; 09.12.2014