假如这个世界上只剩下你一个人,当你正坐在屋子里的时候,这时突然响起了敲门声...

Struts2教程5:使用Validation框架验证数据

上一篇 / 下一篇  2008-04-21 23:02:04 / 个人分类:struts2

查看( 167 ) / 评论( 0 )
本文为原创,如需转载,请注明作者和出处,谢谢!ITPUB个人空间Vj4rs]"|Czz

lTf6vS%N"M0上一篇:Struts2教程4:使用validate方法验证数据
4\.~K4g+q5Z o0
)I8}@!B5LT{0    在《Struts2教程4:使用validate方法验证数据》中曾讲到使用validate方法来验证客户端提交的数据,但如果使用validate方法就会将验证代码和正常的逻辑代码混在一起,但这样做并不利于代码维护,而且也很难将过些代码用于其他程序的验证。在Struts2中为我们提供了一个Validation框架,这个框架和Struts1.x提供的Validation框架类似,也是通过XML文件进行配置。ITPUB个人空间 fTlj,qC|
ITPUB个人空间,_4wvq3?-cp$^,i
一、服务端验证
$Pj#^#kx"_ v[0
irI$L4]0}0下面将给出一个例子来演示如何使用Struts2的validation框架来进行服务端验证。我们可以按着如下几步来编写这个程序:ITPUB个人空间+e Cm~lOG!e

6H}rY WWkt aA0【第1步】建立Action类(NewValidateAction.java)
8PxjLS8X s,Vo0ITPUB个人空间j.sq5sl8i m
package action;ITPUB个人空间5Pp;V/YW4Y

M^7bp g0import com.opensymphony.xwork2.ActionSupport;ITPUB个人空间nj3C"D };h6ZG8gtL
ITPUB个人空间.| yNR*Kr2z
public class NewValidateAction extends ActionSupportITPUB个人空间;y S^'Q,M8F*R
{
OeEZ]f,e0        private String msg;  // 必须输入
&O+?B3i`M$C!W5e0        private int age;   // 在13和20之间
!N T&g8d;l#Kv0        public String getMsg()
U bQb*W X0        {ITPUB个人空间$^[ \o/\
                return msg;
"@ ~p GW(Mv/VfU0        }
/Lc/y[C!G1P0        public void setMsg(String msg)ITPUB个人空间n9b*k1yCe'X
        {
nB M9O:rH%|0                this.msg = msg;
$x,{AY Pg#y"l$x0        }ITPUB个人空间6w2q8o@(Y i!L
        public int getAge()ITPUB个人空间:w7T{Y4_+`'q9SJ7A:BR
        {
%Va4Q1x`!V0                return age;
6FBQ` H4[0        }ITPUB个人空间y%O,el)yX-KO
        public void setAge(int age)ITPUB个人空间inR7ijO
        {
l)nzr7kxb0                this.age = age;
UIC e R j}D0        }
v&P'fX"q7C0}
)Q!E c6n0LX0ITPUB个人空间PN y(q.iz8\0I8Y
下面我们来验证msg和age属性。ITPUB个人空间8^*I5U}`P
【第2步】配置Action类,struts.xml的代码如下:ITPUB个人空间#T;xSnXD ]4v4v

~ l5sO`0<?xml version="1.0" encoding="UTF-8" ?>ITPUB个人空间,QS,X-V:NC ek
<!DOCTYPE struts PUBLICITPUB个人空间 OFg-Kp3KS
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"ITPUB个人空间f(JS{q&^U&h5L+COI
    "http://struts.apache.org/dtds/struts-2.0.dtd">
