验证大家都熟悉,一般分为两种:客户端验证和服务器端验证。
客户端验证:顾名思义就是在jsp等显示页面进行验证,一般使用js或jquery进行验证。其优势在于
①减少客户的等待时间
②减少服务器的压力
但是,仅仅有客户端验证是不行的。因为要防止用户“绕过”客户端验证输入不合法数据。用户把页面另存为,再修改其验证规则,再发送到服务器(我还没干过这事,以后有机会试试。当然估计不会这么容易),如果在服务器端没有进行验证,那么是狠“危险滴”。
服务器端验证,一般有两种方式:
①在Action中继承ActionSupport,在业务方法中进行验证或重写validate()方法
②使用struts2的验证框架
本章就重点讲一下服务器端的验证。
一、在业务方法中直接验证:
- public void RegisterAction extends ActionSupport {
- private String username;
- private String password;
- private int age;
- public String execute(){
- //验证用户名
- if(null==username || "".equals(username)){
- this.addFieldError("username","不能为空");
- //fieldError对应页面的<s:fielderror>标签,表示属性级错误
- }
- //验证密码和年龄,类似这样验证
- this.addActionError("用户注册信息错误");
- //actionError对应页面的<s:actionerror>标签,表示action级的错误
- if(this.hasErrors()) return "input";
- //其内部其实是:this.hasActionErrors() || this.hasFieldErrors()
- //具体fieldError和actionError区别,建议实践一下
- return "success";
- }
- }
关于上面的"return 'input'",注意要在action中配置一个name="input"的result,因为验证有错误就会返回一个“input”。
可以发现,上面的验证方式缺点很明显:验证和业务都混在一起,难于维护,难于代码重用。。。
因此可以用下面这种验证方式:
二、重写validate()方法:
- public void RegisterAction extends ActionSupport {
- private String username;
- private String password;
- private int age;
- public String execute(){
- // ......业务代码
- }
- /*
- * 重写validate()方法
- */
- pulblic void validate(){
- //验证用户名
- if(null==username || "".equals(username)){
- this.addFieldError("username","不能为空");
- //fieldError对应页面的<s:fielderror>标签,表示属性级错误
- }
- //验证密码和年龄,类似这样验证 ,此处省略
- this.addActionError("用户注册信息错误");
- if(this.hasErrors()) return "input";
- return "success";
- }
- }
使用validate()方法的改进在于把验证代码都放到validate()方法中,而验证方式和显示错误信息等都不变。
这个方法的执行原理:首先运行validate()方法,没有错再运行业务方法。而且,这个validate()方法会对该Action类中所有业务方法都有效。所以,在validate()方法中,我们只能进行业务的公共验证,方便代码的重用。
问题:那怎么对单独的业务方法进行验证?看下面
使用validateXxx()方法进行验证:
这里代码就不写了,控制格式很麻烦,又没提示。。。。
意思很明白,比如我要对登录方法login()单独进行验证,那么就写一个validateLogin()方法,这个方法里面就写对登录的单独验证代码。注意方法的命名规范
注意:validate()和validateXxx()方法同时存在Action中的话会同时生效,先执行validateXxx()方法,在执行validate()方法。
上面所提到validate()验证方法倒是解决了验证代码和业务代码的分离,但是它们终究还是在一个Action中,如果要把它们彻底分开,就要使用struts2的验证框架了。继续看
三、验证框架
不说什么验证框架了,搞的很高智商似的。其实就是个xml格式的文件。这就是所谓的"框架"
使用方法:
①在Action类的同目录下创建ActionName-validation.xml配置文件(ActionName是指Action的名字),而这个文件相当于上面提到的validate()方法。很容易理解吧。。。
②还是在同目录下创建ActionName-alias-validation.xml配置文件,这个就相当于前面提到的validateXxx()方法,可以单独对某个业务进行验证。注意:alias是业务方法名。
③编写验证规则,验证规则比较好理解,可以google或查看帮助文档。有字段验证器和非字段验证器两种形式,在项目中应该商量好统一用一种
总结:
主要讲了两种验证方式,比较起两种验证方式,实质是一样的,只是表现形式不同。