I don't understand conception of Struts2 validation in next case :
My application consists of 2 actions:
I can run drive.action
from browser command line without filling user and password in login.action
How can I implement validation code which prevents the run of drive.action
from command line if user hasn't successfully filled user and password in login.action
?
The validation concept
Struts 2 validation is configured via XML or annotations. Manual validation in the action is also possible, and may be combined with XML and annotation-driven validation.
Validation also depends on both the validation and workflow interceptors (both are included in the default interceptor stack). The validation interceptor does the validation itself and creates a list of field-specific errors. The workflow interceptor checks for the presence of validation errors: if any are found, it returns the "input" result (by default), taking the user back to the form which contained the validation errors.
If we're using the default settings and our action doesn't have an "input" result defined and there are validation (or, incidentally, type conversion) errors, we'll get an error message back telling us there's no "input" result defined for the action.
It is simple, you map the validators to the fields via the validation configuration file, or via annotations. Then apply a validation
interceptor to the action via referencing it explicitly or implicitly via the interceptor stack, custom stack or defaultStack
.
When validation started it invokes the validation manager to perform actual validation and save errors to the ValidationAware
action.
Your action should implement this interface, or just extend the ActionSupport
where it's already implemented, to save the errors. Then workflow
interceptor checks for those errors and if found any of them redirect to the INPUT
result, if no errors found the action invocation is executed. You may also add a programmatic validation to the action by implementing Validateable
interface, which ActionSupport
is implemented by default, hence to override the validate()
method(s).
As a supplement to XML based validation you could also apply annotation based configuration. This only the server-side validation, the client-side validation applied to the browser enabled javascript via Struts tags used for rendering a validation content to the page being validated.
All of this concept is not applicable to the action which requires authentication (unless the authentication interceptor is applied to the action). If you use JAAS authentication, then you should consider your action to implement PrincipalAware
or use roles
interceptor to restrict access to the action which checks the isUserInRole()
. You may use Action.LOGIN
result to return to the login page in authentication interceptor if the user is not authenticated like in Is there a way to redirect to another action class without using on struts.xml
example.