p2bh+OO&{Fa x0<struts>ITPUB个人空间hz}(A&D'can
        <package name="demo" extends="struts-default" namespace="/test">
wOhs:VH0                <action name="new_validate" class="action.NewValidateAction">ITPUB个人空间G+b/F(pk
                        <result name="input">/validate_form.jsp</result>ITPUB个人空间 g@rk,G6X!}Wu/@
                        <result name="success">/validate_form.jsp</result>
G4r(E:jQ0                </action>ITPUB个人空间%cC6OZE1e
        </package>
I| e%b&qb9_0</struts>ITPUB个人空间mPd yw

s6yQ"}B,l l2^0【第3步】编写验证规则配置文件ITPUB个人空间8Wk Ck1`#M,k9t vM
ITPUB个人空间U(s i _i[-E%^ j@
    这是一个基于XML的配置文件,和struts1.x中的validator框架的验证规则配置文件类似。但一般放到和要验证的.class文件在同一目录下,而且配置文件名要使用如下两个规则中的一个来命名:
p;L7_6nOHq;v01.        <ActionClassName>-validation.xml
MkZu/p2A TmC02.        <ActionClassName>-<ActionAliasName>-validation.xml
8F'Sx"ZTz0ITPUB个人空间tw;q NN b
其中<ActionAliasName>就是struts.xml中<ation>的name属性值。在本例中我们使用第一种命名规则,所以文件名是NewValidateAction-validation.xml。文件的内容如下:ITPUB个人空间\u l fq4e
ITPUB个人空间)SI%ui qt_
<?xml version="1.0" encoding="UTF-8"?>ITPUB个人空间Q:m mhwk
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">ITPUB个人空间.y9S{ C`\
<validators>
'R Qjg tZ5il r A0        <field name="msg">ITPUB个人空间$j8Ry [Jkq5n p&G
                <field-validator type="requiredstring">
,[Q2E8l7l6?TZ'[.`M0                        <message>请输入信息</message>ITPUB个人空间&^(iuJJk!Q
                </field-validator>ITPUB个人空间-swr$QNa4Q
        </field>
"C V[#S)IAH0        <field name="age">ITPUB个人空间z|2^(OUp*N*j
                <field-validator type="int">ITPUB个人空间D8[M7q-xYC E]F
                        <param name="min">13</param>ITPUB个人空间g4I&a*G+]1B!Z ~
                        <param name="max">20</param>
1e+bh2as,A0                        <message>ITPUB个人空间7WC\e7n{
                                必须在 13至20之间ITPUB个人空间#MT4kwE
                        </message>ITPUB个人空间/Z$N#dg*Cx*M4u,oE
                </field-validator>
DqvT\ZcW0        </field>
#w3yhr Kd%|/o0</validators>
PG:MIS3Zbav0
,_J;?3K&@*a0这个文件使用了两个规则:requiredstring(必须输入)和int(确定整型范围)。关于其他更详细的验证规则,请读者访问http://struts.apache.org/2.0.11.1/docs/validation.html来查看。
} ~M+\+iN-Gk)Z4|0ITPUB个人空间S4K gF2tfy
【第4步】编写数据录入JSP页。
I0J5eu \0在Web根目录中建立一个validate_form.jsp文件,代码如下:
;Vh0qqQP0ITPUB个人空间FakI{MO;\N
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
T|NVCA0<%@ taglib prefix="s" uri="/struts-tags" %>ITPUB个人空间LT%l)X&BNVwSI(Dv
<link rel="stylesheet" type="text/css" href="<s:url value="/styles/styles.css"/>">ITPUB个人空间6\;R.N _NS \'[
<html>
"R q)F JXpQ` w2a0  <head>ITPUB个人空间-hPco%C"gaJ
    <title>验证数据</title>ITPUB个人空间_@&Ub}lnSw;p C/U
  </head>  ITPUB个人空间j:vQE[
  <body>ITPUB个人空间7FdIn n8cN9D
    <s:form. action="new_validate" namespace="/test" >ITPUB个人空间&R+m~E{4xQZ
        <s:textfield name="msg" label="姓名"  />ITPUB个人空间x'Tc'c1|JK){C(g
        <s:textfield name="age" label="年龄"/>ITPUB个人空间 o;pR@ _~k
        <s:submit/>ITPUB个人空间FH^P"O}|;[U
    </s:form>ITPUB个人空间\-Oa2P$f)Wf/e4@
  </body>  ITPUB个人空间4t yx?!{&?4sH
</html>ITPUB个人空间 mWj8o.s pD zG

`.R^ Z/l U8_E\p0大家要注意一下,如果在struts.xml的<package>标签中指定namespace属性,需要在<s:form>中也将namespace和action分开写,如上面代码所示。不能将其连在一起,Struts2需要分开的action和namespace。如下面的代码是错误的:
K3Z2AY Q!HQ'}3v'Q0
;LX9|)H;tO/f0<s:form. action="/test/new_validate" >
P;AJ;h4a5^s |:`2v0   ... ...ITPUB个人空间a;z hH9[1P3}S
</s:form>
$jV1K/~g)Gq `*d2vB4}0ITPUB个人空间E jIl.J
在上面的程序中还使用了一个styles.css来定制错误信息的风格。代码如下:ITPUB个人空间n H6r yZ'|L3cT F

:V7n1h6H#W G]1c'?0.label {font-style.:italic; }ITPUB个人空间 ^(`EUZ Z?c9W9[
.errorLabel {font-style.:italic;  color:red; }
{3gTB4? G p0.errorMessage {font-weight:bold; color:red; }ITPUB个人空间;M,n H wNMELzT y6rt]

-O6Q$VFoW6N|0    需要在Web根目录中建立一个styles目录,并将styles.css   ITPUB个人空间v;IF8V@~m

NX8\}1y [,T"uA0假设Web工程的上下文路径是validation,可以使用如下的URL来测试这个程序:
fP/uO$es1m x0
W(|[B?|0    http://localhost:8080/validation/validate_form.jsp
@ _!I:i"a&Oan0
Uxz1U ~0ITPUB个人空间8R)]T*S6]c!r$q
    显示结果如图1所示。
Y} PG0f/U0ITPUB个人空间\/K2Bl_6L4\+c

h,U4e"Y4Dtk T.Sd r {?[0ITPUB个人空间8\/B&} n.o$t
01.jpg

2sOE+u6yO6pK?$W0
G B j[3U h N(Q0图1ITPUB个人空间V4kGG)w
ITPUB个人空间kx!u5M/K&}8e
二、客户端验证
OZ'S)O J cX#]0ITPUB个人空间:WY0eEc
在Struts2中实现客户端验证非常简单,只需要在<s:form>中加入一个validate属性,值为true。如<s:form. validate="true" ... > ... </form>即可。ITPUB个人空间 W^:m/yDJ&N{Q s3a
ITPUB个人空间A5f$L8];Ta8V
三、验证嵌套属性ITPUB个人空间H D4M/m.T E4y2T4ST

z,UK@Uu0    有一类特殊的属性,即这个属性的类型是另外一个JavaBean,如有一个User类,代码如下:ITPUB个人空间O$|i(H]dKX2gQ

:jZQ4E3w9~3].@+D0package data;ITPUB个人空间6Ik%~:cl6J;w8I%]Ji\

+OL0|7y_qo G7D0public class User
:J!b TO+HeGO-E0{
o(n!zI n3Bref)g0    private String name;ITPUB个人空间4u(Bk HeN'ys
    private int age;
E"Bjz${/S]0        public String getName()ITPUB个人空间a&J/n;@m-|c d
        {
/L2o{.L;` R'[$L0                return name;ITPUB个人空间d%{V Nl(pu`
        }
:Y?uwz!G| s0        public void setName(String name)ITPUB个人空间$UT9J[FEGk
        {
fP5j I/e0?V.hS.In0                this.name = name;ITPUB个人空间p9\3I7iN5K ah V b
        }ITPUB个人空间;D2YT@y+}/p\
        public int getAge()ITPUB个人空间(\m? K+V} Ke
        {
DU9J3T Mk iy0                return age;ITPUB个人空间`1u_[3A!x
        }ITPUB个人空间v6B.g:~ ~0n
        public void setAge(int age)
^P%VI%N9[0GZ0        {
0j `dI'`J G9F0                this.age = age;ITPUB个人空间`[+c.Q'p7kbG
        }
^!cqo.jH8]0}
h^ aNr:L0@&b0ITPUB个人空间L#rS%R)`7G&cZ
    在NewValidateAction类中加一个user属性,代码如下:ITPUB个人空间Hs/[%b'pt~9dG n
ITPUB个人空间Z\{*FD_
package action;
fdh!e`EX.tQ0ITPUB个人空间 EouX(DZ:b&q
import com.opensymphony.xwork2.ActionSupport;
+LG[.S1Pd p0import data.User;ITPUB个人空间%LC_2Z P'S_
ITPUB个人空间 ^/u)SI8PV
public class NewValidateAction extends ActionSupportITPUB个人空间4e?2Yz*a*`GG
{
lX nb0G NC7XH I0        private String msg;ITPUB个人空间4R yqh8^ RE3Yd+x
        private int age;ITPUB个人空间.\p+DE7Y^!P St
        private User user;ITPUB个人空间VQ!u,NU9n
        public String getMsg()
Yx,F)Nl7D8L0        {
|R(x M6L0                return msg;ITPUB个人空间"w VmJ Y$V-R
        }ITPUB个人空间~;m7@^M(P

8g-h G4a1i3J0        public void setMsg(String msg)ITPUB个人空间Xc.`bf|%e
        {ITPUB个人空间Og8N`X+k Y
                this.msg = msg;
$pI/r]/y7A.p0        }ITPUB个人空间2E,L7Gba[#|
        public int getAge()ITPUB个人空间}3P P5\r!C+k me
        {ITPUB个人空间!KiX\l]
                return age;ITPUB个人空间0T"bEV{"Wq
        }
2W*w Ne1|,D[0        public void setAge(int age)
@e&Ib/HTe8y0        {
K$F/Y s H}#k:_)GZ0                this.age = age;ITPUB个人空间0X x2v*z1ef
        }ITPUB个人空间n3t$Z/gQd7B
        public User getUser()
5IA'|"T!hT^ p q0        {
2n3^I)K0NGY2J%q0                return user;
6kyX:vEAT CFL4a0        }ITPUB个人空间/U7h3[ E9f)R#Rh/[a}b
        ITPUB个人空间J qm0nv
        public void setUser(User user)ITPUB个人空间w H#W G.k-p{
        {ITPUB个人空间;dN0FHG
                this.user = user;
rX!l*?H8\0        }ITPUB个人空间^p"g/PFU)[
}ITPUB个人空间0TrK7p&k.P;YP

]qCc'YR,V]6N0如果要验证NewValidateAction中的user属性,可以使用visitor验证器。操作过程如下:ITPUB个人空间)kE&f5iy
ITPUB个人空间4CgP'A@FU2|
首先在NewValidateAction-validation.xml中加入一个<field>标签,代码如下:
W&H| {!uL i(@ G0
5T%@ y*ZI!PF q0<?xml version="1.0" encoding="UTF-8"?>
.W'_b0k1GE0<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">ITPUB个人空间lw | [7u
<validators>ITPUB个人空间+L4?n`vw Du n"i
    ... ...
KP3}MI$l4uiW7c0        <field name="user">ITPUB个人空间(G LJ Vhjs9O K
        <field-validator type="visitor">
I&|AgSNz3}a)g0                        <param name="context">abc</param>
xqK;x ZV P0                        <param name="appendPrefix">true</param>ITPUB个人空间[&a;V4q U&Xx JD
                        <message>User:</message>
8Vojp |^_~0                </field-validator>ITPUB个人空间vk qlF+ZYT
        </field>
yz3B UF_0</validators>
U+xa\DR0ITPUB个人空间){.JS#EW[ fV'z0d6U'e
其中context参数将作为验证User类属性的文件名的一部分,如user属性返回一个User对象,那么用于验证User对象属性的文件名为User-abc-validation.xml。这个文件要和User.class文件在同一个目录中。appendPrefix表示是否在字段里加user,如果为true,Struts2就会使用user.name在form提交的数据中查找要验证的数据。这个属性的默认值是true。如果出错,Struts2会将<message>标签中的信息加到User-abc-validation.xml文件中的相应错误信息前面。
.~tBT$n'T3dT/i0
nk3d g G`!^,i9Fl0User-abc-validation.xml文件的内容如下:ITPUB个人空间l @1No|P+T9W4T

4uS#D/lE*I"q#}/bd-k0<?xml version="1.0" encoding="UTF-8"?>
y)Z#_!y LF lF0<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
9\*{O5Mt(gP0<validators>ITPUB个人空间.csd%` s'^%ghm
        <field name="name">ITPUB个人空间7x2J1O J+rbX
                <field-validator type="requiredstring">
h3OY'M'qoi m0                        <message>请输入name</message>ITPUB个人空间~2KLpm6J
                </field-validator>
.[P z"U$i S0T x0        </field>ITPUB个人空间Cs {zB
        <field name="age">
$J$bQl'qC/l;w0                <field-validator type="int">
lS#C-Wsm}0                        <param name="min">5</param>
P%Ol;m:~X*F.B0                        <param name="max">20</param>
!GXOe$u4gu0                        <message>
Q+\`&?*bG0                                必须在 5至20之间
W,H n1gB/I9DH0                        </message>
&X"\ t L0m K*j5V/v0                </field-validator>ITPUB个人空间(b:ps8}TWA$W
        </field>ITPUB个人空间 \ TZeOK6Y
</validators>
#O!l!vk4D0@r*L9C0
&]&~2Qw!W`)eGU m0ITPUB个人空间-@*o2aH Tng
    下面修改validate_form.jsp,代码如下:ITPUB个人空间G\&|I*B

juj0x J+J0<s:form. validate="true" action="new_validate" namespace="/test" >ITPUB个人空间*sVS2g/W
     <s:textfield name="msg" label="姓名"  />ITPUB个人空间+i Y#[@nd~?
     <s:textfield name="age" label="年龄"/>ITPUB个人空间nR{#b/A-L|
     <s:textfield name="user.name" label="姓名1"  />ITPUB个人空间H]me-N
     <s:textfield name="user.age" label="年龄1"/>
[zb'H1o C3F}0    <s:submit/>ITPUB个人空间3|E.c7N'O `
</s:form>
7j5ljc-piu0ITPUB个人空间CxS4T5H/N&G0E
大家可以看到,最后两个<s:textfield>的name属性是user.name和user.age,正好是加了前缀的。ITPUB个人空间Z^K!?p

/n1{0s3vjn"\&H0现在重新访问  http://localhost:8080/validation/validate_form.jsp,验证界面如图2所示。
;mVI.n"r/p0
Y MTu6y!S.C0
%u(}T(O:k|S/x0ITPUB个人空间^B~ Ct
03.jpg

K"b8KW:|Ad"PlL0ITPUB个人空间S Yf#pw6j\\*uI
图2     ITPUB个人空间T Wh1`%?-j"W

H C"S8I'ijZ0    经笔者测试,使用visitor无法以客户端验证的方式来验证user属性,但NewValidateAction中其他的属性可以使用客户端测试。
+YawX.Vfdj.q0
;CR6fA&]%v!z0[本帖最后由 银河使者 于 2008-4-21 23:09 编辑]

TAG:

我来说两句

(可选)

日历

« 2008-10-12  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 12397
  • 日志数: 119
  • 建立时间: 2008-02-08
  • 更新时间: 2008-10-01

RSS订阅

Open Toolbar