我有一个用于验证jsp中某些字段的操作。如果此操作返回输入,则会添加适当的字段错误。但在纠正字段并重新提交表格后,这不会重新提交;即使所有字段都正确,字段错误仍将保持附加。
图片1:
我已提交带有空Surname字段的表单。添加了适当的字段错误。
图片2:
然后我填写了Surname差距,但错误信息被卡住了,表单不会重新提交。
验证
public String validateForm() {
if (name == null || name.equals("")) {
addFieldError("name", "Name is required!");
return INPUT;
}
if (surname == null || surname.equals("")) {
addFieldError("surname", "Surname is required!");
return INPUT;
}
if (username == null || username.equals("")) {
addFieldError("username", "Username is required!");
return INPUT;
}
if (password == null || password.equals("")) {
addFieldError("password", "Password is required!");
return INPUT;
}
if (!passwordCheck.equals(password)) {
addFieldError("password", "Passwords do not match!");
addFieldError("passwordCheck", "");
return INPUT;
} else {
return SUCCESS;
}
}
struts.xml中:
<package name="actions" namespace="/authenticated/admin" extends="struts-default">
<action name="form">
<result>/authenticated/admin/inputAccountSave.jsp</result>
</action>
<action name="register" class="AccountAction" method="createAccount">
<result name="success">/success.jsp</result>
<result name="input">/authenticated/admin/inputAccountSave.jsp
</result>
</action>
</package>
<package name="validations" extends="struts-default">
<action name="validate" class="AccountAction" method="validateForm">
<result name="success" type="redirectAction">
<param name="actionName">register</param>
<param name="name">${name}</param>
<param name="surname">${surname}</param>
<param name="username">${username}</param>
<param name="password">${password}</param>
<param name="role">${role}</param>
</result>
<result name="input">/authenticated/admin/inputAccountSave.jsp
</result>
</action>
</package>
形式:
<s:form name="register" action="validate" >
<s:textfield name="name" label="Name" />
<s:textfield name="surname" label="Surname" />
<s:textfield name="username" label="Username" />
<s:password name="password" label="Password" />
<s:password name="passwordCheck" label="Confirm password" />
<s:select name="role" label="Role" list="{'MANAGER', 'ADMIN'}"></s:select>
<s:submit />
</s:form>
谢谢
答案 0 :(得分:0)
首先,您不需要从validate返回INPUT,添加fieldError就足以指示 Workflow Interceptor 自动返回INPUT。
其次,你的方法,行为和表格的命名过于复杂,可能会产生误导......试着让事情变得更加简单。
第三:您正在使用Action方法进行验证。这不是它的工作原理。操作方法(默认为execute()
,但它可以是任何内容,并且您将其命名为validateForm()
)必须处理Action的业务,而不是验证。验证由(XML,Annotations或)validate()
方法处理,该方法由验证拦截器调用,并在到达操作之前执行。如果验证失败,则不会执行操作方法,并且请求将被重定向回定义为INPUT的结果。
如果您有兴趣,请阅读the detailed flow上的详情。
然后在你的情况下:
public String validateForm() {
return SUCCESS;
}
public void validate() {
if (name == null || name.equals("")) {
addFieldError("name", "Name is required!");
}
if (surname == null || surname.equals("")) {
addFieldError("surname", "Surname is required!");
}
if (username == null || username.equals("")) {
addFieldError("username", "Username is required!");
}
if (password == null || password.equals("")) {
addFieldError("password", "Password is required!");
}
if (!passwordCheck.equals(password)) {
addFieldError("password", "Passwords do not match!");
addFieldError("passwordCheck", "");
}
}
但为了您自己的安全,请尽快更改这些方法/操作名称:)