Проверка 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>
На странице JSP у меня есть:
<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>
У меня есть класс модели Channel с проверкой аннотаций как:
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 Моя форма отправляется дважды.
Вот скриншот после представления:
Пожалуйста, помогите мне сделать это правильно.
1 ответ
Так много вопросов в одном... Кстати, здесь мы идем:
1. Даже если я отправлю форму с правильными данными, моя форма показывает сообщения об ошибках.
Это связано со стеком перехватчиков, который вы используете:
<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>
и basicStack
<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/>
, чтобы следовать СУХОЙ.