校验:就是在服务端看下表单提交过来的数据是否满足我们的需求,如果不满足,就需要在页面上给出错误的提示信息!那么问题来了,如何将信息传递到jsp页面显示出来呢?校验分为前端校验和后台校验,显然我们讨论的是后台校验。
作为框架的Struts2必然会比较优雅的解决这个问题!
校验步骤:
1、写一个action,继承ActionSupport,重写validate方法
1、写一个action,继承ActionSupport,重写validate方法
2、在validate方法中写验证逻辑
3、在actionsupport中提供了几个方法:
ActionMessages 表单级别的信息
ActionErrors 表单级别的错误
FieldErrors 字段级别的错误
4、如果想要在页面中的输出字段的错误信息,只需要把错误的信息封装在fielderror中
如果想要在页面中的输出表单的错误信息,只需要把错误的信息封装在ActionErrors中
5、this.addActionError("actionerror");和页面上的<s:actionerror/>对应
this.addActionMessage("actionmessage");和页面上的<s:actionmessage/>对应
6、<s:fielderror></s:fielderror>该标签会把后台的所有的错误信息全部输出
7、<s:fielderror fieldName="username"></s:fielderror>只显示指定的name信息的输出路径
8、如果页面上有多个form表单,action中验证的名称:validateXxx(请求的方法的名称为xxx)
3、在actionsupport中提供了几个方法:
ActionMessages 表单级别的信息
ActionErrors 表单级别的错误
FieldErrors 字段级别的错误
4、如果想要在页面中的输出字段的错误信息,只需要把错误的信息封装在fielderror中
如果想要在页面中的输出表单的错误信息,只需要把错误的信息封装在ActionErrors中
5、this.addActionError("actionerror");和页面上的<s:actionerror/>对应
this.addActionMessage("actionmessage");和页面上的<s:actionmessage/>对应
6、<s:fielderror></s:fielderror>该标签会把后台的所有的错误信息全部输出
7、<s:fielderror fieldName="username"></s:fielderror>只显示指定的name信息的输出路径
8、如果页面上有多个form表单,action中验证的名称:validateXxx(请求的方法的名称为xxx)
9、要在result配置input!!!校验失败跳转的页面就是默认的input所制定的内容!!不配置就不知道该跳转到哪里!
<result name= "input">validate.jsp </result>
例子:
1.登陆表单:
<%@
page language="java" import= "java.util.*" pageEncoding="UTF-8" %>
<%@
taglib uri="/struts-tags" prefix= "s"%>
<!
DOCTYPE
HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<
html
>
<head >
</head >
<body >
<!--
<s:fielderror></s:fielderror>
如果在后台把错误放入到 fielderror中,这个标签就可以显示错误(可以显示所有的错误)
<s:fielderror fieldName="username"></s:fielderror>
只能把属性name的值为 username的错误显示出来
-->
<s:form action="/validate/validateAction_testValidate.action" method="post" >
用户名:
<s:textfield name= "username" label ="用户名"></ s:textfield><br />
密码:
<s:textfield name= "password" label ="密码"></ s:textfield><br />
<
s:submit
></s:submit>< br/>
<
s:fielderror
></s:fielderror>
<
s:actionerror
/>
<
s:actionmessage
/>
</s:form >
</body >
</
html
>
|
2.Action:
public
class ValidateAction extends ActionSupport{
private
String username;
private
String password;
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
String testValidate(){
return "success" ;
}
public
String aaa(){
return "success" ;
}
/**
* 第一种方法,针对单表单:重写 valiedate方法,在错误页面用 <s:fielderror></s:fielderror>
*/
public
void validate() {
if(this .username .equals("" )){
this.addActionMessage("aaaa" );//<s:actionmessage/>
this.addActionError("bbb" );//<s:actionerror/>
this.addFieldError( "username", "用户名不能为空" );
}
if(this .password .equals("" )){
this.addFieldError( "password", "密码不能为空" );
}
else if (this.password.length()<6){
this.addFieldError( "password", "密码不能小于6个字符" );
}
}
/**
* 方法二:针对多表单的校验:validateXxx(),其中 xxx为表单处理的方法!
注意:针对某个特定的方法校验时,其他方法的取名不能为要校验方法的子集,否则都会被校验。比如有两个方法,login和doLogin,只想校验doLogin(),但是由于由于doLogin中含有Login这几个字母,所以login也被会校验!为了使得login()不被校验,可以改名为xxlogin()!
*
*/
/* public void validateTestValidate(){
if(this.username.equals("")){
this.addFieldError(" username", "用户名不能为空");
}
if(this.password.equals("")){
this.addFieldError("password", "密码不能为空");
}else if(this.password.length()<6){
this.addFieldError("password", "密码不能小于6个字符");
}
}*/
}
|
3.struts-validate.xml
<
struts
>
<
package
name="validate" namespace="/validate" extends="struts-default" >
<action name= "validateAction_*" method ="{1}" class="cn.itcast.struts2.action.validate.ValidateAction" >
<result name= "input">validate.jsp </result>
<result name= "success">success.jsp </result>
</action>
<action name= "validateXMLAction_*" method ="{1}" class="cn.itcast.struts2.action.validate.ValidateXMLAction" >
<result name="input" >validate_xml.jsp </result>
<result name= "success">success.jsp </result>
</action>
</
package
>
</
struts
>
|
5.效果图