在Struts2应用中提供验证的方式有两种――编程式和声明式。
编程式验证
要提供编程式验证的话,action就要实现Validateable接口。该接口只有一个方法,在方法中需要执行验证操作:void validate();
为了将验证中出现的问题反馈给用户,action还需要实现ValidationAware接口。这个接口更为复杂一些,它里面的方法可以用来添加验证错误,判断当前是否有验证错误,等等。
如果可能的话,你的action可以继承ActionSupport类,在该类中提供了以上这些接口的缺省实现。只有当验证操作极其复杂的时候,我们才该使用编程式验证。更好的解决方案是采用声明式验证。
?
声明式验证
5) ExpressionValidator验证
??????????????
????????? 使用OGNL表达式作为验证条件,示例:?
????????? <validators>
??? ????? <validator type="expression">
??? ??? ?<param name="expression">name.equals("ls")</param>
??? ??? ?<message>INVALID NAME!</message>
??? ????? </validator>
????????????? <field name="name">
???????????????? <field-validator type="requiredstring">
???????????????? <message>Name is required!</message>
????????????? </field-validator>
????????? </validators>??
????????? 上述例子中 name 为一属性名,使用expression验证器验证其值是否为 "ls". 其中"ls"为一个具体值直接写在
????????? 验证配置文件中,也可以来自静态常量或静态方法的返回值。示例:
????????? <validators>
??? ????? <validator type="expression">
??? ??? ?<param name="expression">name.equals(@com.briup.Constant@NAME)</param>
??? ??? ?<message>INVALID NAME!</message>
??? ????? </validator>??????????
????????? </validators>??????
??? ? 其中Constant类源文件为:
??? ? public class Constant {
??? ? ??? public static final String NAME="ww";
??? ? ??? public static String getName() {
??? ? ??? ??? return "sq";
??? ? ??? }
??? ? }
????????? 注意:属性和方法的修饰符应设置为 public.?
?????? 5) VisitorFieldValidator验证
????????? 多个Action类中都要验证相同JavaBean对象的各个属性,为了避免验证配置信息出现在多个配置文件中,可以
????????? 将JavaBean对象的验证信息单独写在一个文件中,然后各Action验证配置文件使用visitor类型验证器去引用。
????????? 示例:
????????? a. 没有使用visitor类型验证器
???????????? i.? JSP页面
???????????????? login.jsp
???????????????? ---------------------------
???????????????? <h3>Student Login</h3>
???????????????? <s:form action="login">
???????????????? ??? <s:textfield name="name" label="name"/>
???????????????? ??? <s:textfield name="password" label="Password"/>
???????????????? ??? <s:submit value="Submit"/>
???????????????? </s:form>
???????????????? register.jsp
???????????????? ---------------------------
???????????????? <h3>Student Register</h3>
???????????????? <s:form action="register">
???????????????? ??? <s:textfield name="name" label="name"/>
???????????????? ??? <s:textfield name="password" label="Password"/>
???????????????? ??? <s:submit value="Submit"/>
???????????????? </s:form>
???????????? ii. Action
??? ??? ?StudentProAction.java
???????????????? ---------------------------
???????????????? public class StudentProAction extends?
???????????????? ??? ActionSupport implements ModelDriven<Student> {
???????????????? ??? private Student student=new Student();
???????????????? ????
???????????????? ??? public String login() {
???????????????? ??? ??? return "success";
???????????????? ??? }
?????????????????
???????????????? ??? public String register() {
???????????????? ??? ??? return "success";
???????????????? ??? }
????
???????????????? ??? public Student getModel() {
???????????????? ??? ??? return student;
???????????????? ??? }
???????????????? }
???????????? iii.Struts.xml
??? ??? <action name="login" class="com.briup.StudentProAction" method="login">
??? ??? ??? <result>/loginResult.jsp</result>
??? ??? ??? <result name="input">/login.jsp</result>
??? ??? </action>
??? ??? <action name="register" class="com.briup.StudentProAction" method="register">
??? ??? ??? <result>/registerResult.jsp</result>
??? ??? ??? <result name="input">/register.jsp</result>
??? ??? </action>
???????????? iii.验证配置文件:
???????????????? StudentProAction-login-validation.xml(和StudentProAction同包)
???????????????? ---------------------------
??? ??? <validators>
??? ??? ??? <field name="name">?? <!-- 属性名应与表单控件同名,而不是Action中属性名-->
??? ??? ??????? <field-validator type="requiredstring">
??? ??? ??????????? <message>Name is required!</message>
??? ??? ??????? </field-validator>
??? ??? ??? </field>
??? ??? ??? <field name="password">
??? ??? ??????? <field-validator type="requiredstring">
??? ??? ??????????? <message>Password is required!</message>
??? ??? ??????? </field-validator>?
??? ??? ??? </field>????
??? ??? </validators>
???????????????? StudentProAction-register-validation.xml(和StudentProAction同包)
???????????????? ---------------------------
??? ??? <validators>
??? ??? ??? <field name="name">
??? ??? ??????? <field-validator type="requiredstring">
??? ??? ??????????? <message>Name is required!</message>
??? ??? ??????? </field-validator>
??? ??? ??? </field>
??? ??? ??? <field name="password">
??? ??? ??????? <field-validator type="requiredstring">
??? ??? ??????????? <message>Password is required!</message>
??? ??? ??????? </field-validator>?
??? ??? ??? </field>????
??? ??? </validators>
??? ??? 注意:验证配置文件中<field>中name属性值与表单控制同名,使用<s:textfield>即可显示错误提示信息,
????????????????????? 否则,须通过<s:fielderror/>显示错误提示信息;
????????????????????? . <s:fielderror/>:显示所有field级别的错误提示信息;
????????????????????? . <s:fielderror>
??? ??? ?????????? <s:param>student.password</s:param>
??? ??????????????? </s:fielderror>
??????????????????????? : 提定显示名称为student.password的field级别的错误提示信息;
????????? b. 使用visitor类型验证器
???????????? 其它地方与上同,只是配置文件和显示错误信息设置有点变动:
???????????? iii.验证配置文件:
???????????????? StudentProAction-login-validation.xml(和StudentProAction同包)
???????????????? ---------------------------
??? ??? <validators>
??? ??? ??? <field name="student">?? <!-- 属性名与Action中属性同名-->
??? ??? ??????? <field-validator type="requiredstring">
??? ??? ??????????? <message>Name is required!</message>
??? ??? ??????? </field-validator>
??? ??? ??? </field>?
??? ??? </validators>
???????????????? StudentProAction-register-validation.xml(和StudentProAction同包)
???????????????? ---------------------------
??? ??? <validators>
??? ??? ??? <field name="student">?? <!-- 属性名与Action中属性同名-->
??? ??? ??????? <field-validator type="requiredstring">
??? ??? ??????????? <message>Name is required!</message>
??? ??? ??????? </field-validator>
??? ??? ??? </field>?
??? ??? </validators>
???????????????? Student-validation.xml(和Student类同包)
???????????????? ---------------------------
??? ??? <validators>
??? ??? ??? <field name="name">
??? ??? ??????? <field-validator type="requiredstring">
??? ??? ??????????? <message>Name is required!</message>
??? ??? ??????? </field-validator>
??? ??? ??? </field>
??? ??? ??? <field name="password">
??? ??? ??????? <field-validator type="requiredstring">
??? ??? ??????????? <message>Password is required!</message>
??? ??? ??????? </field-validator>?
??? ??? ??? </field>????
??? ??? </validators>
??????????????? 注意这时显示错误信息时须使用标记 <s:fielderror/>.
??? 2. 客户端校验????
?
?????? 在服务器端设置成功的基础上,在<s:form>标记中将属性validate设置为true即可。这时错误显示效果和服务器端
?????? 验证相同,只不过借助于javascript实现而已。?
?????? 注意,借助于OGNL表达式使用expression类型的验证器还需使用服务器端验证实现。???
???????
七. 国际化
??? 1. JSP页面显示国际化信息:
??
?????? <s:text name="login.title"/>??? ??? ??? <!-- login.title为资源文件key值 -->
?????? <s:textfield name="name" key="login.name"/>??? <!-- login.name为资源文件key值 -->
?????? <s:property value="%{getText('login.name')}"/>?? <!-- login.name为资源文件key值 -->
???????
??? 2. Action中获取国际化信息
?????? getText("资源文件key值");??????????????????????? //getText为ActionSupport的方法
??? 3. 配置文件中获取国际化信息
?????? <message>${getText('login.name')</message>?????? <!-- login.name为资源文件key值 -->