struts会自动将错误的信息返回给表单的上方,并且会自动将表单中部分的信息回显到以前的页面。然而传统的HTML不会提供这一功能
注意这里面的错误提示,必须使用struts自定义的标签库,才会有上面的效果
默认的错误提示是黑色的英文字体,如果想将错误提示信息变成红色,只需要在需要回显的jsp页面的head标签里面加上一个<s:head></s:head>标签即可
如果想将默认的英文提示转化为自己想提示的中文字符,只需要在放置模型的包下面添加一个配置文件
格式:模型名.properties
并且其内容为invalid.fieldvalue.需要判断的字段名=想要的提示语句(如果出现中文乱码,只需要根据实际情况调整文件字符集编码格式即可)
在表单的某一字段前面提示为必填项,只需要在struts对应的标签后面添加上如下的属性
<s:textfield name="username" label="用户名" requiredLabel="true" requiredPosition="left"></s:textfield>
这里面的requiredLabel表示是否显示必填提示,requiredPosition表示显示必填提示的位置是在label的左边还是右边
效果如下
如果想要password在发生错误后回显,只需要在其标签内部加上下面这一属性,这样在表单发生错误的时候,回显页面时password字段仍然存在
<s:password name="password" label="密码" showPassword="true" requiredLabel="true" requiredPosition="left"></s:password>
<s:password name="repassword" label="确认密码" showPassword="true" requiredLabel="true" requiredPosition="left"></s:password>
下面进入正题:表单的数据验证方式(struts)
1. 服务端Action验证:
(1)重写action的validate方法 :全局,对所有的访问这个action的action都成立
前提:此action必须继承ActionSupport,因为在执行所有的action方法之前会调用这个validate方法,如果数据不对,可以往FieldError添加字段错误信息,比如下面这个action
package action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import module.User;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.interceptor.validation.SkipValidation;
import service.UserService;
import service.impl.UserServiceImpl;
public class RegisterAction extends ActionSupport implements ModelDriven<User> {
private User user=new User();
@Override
public User getModel() {
return user;
}
@Override
public void validate() {
if (StringUtils.isEmpty(user.getUsername())){
addFieldError("username","用户名不能为空!");
}
}
//@SkipValidation
public String login(){
/**
* struts2在使用模型驱动注入参数时,会自动类型转化
* servlet接受到表单的参数都是字符串类型的
* struts2会把string类型转化为date和布尔类型
* 如果是checkbox的表单会以逗号+空格的形式拼接成字符串
*/
System.out.println(user);
//调用业务方法
UserService userService=new UserServiceImpl();
//userService.register(user);
return NONE;
}
public String add(){
System.out.println(user);
return NONE;
}
}
模型User如下:
package module;
import java.util.Date;
public class User {
private String username;
private String password;
private Date birthday;
private String hobby;
private boolean married;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", birthday=" + birthday +
", hobby='" + hobby + '\'' +
", married=" + married +
'}';
}
}
上面判断username是否为空,如果为空,在FieldError域里面添加一个错误信息 “用户名不为空”
注意:
1. 这里面的addFieldError(fieldName,errorMessage)方法中,参数1为jsp页面中对应struts标签的name属性值
2. validate()方法对于action来说是全局的,也就是说action的所有方法都可以调用,也就是说调用其他方法之前都会先执行这个方法,如果一旦出现错误就不往下走
3. 如果不希望某一方法执行validate方法,仅仅需要在这个方法上面加上一个注解
@SkipValidation
(2)定义一个方法,名字为validate+想要验证的方法名(第一个字母大写):局部:仅仅对名字中的这个方法成立
只针对某一方法生效,并不是全局的,比如validateRegister(){},仅仅对register()方法进行判断
2. xml声明式验证
(1)在action包中声明一个ActionName-validation.xml文件
这种方法是全局配置,所有访问这个action的action都会被拦截
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="fieldName">username</param>
<message>用户名不能为空</message>
</field-validator>
</field>
<validator type="requiredstring">
<param name="fieldName">password</param>
<message>密码不能为空</message>
</validator>
</validators>
(2)在action包中声明一个ActionName-actionName-validation.xml
action文件
HobbyAction
package action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import module.Hobby;
import module.User;
import service.UserService;
import service.impl.UserServiceImpl;
public class HobbyAction extends ActionSupport implements ModelDriven<Hobby> {
private Hobby hobby=new Hobby();
@Override
public Hobby getModel() {
return hobby;
}
public String add(){
System.out.println(hobby);
return NONE;
}
}
struts.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="p1" extends="struts-default" namespace="/user">
<action name="register" class="action.RegisterAction" method="login">
<result name="input">/register2.jsp</result>
</action>
</package>
<package name="p2" extends="struts-default" namespace="/hobby">
<action name="hobby" class="action.HobbyAction" method="add">
<result name="input">/hobby.jsp</result>
</action>
</package>
</struts>
命名xml文件为
HobbyAction-hobby-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<!-- 1. 用户名不能为空-->
<validator type="requiredstring">
<param name="fieldName">username</param>
<message>用户名不能为空</message>
</validator>
<!-- 2. 年龄应该是18-100-->
<validator type="int">
<param name="fieldName">age</param>
<param name="min">18</param>
<param name="max">100</param>
<message>年龄应该为18-100</message>
</validator>
<!-- 3. 邮箱格式应该正确,并且不为空-->
<validator type="email">
<param name="fieldName">email</param>
<message>邮箱应该写正确格式</message>
</validator>
<validator type="requiredstring">
<param name="fieldName">email</param>
<message>邮箱应该不为空</message>
</validator>
<!-- 4. 密码格式应该正确,不能为空,且应该3-8个字符-->
<validator type="stringlength">
<param name="fieldName">password</param>
<param name="minLength">3</param>
<param name="maxLength">8</param>
<message>密码为3-8个字符</message>
</validator>
<validator type="requiredstring">
<param name="fieldName">password</param>
<message>密码不能为空</message>
</validator>
<validator type="expression">
<param name="expression">
<![CDATA[ password == repassword]]>
</param>
<message>确认密码应该和原密码一致</message>
</validator>
<validator type="url">
<param name="fieldName">url</param>
<message>个人主页默认以http://开头</message>
</validator>
<validator type="required">
<param name="fieldName">gender</param>
<message>性别为必填项</message>
</validator>
</validators>