用户的输入错误分为两种:
1.前端错误,即用户的输入不符合输入要求的规范,如必需输入4-10个字符,而用户只输入1个字符。
2.逻辑错误,即用户的输入不被该项目所认可,如用户输入错误的账号密码等。
前端错误可以使用JavaScript来发现、纠错。但是Struts提供了更好的机制,使用JavaBean里的Java代码来实现。逻辑错误必须是经过逻辑处理才能发现,Struts里使用Action里的代码来实现。
示例,用一个简单的登陆Form。其中前端错误为:账号、密码输入为空,或者长度小于4或者大于10。逻辑错误为:不允许chenjun登陆。Jsp代码:
<html:form action="/login">
account : <html:text property="account"/><html:errors property="account" bundle="errors"/><br/>
password : <html:password property="password"/><html:errors property="password" bundle="errors"/><br/>
<html:submit/><html:cancel/>
</html:form><hr/>
<html:errors property="blackList" bundle="errors"/>
struts-config.xml里的Action配置,其中input属性的值代表出现前端错误时所跳转的路径,下例中如果前端错误,则返回原来的地址,重新输入:
<!-- input 的值指向前端错误的跳转地址 -->
<action
input="/login.jsp"
name="loginForm"
path="/login"
type="com.zet.struts.action.LoginAction">
</action>
ActionForm里validate函数代码,该函数用于验证前端错误,如果有错,返回ActionErrors对象,该对象是ActionMessage对象(或者ActionError)的集合。每一个ActionMessage对象代表一个错误,其构造函数为ActionMessage(String key [, String arg0 ..])key代表资源文件中的key。arg0代表传入的参数,ActionMessage的Value等于它的key在资源文件中的Value加上传入参数。最后用ActionErrors的add方法将ActionMessage加入到错误集合中,add(String property , ActionMessage message ) 。property代表错误的标识符,与在Jsp中<html:errors>的property属性对应。<html:errors>是通过property属性的值来寻找某个ActionMessage对象,如果有,则输出该ActionMessage的Value,如果没有,则该标签不输出任何内容。
在表单提交给Action之前,会先执行ActionForm里的validate函数,如果该函数返回的ActionErrors为空或者内容为空。再提交给Action处理。否则将ActionErrors保存起来,跳转到struts-config.xml中<action>里input指向的Jsp路径,在该Jsp中通过<html:errors>查找ActionErrors里对应得ActionMessage,将其的value输出。
validate示例代码:
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
// TODO Auto-generated method stub
ActionErrors errors = new ActionErrors();
if(account.length() == 0){
ActionMessage error = new ActionMessage("error.login.null" , "account");
errors.add("account" , error);
}
else if(account.length() >= 10 || account.length() < 4){
ActionMessage error = new ActionMessage("error.login.length" , "account" , "4" , "10");
errors.add("account" , error);
}
if(password.length() == 0){
ActionMessage error = new ActionMessage("error.login.null" , "password");
errors.add("password" , error);
}
else if(password.length() >= 10 || password.length() < 4){
ActionMessage error = new ActionMessage("error.login.length" , "password" , "4" , "10");
errors.add("password" , error);
}
return errors;
}
逻辑错误示例,在Action里的execute函数里进行处理,如果获得的值不合逻辑要求,生成ActionMessages(ActionErrors父类,原理相同)对象,并将其保存在request或者session中,跳转到指定的路径,用<html:errors>显示对应错误(ActionMessage或者ActionError)。
具体execute函数代码:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
String account = loginForm.getAccount();
if(account.equals("chenjun")){
ActionMessages messages = new ActionMessages();
ActionMessage message = new ActionMessage("error.login.blackList" , account);
messages.add("blackList" , message);
//必须保存Messages
//否则会丢失
this.saveErrors(request, messages);
return mapping.getInputForward();
}
return new ActionForward("/successful.jsp");
}
注:该ActionMessages必需保存,否则会丢失!
资源文件:
error.login.null = {0} cann't be null!
error.login.length = {0} of length must between {1} and {2}!
error.login.blackList ={0} is in black list\!