Struts下的用户输入错误处理

来源:互联网 发布:oracle sql parallel 编辑:程序博客网 时间:2024/04/30 08:09

  用户的输入错误分为两种:

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 stubActionErrors 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 stubString 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\!


原创粉丝点击