:::tip 重点:
完成 Save User 页面的输入校验(姓名及昵称不能为空、年龄不能为空且在 1-150 之间),采用代码方式完成(override validate 方法),采用校验框架方式完成(有两种办法)
:::
前台校验
JS 的校验不是必须的,JS 的校验是可以被绕行的、JS 提升用户体验。
最简单的校验,以校验用户名为空为例
1 2 3 4 5 6 7 8 9 10 11 12 13 <script type="text/javascript" src="https://cdn.staticfile.org/jquery/1.12.4/jquery.js" ></script> <script type ="text/javascript" > $(document ).ready (function ( ) { var form = document .forms [0 ]; $(form).on ("submit" , function ( ) { var firstname = $("input[name='user.firstname']" ); if (firstname == "" ){ alert ("姓名不能为空" ); return false ; } }); }); </script >
效果
后台校验 方法一:重写 validate 方法 首先重写 SaveuserAction 的 validate 方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Override public void validate () { if (StringUtils.isEmpty(user.getFirstname())) { this .addFieldError("user.firstname" , "姓名不能为空" ); } if (StringUtils.isEmpty(user.getLastname())) { this .addFieldError("user.lastname" , "昵称不能为空" ); } if (null == user.getAge()) { this .addFieldError("user.age" , "年龄不能为空" ); } if (user.getFirstname().length() > 2 ) { this .addFieldError("user.firstname" , "姓名不能超过150字符" ); } if (user.getLastname().length() > 150 ) { this .addFieldError("user.lastname" , "昵称不能超过150字符" ); } }
然后在 struts.xml 添加 input 返回结果,并返回到当前页面
1 2 3 4 <action name ="saveUser" class ="saveUserAction" > <result name ="success" type ="redirect" > listUser.action</result > <result name ="input" > /saveUser.jsp</result > </action >
效果
方法二:使用 xml 配置校验 实际上是调用 Struts2已经定义好的校验器,来对我们的 Action 进行校验。
要求:
1、必须实现 validatable 接口,ActionSupport 已经实现了,我们只需要继承 ActionSupport 即可。
2、Action 中必须实现 getter、setter 方法。
创建校验配置文件。格式规范:
actionClass-actionName-validation.xml
actionClass:action 的类名
actionName:action 的访问名称。在 struts.xml 中配置的<action name="actionName">
,若有动态函数传递,只想对某个函数进行校验,需要把函数名显式的写出来。
validation.xml:固定的后缀名。
比如:SaveUserAction-saveUser-validation.xml
路径:必须与 Action 同包
Action 类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 public class SaveUserAction extends ActionSupport { private static final Logger logger = LoggerFactory.getLogger(SaveUserAction.class); private User user; private UserService userService; public User getUser () { return user; } public void setUser (User user) { this .user = user; } public UserService getUserService () { return userService; } public void setUserService (UserService userService) { this .userService = userService; } @Override public String execute () { try { logger.info("开始保存用户" ); userService.saveUser(user); } catch (Exception e) { logger.error("保存用户出错:" , e); } return SUCCESS; } }
保存用户的表单 saveUser.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html > <head > <title > 保存用户</title > <link rel ="stylesheet" href ="css/common.css" > </link > </head > <body > <h1 style ="color: red;" > 保存用户</h1 > <s:form action ="saveUser" > <s:textfield name ="user.firstname" label ="%{getText('firstname')}" > </s:textfield > <s:textfield name ="user.lastname" label ="%{getText('lastname')}" > </s:textfield > <s:textfield name ="user.age" label ="%{getText('age')}" > </s:textfield > <s:submit value ="提交" > </s:submit > </s:form > </body > </html >
struts.xml 的配置
1 2 3 4 <action name="saveUser" class="saveUserAction" > <result name="success" type ="redirect" >listUser.action</result> <result name="input" >/saveUser.jsp</result> </action>
主要的 validator 配置:SaveUserAction-saveUser-validation.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd" > <validators > <field name ="user.firstname" > <field-validator type ="requiredstring" > <param name ="trim" > true</param > <message > 用户名不能为空</message > </field-validator > </field > <field name ="user.lastname" > <field-validator type ="requiredstring" > <param name ="trim" > true</param > <message > 昵称不能为空</message > </field-validator > </field > <field name ="user.age" > <field-validator type ="int" > <param name ="min" > 0</param > <param name ="max" > 120</param > <message > 年龄输入必须在0-120之间</message > </field-validator > <field-validator type ="required" > <message > 请输入年龄</message > </field-validator > </field > </validators >
注意:输入 Action 名称-validation.xml 也是可以的。例如:
效果
总结
校验规则有很多,在 struts2-core-xxx.jar/com/opensymphony/xwork2/validator/validators/default.xml 中有详细的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator Definition 1.0//EN" "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd" > <validators > <validator name ="required" class ="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator" /> <validator name ="requiredstring" class ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator" /> <validator name ="int" class ="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator" /> <validator name ="long" class ="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator" /> <validator name ="short" class ="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator" /> <validator name ="double" class ="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator" /> <validator name ="date" class ="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator" /> <validator name ="expression" class ="com.opensymphony.xwork2.validator.validators.ExpressionValidator" /> <validator name ="fieldexpression" class ="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator" /> <validator name ="email" class ="com.opensymphony.xwork2.validator.validators.EmailValidator" /> <validator name ="creditcard" class ="com.opensymphony.xwork2.validator.validators.CreditCardValidator" /> <validator name ="url" class ="com.opensymphony.xwork2.validator.validators.URLValidator" /> <validator name ="visitor" class ="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator" /> <validator name ="conversion" class ="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator" /> <validator name ="stringlength" class ="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator" /> <validator name ="regex" class ="com.opensymphony.xwork2.validator.validators.RegexFieldValidator" /> <validator name ="conditionalvisitor" class ="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator" /> </validators >
相比较来说,xml 配置方式要方便一些,不过,如果需要自定义校验的话,可能默认的校验规则还不够。
方法三:使用 visitor 方式 配置文件分离
SaveUserAction-validation.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd" > <validators > <field name ="user" > <field-validator type ="visitor" > <param name ="context" > user</param > <param name ="appendPrefix" > true</param > <message > 用户的</message > </field-validator > </field > </validators >
User-user-validation.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd" > <validators > <field name ="firstname" > <field-validator type ="requiredstring" > <param name ="trim" > true</param > <message > 用户名不能为空</message > </field-validator > </field > <field name ="lastname" > <field-validator type ="requiredstring" > <param name ="trim" > true</param > <message > 昵称不能为空</message > </field-validator > </field > <field name ="age" > <field-validator type ="int" > <param name ="min" > 1</param > <param name ="max" > 120</param > <message > 年龄输入必须在 ${min} - ${max} 之间</message > </field-validator > <field-validator type ="required" > <message > 年龄不能为空</message > </field-validator > </field > </validators >
效果
本项目地址 https://github.com/terwer/hoa