我正在使用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页面上有两个表单。
如果我从struts.xml中删除jsonValidationWorkflowStack拦截器,我的表单将被提交两次。
这是提交后的屏幕截图:
请帮助我解决这个问题。
一个问题中有这么多问题...顺便说一句,我们开始:
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/>
,以遵循DRY。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句