我使用Struts2-Bootstrap-Plugin版本2.0.4进行客户端验证。我使用bootstrapValidation作为我的验证函数,并且我已经将jsonValidationWorkflowStack添加到我的struts操作中。对于大多数情况,这可以按预期工作,将我的表单数据发送到服务器并执行我的服务器验证,而无需实际执行完整的帖子。但是,它不适用于文件。如果我在页面上有一个s:文件,那么似乎会被忽略。验证方法执行时,它始终为null。如果我绕过插件的客户端验证,文件将正确提交并进行验证。我错过了什么文件工作?感谢。
我的Struts.xml
<action name="testValidateSave" class="webapp.action.TestValidationAction" method="save" >
<interceptor-ref name="jsonValidationWorkflowStack"/>
<result name="success">/WEB-INF/pages/testValidate.jsp</result>
<result name="error">/WEB-INF/pages/testValidate.jsp</result>
<result name="input">/WEB-INF/pages/testValidate.jsp</result>
</action>
我的JSP页面
<s:form id="testValidationForm" theme="bootstrap" method="post" labelCssClass="col-sm-2 text-semibold" elementCssClass="col-sm-10"
cssClass="form-horizontal" action="testValidateSave" enctype="multipart/form-data">
<div class="panel panel-flat">
<div class="panel-heading">
<h5 class="panel-title text-bold">Testing Client Validation</h5>
<div class="heading-elements">
<sj:submit button="true"
name = "Save"
type="button"
id="saveButton"
formIds="testValidationForm"
targets="bodySection"
iframe="true"
dataType="html"
validate="true"
validateFunction="bootstrapValidation"
cssClass="btn bg-cobalt-400 mr-5 pull-right"
buttonIcon="icon-floppy-disk"
label="Save"
value="Save"
/>
</div>
</div>
<div id="bodySection" class="panel-body">
<s:textfield
id="testText"
name="testText"
label="Test Text"
/>
<s:file
id="testDoc"
label="Test Doc"
name="testDoc"/>
</div>
</div>
</s:form>
我的动作类:
public class TestValidationAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String testText;
private File testDoc;
private String testDocContentType;
private String testDocFileName;
/*****************************************************************
* Action Methods
*****************************************************************/
@SkipValidation
public String execute() {
return SUCCESS;
}
public String save() {
return SUCCESS;
}
public void validate() {
super.validate();
System.out.println(" testText = " + this.testText);
System.out.println(" testDoc = " + this.testDoc );
if (this.testText == null || this.testText.isEmpty()) {
addFieldError("testText", "Required");
}
if (this.testDoc == null) {
addFieldError("testDoc", "Required");
}
}
/*****************************************************************
* Getters and Setters
*****************************************************************/
public String getTestText() {
return this.testText;
}
public void setTestText(String testText) {
this.testText = testText;
}
public File getTestDoc() {
return this.testDoc;
}
public void setTestDoc(File testDoc) {
this.testDoc= testDoc;
}
public String getTestDocFileName() {
return this.testDocFileName;
}
public void setTestDocFileName(String testDocFileName) {
this.testDocFileName= testDocFileName;
}
public String getTestDocContentType() {
return this.testDocContentType;
}
public void setTestDocContentType(String testDocContentType) {
this.testDocContentType= testDocContentType;
}
}
答案 0 :(得分:1)
弄清楚了。我错过了fileUpload拦截器。当然,这还不够,因为只使用了动作中的第一个拦截器,我起初并没有意识到这一点。必须将所有内容组合到包中的新拦截器堆栈中,然后将其分配给操作。
修复问题的Struts.xml的更改:
<package name="testPackage" extends="default,json-default" namespace="/testPackage">
<interceptors>
<interceptor-stack name="completeValidation">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="jsonValidationWorkflowStack"/>
</interceptor-stack>
</interceptors>
<action name="testValidate" class="webapp.action.TestValidationAction">
<result name="success">/WEB-INF/pages/testValidate.jsp</result>
</action>
<action name="testValidateSave" class="webapp.action.TestValidationAction" method="save" >
<interceptor-ref name="completeValidation"/>
<result name="success">/WEB-INF/pages/testValidate.jsp</result>
<result name="error">/WEB-INF/pages/testValidate.jsp</result>
<result name="input">/WEB-INF/pages/testValidate.jsp</result>
</action>
</package
现在一切正常。