一、使用ActionSupport编码实现验证
1、在Action类的业务方法中直接验证
示例代码(JavaBean方式获取数据)
- 用户提交数据页面
<s:form action="error01" method="post">
<s:textfield name="user.uname" id="uname">用户名:</s:textfield>
<p/>
<s:password name="user.pwd" id="pwd">密码:</s:password>
<br/>
<s:submit value="提交"></s:submit>
</s:form>
- action配置
<action name="error01" class="com.pb08.demo01.UserAction">
<result>/jsp/_使用ActionSupport编码实现验证/_在Action类的业务方法中直接验证jsp</result>
<result name="input">/jsp/_使用ActionSupport编码实现验证/_在Action类的业务方法中直接验证jsp</result>
</action>
- action类代码(关键)
、JavaBean代码略
、action类代码
public class UserAction extends ActionSupport {
private User user;
@Override
public String execute() throws Exception {
System.out.println("进入execute方法");
/*验证用户名*/
if(null == user.getUname() || "".equals(user.getUname())) {
System.out.println("用户名不能为空");
this.addFieldError("user.uname", "用户名不能为空(业务方法)");
}
/*验证密码*/
if(null == user.getPwd() || "".equals(user.getPwd())) {
System.out.println("密码不能为空");
this.addFieldError("user.pwd", "密码不能为空(业务方法)");
}
/*完成注册的业务*/
if(!(user.getUname().equals(user.getPwd()))) {
System.out.println("用户名或密码错误");
this.addActionError("用户名或密码错误!");
}
if(this.hasErrors()) {
System.out.println("有hasFieldErrors错误!!!!!");
return INPUT;
}
System.out.println("没错误!!!!!!");
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
- 错误页面代码
<body>
用户名错误显示:<s:fielderror fieldName="user.uname"></s:fielderror>
<hr/>
用户密码错误显示:<s:fielderror fieldName="user.pwd"></s:fielderror>
<hr/>
action错误显示:<s:actionerror/>
</body>
-
总结
关键代码是addFieldError()方法和addActionError()方法,这俩个方法是用来添加错误信息。其中,addFieldError()用来添加与字段相关的错误信息,如用户名错误,addActionError()用来添加于Action所处理的业务相关的错误信息。在页面上,用
标签输出addFieldError()方法添加的错误信息,用<s:fielderror/>
<s:actionerror/>标签输出addActionError()方法添加的错误信息。
2、重写validate()方法实现验证
- 用户输入信息页面
<body>
<s:form action="error02" method="post">
<s:textfield name="userInfo.username" id="uname">用户名:</s:textfield>
<s:password name="userInfo.userpwd" id="pwd">密码:</s:password>
<s:submit value="提交"></s:submit>
</s:form>
</body>
- action配置
<action name="error02" class="com.pb08.demo02.UserAction">
<result>/jsp/08_使用ActionSupport编码实现验证/02_重写validate()方法实现验证01.jsp</result>
<!--使用validate验证必须配置此result-->
<result name="input">/jsp/08_使用ActionSupport编码实现验证/02_重写validate()方法实现验证02.jsp</result>
</action>
- action类代码
、JavaBean代码略
、action类
public class UserAction extends ActionSupport {
private UserInfo userInfo;
@Override
public String execute() throws Exception {
System.out.println("进入execute方法");
/*完成注册的业务*/
if(!(userInfo.getUsername().equals(userInfo.getUserpwd()))) {
this.addActionError("用户名或密码错误!");
}
System.out.println("完成注册的业务...");
if(this.hasErrors()) {
return INPUT;
}
System.out.println("登陆成功");
return SUCCESS;
}
@Override
public void validate() {
System.out.println("进入validate方法");
/*验证用户名*/
if(null == userInfo.getUsername() || "".equals(userInfo.getUsername())) {
System.out.println("用户名不能为空");
this.addFieldError("user.uname", "用户名不能为空!");
}
/*验证密码*/
if(null == userInfo.getUserpwd() || "".equals(userInfo.getUserpwd())) {
System.out.println("密码不能为空");
this.addFieldError("user.pwd", "密码不能为空");
}
}
public UserInfo getUserInfo() {
return userInfo;
}
public void setUserInfo(UserInfo userInfo) {
this.userInfo = userInfo;
}
}
- 错误页面
<body>
<s:fielderror fieldName="user.uname"></s:fielderror>
<s:fielderror fieldName="user.pwd"></s:fielderror>
<s:actionerror />
</body>
-
总结
执行以上代码从控制台输出信息顺序来看,当进入action类后,首先会执行validate方法,如果validate方法没有添加错误,则会执行指定的action业务方法,这里默认是execcute,否则不会执行业务方法,最后还有一点需要注意,每次执行业务方法前,都会先执行一次validate方法。
3、使用validateXxx()方法实现验证
上面总结说了,使用validate()验证时,每次执行业务方法前都会执行validate()方法进行验证,如果只想对某个业务方法进行验证,可以使用validateXxx()方法来验证
- 用户输入数据页面
<body>
<s:form action="error03" method="post">
<s:textfield name="userInfo.uname" id="uname">用户名:</s:textfield>
<s:password name="userInfo.pwd" id="pwd">密码:</s:password>
<s:submit value="提交"></s:submit>
</s:form>
</body>
- action配置
<action name="error03" class="com.pb08.demo03.UserAction" method="register">
<result>/jsp/08_使用ActionSupport编码实现验证/03_使用validate方法实现验证01.jsp</result>
<!--使用validateXxx验证必须配置此result-->
<result name="input">/jsp/08_使用ActionSupport编码实现验证/03_使用validate方法实现验证02.jsp</result>
</action>
- action类代码
public class UserAction extends ActionSupport {
private UserInfo userInfo;
public String register() {
/*完成注册的业务*/
System.out.println("完成注册的业务");
if(!(userInfo.getUname().equals(userInfo.getPwd()))) {
this.addActionError("用户名或密码错误");
}
if(this.hasErrors()) {
return INPUT;
}
return SUCCESS;
}
public void validateRegister() {
System.out.println("validateRegister" + userInfo.getUname() + "|" + userInfo.getPwd());
if(null == userInfo.getUname() || "".equals(userInfo.getUname())) {
System.out.println("用户名不能为空");
this.addFieldError("user.uname", "用户名不能为空");
}
if(null == userInfo.getPwd() || "".equals(userInfo.getPwd())) {
System.out.println("密码不能为空");
this.addFieldError("user.pwd", "密码不能为空");
}
}
public UserInfo getUserInfo() {
return userInfo;
}
public void setUserInfo(UserInfo userInfo) {
this.userInfo = userInfo;
}
}
- 错误页面
<body>
<s:fielderror fieldName="user.uname"></s:fielderror>
<s:fielderror fieldName="user.pwd"></s:fielderror>
<s:actionerror />
</body>
-
总结
执行以上代码可以看出validateXxx()方法的Xxx可以匹配业务方法名,如果业务方法名叫做abc,那么Xxx就是Abc,首字母大写。这样当调用指定名称的业务方法前只会调用与之匹配的validateXxx方法。
二、使用验证框架实现验证
使用验证框架进行验证后期维护无需修改代码,只需要修改配置文件
步骤:
1、编写JSP用户数据输入页面
2、编写Action类及其配置文件
3、在与Action类相同的目录下创建验证文件ActionName-validation.xml,其中ActionName与需要验证的Action类名相同
4、编写验证规则
代码示例:
- action
<action name="house_*" class="com.bc.action.HouseAction" method="{1}">
<result>/WEB-INF/jsp/house.jsp</result>
//必须有input对应的页面
<result name="input">/WEB-INF/jsp/house.jsp</result>
</action>
- action类
//House类略
public class HouseAction extends BaseAction {
private static final long serialVersionUID = L;
private House house;
public String house() throws Exception {
return SUCCESS;
}
public String check() throws Exception {
if("".equals(house.getTitle())) {
return INPUT;
}
return SUCCESS;
}
public House getHouse() {
return house;
}
public void setHouse(House house) {
this.house = house;
}
}
- 验证框架xml代码
xml名称格式:action类名-要验证的action名-validation.xml
<!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="house.title">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>标题不能为空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">4</param>
<param name="maxLength">20</param>
<param name="trim">true</param>
<message>标题必须为4至20个字符</message>
</field-validator>
</field>
<field name="house.content">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>内容不能为空!</message>
</field-validator>
</field>
<field name="house.address">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>地址不能为空!</message>
</field-validator>
</field>
<field name="house.telNum">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>联系方式不能为空!</message>
</field-validator>
</field>
<field name="house.date">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>日期不能为空!</message>
</field-validator>
</field>
</validators>
- 页面
<s:form action="house_check" method="post" namespace="/">
<s:textfield name="house.title" label="标题"/>
<s:textarea name="house.content" label="内容"/>
<s:textfield name="house.address" label="地点"/>
<s:textfield name="house.telNum" label="联系电话"/>
<s:textfield name="house.date" label="发布时间"/>
<s:submit value="提交"/>
</s:form>