00:00
我们来学习抓兔子这个输入验证。嗯,这里边儿我们首先要说一下,我们在前端,就是在这个页面上,我们是不是可以使用JS或者是j query,或者是其他的这个JS框架或者是工具进行一个前端验证了,有了这个前端验证的话,还要不要做这个服务端的验证了?要准,因为前端这个验证我们是可以通过浏览器越过的啊,你必须得保证用户的输入是合法的,即便是前端验证失效的情况下。所以说我们一定要做这个服务端验证,这个服务端验证呢。在two里面就指的是我们这个输入验证。一个健状的外部应用程序必须确保用户的输入是合法的、有效的。to的输入验证分为两种,第一种是基于X work验证框架的声明式验证。第二种。编程式验证,编程式验证的话呢,写代码声明式验证通过配置就可以了,怎么就通过配置就可以了呢。
01:08
因为这个验证规则呀,就那么几种。比方说是否为空,是不是一个int型,这一个int型的话,是不是在某一个范围内,是不是一个合法的email,哎等等等等,这些我们是可以群举出来的,就那么几种,所以说我们可以采取配置的方式,好了配置的话呢,我们需要明确以下内容。第一个我们对。哪个action?或者是哪个model的字段进行验证。第二个我们使用什么验证规则,第三个如果要是验证失败的话,我要去哪个页面显示什么错误消息?这是我们需要明确的几点。我们来做一个笔记。新建一个抓的工厂。
02:00
拉。环境我直接搭起来了哈,先考入这个家暴。Web文件C。抓自身的配置文件。这个的话呢,我需要。修改一下。这个action就不要了。这里边儿的话呢,我们配过一个。48TWO的国际化资源文件,这个资源文件的话呢,我们保留。写一个I18。嗯,因为我们在这里边的话呢,我们还需要用。
03:05
好了,回去大好。下边。我来写这个笔记。第一个抓图。The angel。那种,首先我们说这个验证分为两种。分为。两种,一个叫声明式验证,还有一个叫编程验证。哎,我们推荐使用声明式验证啊,声明验证的话呢,我们具体需要做这样的几点,第一个需要明确对哪个。
04:07
Action或。Model的哪个字段进行验证?使用什么验证?规则。如果验证。转向哪一个页面?显示。什么错误?消息,这是我们需要明确的一个内容。那我们来看第二点,那我首先的话呢,我们说我们需要对这个呃。呃,某一个action或者是model的自性验证,我来写一个action吧。
05:00
包看点at硅谷点just to.validation。PP。It validation。Action。Action。写一个private the edge。写上对应的盖赛的方法。哎,我们就是要对这个action的这个H属性进行验证。张。返回。Success一下。
06:01
写一个表单。Eclip。S。S。Action validation。只写一个字段S。Field。Name age。As。配置文件写上。Action。Action叫validation。
07:03
Glass。It's the validation action。有。Result。Success点。大家或许能想得到是吧,如果失败的话,会去找这个。若验证。失败反向啊input,因为我们前面讲这个类型转换的时候,转换失败的话呢,那就是input。Result。Name input目录下的liation。当然,我来解一个成功的哈。
08:05
减一个14。Page了。如果要是验,如果要是验证成功的话,来这个页面,而且呢,打印这个H,如果失败的话呢,就转向。这个页面。好,还有一个重要的问题。我如何来进行配置啊。配置文件在哪呀?那这个配置文件呢,诶,我们找到我们r two的安装包。找到starts two。2.3.15。打开。找到applications bla。A BFA glass。Example,大家看是不是有一个log in validation呢?哎,这就是他的那个文件。
09:03
好了,你看到这块的话呢,可能就能理解了,是吧,这个什么什么validation是要跟这个action在一起。Far。跟这个同名横线validation,这就是他的。配置文件打开。拿掉。保存。嗯,大家可能没有这个什么呀,没有这个提示,这个时候的话呢,你需要重新去关联这个。D锻练一下啊和C。找到首选项xmll catalog。这个是吧,我先移除我爱的。来key这个位置选择URL。Stress too。
10:00
2.3.15,然后是struts。Src,注意是X work,因为这是基于X work的这个验证框架,打开src main resources去找吧。Valid d TD。OKOKOK。关掉。这打开就有提示了。我要来写一个验证规则。我们说针对于。Edge。属性。进行验证,OK,怎么写呢?看文档。找到stra to the dogs。找那个home是吧。
11:03
Eyes。Validation。在这。好了。有好些种验证器,我们先来用这个int。叫T,哎。这个interval呢,他过来验证一下。呃,我的某一个这个int值是不是在某一个范围内,我就使用这样的方式,这个叫字段验证器打开。CTRLC过来。O保存。行了。H必须在20跟50之间,这个应该是验证消息吧。完全是复制的,那这种方式的话呢,叫基于字段的验证。低于字段的验证,哎,我们先把这个hello word跑起来,一会儿的话呢,我再详细来讲每一个细节是什么意思。
12:08
跑起来。他说必须在20跟50之间,我写一个一大家看。是不是给了我一个错误呀,说A必须在20跟50之间,我写个21。OK。没问题,那我写一的时候的话呢,这个错误消息是哪定义的呀。在我们这个配置文件里边定义的,在这呢。就这块定义来打个标记,大家看一下。保存。
13:02
走。看见了吧,啊,我们是在。这个配置文件里边来定义的这个错误消息,这样的话呢,我这个声明是验证的一个hello word就OK了。梳理一下。证明是认证的。How world。这个hello的这个步骤呢,我们首先我们需要明确对哪一个。Action或者是model的哪一个字段进行验证,OK,先明确。对,打一个。Action的哪一个字段?进行验证,OK。明确了OK,我们就是对这个什么呀,对这个age。
14:01
第二个我们需要来编写配置文件,这个配置文件去哪找呢?我们直接。从这个下考入就可以了。打开。CTRLC来。我们的实现是。把这个吓的。文件。Log直接写啊。的XL文件。复制。稿和。不知道。当前。
15:03
Action所在的。所在的包甲过来。布置完之后的话呢,我需要改一个名啊该。废纸文件改为什么呀?OK,它是跟这个action关联的,就是说你得把这个log in改为这个action的名字,就是。啊。当前。Action的名字,这说明我们这个的这个配置文件是基于action的,就像我们那个类型转换器一样,所以说的话呢,我可以在这个配置文件里边直接指定这个。字段,而不需要再指定它是哪一个action的,为什么呀?我这个名字已经告诉我了,他是哪一个action。
16:05
再回来。好,然后的话呢,编写见证。规则天的规则去哪找啊,那规则的话呢,我们可以来看。这个文档。C看见这个文档。参见这个文档。一口八。三还有一点。还有一个什么呀,我们需要知道如果验证失败的话,去哪如何显示的错误消息说若验证失败得反向。哪一个页面啊。Input的那个result,所以说我需要配置这样的一个result。
17:04
所以需要配置。Game等于input。Do,交配一下。三八。这里边儿我配了一下。C。反过来。要配给他还有一个问题。如何显示这个错误消息呢?如何显示错误?消息呢?OK,那如何显示错误消息的话呢,验证规则这块我们可以来定义那个初步消息。在。配置文件中可以定义。错误。消息怎么定义的?
18:03
亮一点。C。拿过来。这样定义的。那这块的话呢,或许还有一个问题,这个错误消息可以国际化吗?该错误消息。可以国际化吗?可以吗?我们这个的话呢,我们一会儿再说,我们先看这哈,如何显示错误消息如何显示啊,分为两种情况,若若使用的是。To the。父母标签则。共显示。显示错误消息好了,下一个若使用的。
19:01
是。说不准确啊,如果使用的是。飞。Simple主题。得。共显制消息。若使用的是simple主题呢,得。需要。自己打印这个消息怎么打印。问一下。这个主题我改一下啊,改成这个。改成。Simple。这个label需要我自己来写,保存好找一个。这个时候这个消息呢,会自动的显示,怎么显示啊。我们貌似已经有经验了,是吧?我可以在上边儿搞一个SN bug,看看这个错误消息是不是在直站的某一个位置。
20:05
再走,大家看。这个错误消息应该叫什么呀?叫arrows,或者叫field errorrows,看到了吧,Age等于什么什么,于是的话呢,我们可以使用那个。S field error标签进行显示。写一下。S build。Error指定field name等于H。好。找一个。阿心,那就购物消息这样就可以显示了,至于说如何改这个样式,我们前面是讲过的,那你用这个标签可以显示,还可以使用OG表达式,就那个EL的方式直接显示,我来写一个吧。还有一种方式这样写。Build error。
21:01
还是住在Eric啊?Field errors。回来。这个是占的一个属性,是一个map类型配置,这属性值我来显示。第零个消息就可以了。看看。刷新。看见了吧,哎,也可以显示,那显示错误消息呢,就是使用S。Field error。标签或直接使用。EL表达式。因为老师实际上是干什么呀,使用ODN。限制,那我们这种方式都复制一下。又是他。这种都可以火。
22:02
实际上这两种的话呢,不尽相同,如果要是一个的I如有多个错误的话,我这样的话呢,将会显示多条错误,而这个只会显示那第一条错误。所以说正八经的这个方式啊,其实还是这样的方式,只不过我们用这个的话呢,也的确是可以解释。啊,翻过头来,我们再来看这件事,说这个错误消息可以国际化吗?应该是可以的吧,找到我们的这个配置文件,我们看一下。CTRLX来看,有一个key呀,哎,这叫error r in,这个时候我们先前留的这个国际化资源文件就起作用了。点int等于我多打一个这小标记走。起来。刷新。
23:01
看到了吧,诶三个小标记,这个时候的话呢,这个错误消息就可以被显示了。啊,到这块的话呢,我们这个。验证的hello word就比较完整了,重新的在笔记这块找一下,然后的话呢,我们来看PPT。验证啊,分为两种,我们现在讨论的是声明式验证。啊,我们来说一下这个声明是验证的,Hello word,我们首先需要明确对于action的哪一个字段进行验证,啊,我们验证这个age,然后的话呢,来编写这个配置文件,配置文件我们是从trus。Stra to给给我们那个例子里边拷过来的,但是的话呢,我需要把这个名字改成跟当前action相关的这个名字。又说明啊。这验证文件也是基于action。改名了,然后验证规则的话呢,我们看的也是文档啊,我们复制了这样的一段话,这里边的话呢,我们可以来定制这个错误消息,你也可以把这个错误消息放在国际化资源文件里边。
24:10
可以怎么写的?放在国际化资源文件里边。这。CZ。嗯,在在。在,在。国际化资源文件中加入构电值份。就可以了,这个电池队长的样子呢?这样。CTRLC过来。好吧,然后我们说了验证失败的话,它会去这个name等于input这个result显示错误消息,非simple主题自动显示simple主题,我们需要使用这个SQ的error进行显示,这都说明的是呢,哎,我们已经从前面这个编程经验里边,我们可以知道如如何来进行显示了,怎么办呢?
25:16
先看这个。直站,看直站里面有没有这个属性,有这个属性的话,或许就会有对应的标签。OK,来看一下PPT。PPT这个刚才的话呢,就是我们呃,顺着下来的是吧,但是内容还不是很完整,PPT里边会有一些补充。第一个问题,我们这个验证实际上又分为两种,这个声明是验证哈,又分为两种,一种叫。字段验证,一种叫非字段验证,刚才我们写的就是一个字段验证,我们到后边我们会讨论这个非字段验证什么意思啊?嗯,并不是验证某一个字段,而是针对字段之间的关系进行验证。比方说我们比较熟知的密码跟确认密码必须一致,这就是一个典型的肺自炎症。
26:12
好了。声明是验证的,这个步骤第一个确定X的哪一个字段需要验证,然后的话呢,编写一个验证。程序的配置文件。那文件格式是以下两种格式之一。第一种是若一个action类。有多个action,就是这一个action里有多个请求,这多个请求使用同样的验证规则是action class action class,这么写action class好一些是吧,Action class name,然后是就是我们现在写的这个。还有一种说一个action可以应答多个action请求。但是。他们使用。不同的验证规则。
27:00
什么什么叫不同的验证规则,比方说用户注册跟用户登录的时候,那个规则就不一样,我在用户进行注册的时候,我必须提供一个email。而且email不能为空。我好进行验证啊,我给你再发一个链接,然后你点一下进行激活,而我在进行登录的时候,我不需要email。我直接使用用户名就可以登录验证规则不一样,这时候怎么办呢?这个时候啊,我们在起名的时候,我们中间横杠加一个,加上一个,这个叫别名。什么叫别名啊?就是你当前请求那个action的名字,就是那个action节点的那个name属性值。好了,这个事儿的话呢,我们一会儿我们需要来说一下。第三个啊,确定验证那个页面,就是那个name等于in input那个result,这个我们已经知道了。这边。验证规则就这么些,这个的话呢,大家参看这个文档就可以了。
28:05
再来验证时的配置。这个是需要验证的字段的名字,这个是使用的验证规则叫int,诶这个验证规则在哪配了。有哪些验证规则,我们一方面可以看那个文档,那实际上还有一个配置文件,告诉我们它是怎么配的。告诉我们它有哪些验证规则,然后呢,这个min啊max啊,实际上是像这个验证器。提供的参数啊,这块的话呢,是定义了一个出错消息。好了,这个说完之后的话呢,我们说。我们这样简单的一配置,它就可以进行验证,这说明什么呀?这说明背后一定是有一个或多个类在对它进行支撑,懂这意思吧,就像我们前面讲的个自定义标签一样,一个标签能干那么多事,背后有标签处理器,那我现在我这样的写一个这个配置的话,它就可以完成验证,背后的话呢,一定是有对应的验证器,我们来找一下那个验证器。
29:23
这个实际上是对原理的一个探究哈,找一下那个验证器。找到。Stra two的。核心包。这个包里边儿啊,并没在这个里边没有,因为我们这验证器是。基于谁的呀,是基于X work的,打开这个。好了,我们看有很多valid,再打开找到是不是有个default X xml啊,这打开。大家看。Vatators vaator这个是一个一个的验证的名字,后边是对应的验证器,比方说int,我对应的是这个。
30:08
T range field valid,我是这个valid。这是底层的一个原理,一会儿的话呢,这个源码的话呢,我们还可以再来走一下,看一看它到底是怎么验证的,而且我们还要自己来定义验证器。那么在看这源码之前呢,我们先把前面的这个问题来解决一下。这个问题说,若。一个action。一个action类的多个action请求使用不同的验证规则。我们如何来指定这个配置文件呢?我们用这样的一个方式,就是说在action的这个类名跟这个va之间加上一个别名。
31:00
这个别名实际上是。Action,那个action节点的那个名字。这个的话呢,我们以一个需要注意的地方指出C来。三。注意说若一个。可以。应答多个。Action。请求,然后呢多个。顶球。使用不同的。验证。规则。怎么办?我们要解决的是这个问题。
32:02
怎么办的呀?解决方案是这样的。背。每一个不同的。Action请求定义提。对应的认证文件。文件的方式是action。必须的是吧,空间是别名。Name。然后是validation文件,这个是必须的。好吧。那于是的话呢,我们来做一个实验吧。比方说我们现在这个请求呢,是test validation,我这来写一个test validation to。这个复制上去。
33:06
哎。我这个里边啊,我要求。我年龄的范围在一到一百三之间。要求年龄必须在一到130。之间这样的一个要求,第一个呢,是要求年龄在20~50之间。要求年龄必须在。20~50之间。好吧,那我目前的话呢,只有一个。验证的配置文件,那这个只能是20~50,所以说这个一到一百三是不能够满足的,找一个。好,我写一个一。
34:00
还是告诉我这个合法,所以说我需要为他单独配一个自己的验证文件。把这个拿上去,这名叫什么呀?这名叫test。上去专门没改呢哈,Validation不看到了吧,不同的情度。请求一样的话肯定不行,你请求一样的话,验证规则肯定也一样啊,我请求不一样。好了,写完,然后呢。配置文件改一下。这个拿下来,If validation。请求不一样。带走。找到我们的第一个validation。这个。回到前一个页面。Validation to.jsp我刷新一下,点个一。
35:01
大家看。这不还没醒啊。这说明。或许以前这个action这个还在起作用是吧,我们为了看到是不是这个在起作用呢,我把这个改一下,我改成一个60。好,带走。爱回来。这个这个。再回来。再刷新。再提。哎,录20~60啊,这个在起作用,就是说我这个过完之后的话呢,我还要再。来过他那把这个也得改个名,什么呢,要。It's a very。好吧,现在我在。重启。我再回退。待提交,大家看是不是过了呀。回退,我写二。
36:01
问题我再写,我写个零到一百三吗。一到一百三在这个范围内,同样的这个也会起作用,这应该是20~60了吧,我会退。Validation JSP吧,写个一二十到60这样的话呢。我们就实现了不同的action请求对应着不同的验证规则。笔记。我们看到光有待别名这个验证文件还不够,我们需要来明确这样的一个事实。第一个就是说。不带别名。的配置文件。哪个?
37:01
C,你除非把这个去掉。依然会起作用。中的验证规则。依然会发生作用。他说,这个发挥作用有没有可取之处呢?当然有。可以把一些。呃,可以把各个。Action公用。验证规则。位置在几栋?是吧。但需要注意的是。只适用于。某一个。请求action请求的验证规则。
38:02
就不要在。这里。那我们这个里边的话呢,我们是。两个请求。验证规则完全不一样,所以说的话呢,我写了两个validation,而没有共用的那个validation,那我们开发的时候的话呢,往往还有那个共用的。Validation XL那个里边怎么样,把这个别名抛除就可以了。OK,继续。下一话题。要谈的是。声明是验证的原理。声明是验证框架的原理。会怎么想?我们首先会想到抓to这个运行流程,哎,里边应该会有一个验证的拦截器。
39:07
To。默认的拦截。气战中。提供了一个。战争拦截器。白里。Station拦截。瞧一瞧,有没有呢?找一下哈,Default。往下翻,找到默认的拦截气站。在这儿呢?再往下看。Validation validation拦截器再往上找。Validation在前边。Validation。
40:00
在这,哎,的确是有这样的一个拦截器。好了,第一点。再说我们这样的一个小小的配置,它就会起作用,作用背后有什么呀。背后一定是有类在对它做支撑,包括你为什么这个名就会定位到那个验证器呢?其实也有一个配置文件。好了,那每个。具体的验证规则都会对应具体的一个验证。验证器。那么有一个可指。文件把。验证。规则的名称和验证器关联起来了。关联。
41:01
就来了实际起作用的生命延长期二。实际上验证的是那个验证。嗯。我们去找一下那个配置文件。那配置文件应该是在。X work call,下边往下翻。有一个什么呀,有一个valids这样的一个包,这个包里边有一个。Default文件说文件。喂鱼。这个嘉宾。C。下等他。好了,我们把这个打开。
42:02
这里边的话呢,我们就看到了有什么呀,有这个名字后边还有对应的验证器,我复制一个过来,我们做一个参考就可以了哈。按照C。等等等吧,实际上起作用的呢,就是那个能器,我们来看一下这个运行流程是什么样子的,从哪开始啊,应该从。Validation拦截器开始。找到。Rut default。CLCT。刘备部队。The。走。连接器找到do intercept方法,这应该是被它负类调用的方法,对吧,往下翻。从这个里边的话呢,我们并没有看到实际上验证的代码在这个里边。
43:07
这个是不是就把这个控制权给那个X了,所以说在这个里边。好啦。Before,再往下翻。我们看,诶,我需要进行验证,它先调用了这个叫。Action valid方法找一个。你好D第一个是。Validate。又掉了valid这个方法。好,这里边的话呢,我们将对这个验证器进行循环,最终调用了验证器的外力的方法,我走一走啊。在这一行。这个的话呢,将调用具体验证器的那个验证方法好,第八个找一下。
44:07
随便找一个就可以。啊,这应该是我的。验证拦截器。我们看这个时候的话呢,调用了某一个valid的vali方法,哪个valid啊叫int range field valid,我们现在用的不是这个int验证规则吗?继续向后看,点valid。我们找一下有没有那个inter valid啊。这是一个基于字段的验证器。这里边找。这段怎么样,没有实际上的话呢,那个in range valued是这个abstract range value的此类,所以说在这个里边。好了,到这个里边的话呢,我们把这个代码停一下。进一步的来找,停住看这是谁呀?叫range field vali,打开我们来看一下,嗯。
45:07
运行时的它的这个状态,我们看到一个什么呀,有这个few name吧。由我们传入的。Max,有传入的mean吧?实际上的话呢,我们这个验证器跟我们这个配置文件的属性之间会有一个对应关系,我们来看一下这个对应关系。打开。我们讲的是配置文件跟验证器属性之间的对应关系。首先呢,这个是配置文件里边的一个片段,我们对这个age使用这个in的验证规则,同时传入了一个min跟max。打开。我们看我用的是这个验证规则,有一个这样的关系,好吧,这个时候我实际上用的是哪个验证器呢?In range field valiator OK,我把这个运行状态也拿过来了。
46:07
然后我们来看属性之间的对应关系,我们看到什么,这边有一个A吧,跟谁对啊,来跟他对。配置之间有一个对应关系,它实际上是这个验证器的用name属性。按命根max。Max之间max属性之间丙面属性之间丙,诶这样的一个对应关系,那我们后面讲多个字段使用同样的验证规则,然后使用同样的验证消息的时候,我们还需要用到我们现在的这个分析。
我来说两句