On 12/18/05, Josh McDonald <[EMAIL PROTECTED]> wrote:
>
> What's the best place to put input validation and possible repair?



I actually prefer to do the validation checks in my DispatchAction. The
reason being is that, inevitably, you'll end up with a case where you'll
have some Lists you'll want to populate on your input JSP that are setup
before you get to the JSP and if validation fails and you use the struts
built in approach calling validate="true" in your action mapping, you'll end
up with all kinds of problems when you are brought back to the JSP after
validation fails (request scoped lists won't be in scope). Unless you use
some other plans to keep the lists around (Session, reset,etc... all of
which I don't like much and I talk more about here:
http://www.reumann.net/struts/articles/request_lists.jsp). I find it saves
you from headaches down the line if you just do your validation calls from
your Action class. You can still use the validation framework (commons
validator stuff that Paul mentions) to set up validation checks if that's
your pleasure... it's just that the call to invoke those checks ends up
being initiated from the Action. As an example:

//notice the prep method which will put stuff back in request scope when
validation fails and would also be used by other dispatch methods in this
action class

public ActionForward yourActionMethod(ActionMapping mapping, ActionForm
form, HttpServletRequest request, HttpServletResponse response) throws
Exception {
    YourForm yourForm = (YourForm)form;
    if (validationSuccessful(request, yourForm)) {
           //do stuff.
          return mapping.findForward(Constants.SUCCESS);
      } else {
          prep(request);
          return mapping.findForward(Constants.FAILURE);
      }
}

private void prep(HttpServletRequest request) {
      request.setAttribute(Constants.SOME_LIST_NAME,
service.getSomeKindOfList());
  }

private boolean validationSuccessful(HttpServletRequest request,
EmployeeForm form) {
    boolean isOk = true;
    ActionMessages errors = new ActionMessages();
    //do your validation checks...
    //ie...
    if (form.getFirstName() == null || form.getFirstName().trim().length()
== 0) {
        errors.add("firstName", new ActionMessage("errors.required", "First
Name"));
    }
    //or you could even call the form's validate...
    //errors = form.validate( mapping, request );

    //continue with other checks

    if (!errors.isEmpty()) {
        saveErrors(request, errors);
        isOk = false;
    }
    return isOk;
  }

--
Rick

Reply via email to