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

Struts2教程4:使用validate方法验证数据

上一篇 / 下一篇  2008-04-17 17:23:22 / 个人分类:struts2

查看( 183 ) / 评论( 1 )
本文为原创,如需转载,请注明作者和出处,谢谢!ITPUB个人空间s'\9O9cw+ad!X

s|!?3JdWP/x0
Struts2中最简单的验证数据的方法是使用validate。我们从ActionSupport类的源代码中可以看到,ActionSupport类实现了一个Validateable接口。这个接口只有一个validate方法。如果Action类实现了这个接口,Struts2在调用execute方法之前首先会调用这个方法,我们可以在validate方法中验证,如果发生错误,可以根据错误的level选择字段级错误,还是动作级错误。并且可使用addFieldErroraddActionError加入相应的错误信息,如果存在ActionField错误,Struts2会返回“input”(这个并不用开发人员写,由Struts2自动返回),如果返回了“input”,Struts2就不会再调用execute方法了。如果不存在错误信息,Struts2在最后会调用execute方法。
e}U{ V0这两个add方法和ActionErrors类中的add方法类似,只是add方法的错误信息需要一个ActionMessage对象,比较麻烦。除了加入错误信息外,还可以使用addActionMessage方法加入成功提交后的信息。当提交成功后,可以显示这些信息。ITPUB个人空间KPE`D6Mi
以上三个add方法都在ValidationAware接口中定义,并且在ActionSupport类中有一个默认的实现。其实,在ActionSupport类中的实现实际上是调用了ValidationAwareSupport中的相应的方法,也就是这三个add方法是在ValidationAwareSupport类中实现的,代码如下:
{,P9v@:X CB'J N@0
IF2I#Bos7V)m0private final ValidationAwareSupportvalidationAware = new ValidationAwareSupport();
~+o k9F.P:q f*o0ITPUB个人空间#s I[%T0~-i1l/{0f5K
public void addActionError(String anErrorMessage)
`6n&I6W-KbxcJ6p L0{ITPUB个人空间 [E [%TZ2aPH6d
validationAware.addActionError(anErrorMessage);ITPUB个人空间~D2H4qs
}
(ulQ~ ^0public void addActionMessage(StringaMessage)ITPUB个人空间7PH)^"xM(OY5J
{ITPUB个人空间2[!s ]!oiR x6w
validationAware.addActionMessage(aMessage);ITPUB个人空间8bvW+R6S0?D9Z
}
&U DxFq0public void addFieldError(String fieldName,String errorMessage)
,f:S R8@&{1R"n0{ITPUB个人空间pP:@.Y;BGA1]
validationAware.addFieldError(fieldName,errorMessage);
GBe/f*g(hU0}
FLLP{o?0
sOs-Ui`9t0下面我们来实现一个简单的验证程序,来体验一个validate方法的使用。
/L].j_ F~0ITPUB个人空间 X&KwDhW}!f|
先来在Web根目录建立一个主页面(validate.jsp),代码如下:
Yg-R? iQ0ITPUB个人空间i/fnm&G9d!G-O2l
<%@ page language="java"import="java.util.*" pageEncoding="GBK"%>ITPUB个人空间*h#\M eZZ^?
<%@ taglib prefix="s"uri="/struts-tags" %>
Xcw#pqmK:K+|z0<html>ITPUB个人空间 iEH%uv
ITPUB个人空间 `tV?(eI5C_&fc|.\
<head>ITPUB个人空间{^_ L3o)H,c

#rJC9z#jS-d0<title>验证数据</title>ITPUB个人空间0t?2I8Y"l+|.r*~1J
ITPUB个人空间*a+vyr{Ev0Q I
</head>ITPUB个人空间 fCZ(o f
ITPUB个人空间t1{#n:WQ\ U+Ct
ITPUB个人空间4`[(n \3X.k3R!~,u'Z
ITPUB个人空间C+AsD1_.\
<body>ITPUB个人空间 k DOY)[+^m3\ Om]
ITPUB个人空间X(}9AsO S
<s:actionerror/>
ITPUB个人空间XOLG7[

/K.V({pd.rr3n0<s:actionmessage/>

$Z2VP&I+W0kgq |0
+p!q s%Gi0<s:form. action="validate.action"
NwE6N2Xg0theme="simple">
y_,Fh;Eexj0
mWT.dBV(G9w0输入内容:<s:textfieldname="msg"/>
pHX4xK2B0
_0EQ;ZK7eb|%Y*eB0<s:fielderrorkey="msg.hello" />
j C:Z8a4[L7A0
b `fa~o1t-BeC k7k0<br/>ITPUB个人空间%bNer-A

/G f0^OO d%a0<s:submit/>
Qz]2k?6H tx? i0ITPUB个人空间W2f-O D+|
</s:form>
.SV8L(XK1u*K)k&N0
QdOqz/|3q4LN0</body>
l7zNp }c;C5p-~0</html>
QPE OF0
_5CQ N4{1Jn0在上面的代码中,使用了Struts2tag<s:actionerror><s:fielderror><s:actionmessage>,分别用来显示动作错误信息,字段错误信息,和动作信息。如果信息为空,则不显示。
%gx*g!\4etTJ0
R#R r+j!cH1HLs$N t0现在我们来实现一个动作类,代码如下:
,l|tr*p^ H `,a J/SZ#R1o0ITPUB个人空间_F[3d$bx)BR
package action;ITPUB个人空间3ea1h(JY HI
ITPUB个人空间.Wr(e`S1_M
import javax.servlet.http.*;ITPUB个人空间9] Vw YL?\

G"o9d|/bq:X]0importcom.opensymphony.xwork2.ActionSupport;ITPUB个人空间 BXis&t]
import org.apache.struts2.interceptor.*;
vYz4Xa-T0ITPUB个人空间4mS2w(oWw;`^
public class ValidateAction extendsActionSupportITPUB个人空间 y2X8a U$m/SsT
{
4gO;m(]-oq0e2m${0
7H$x m6}{8O dtQ ]X0privateString msg;
i7Q$~ l6qm4c0? X0
!g%pd m f+k0publicString execute()
5@ D!T*_'yCF0
1TI g^ b0{ITPUB个人空间/?)xe%R,q$l
ITPUB个人空间k.\FKL[
System.out.println(SUCCESS);ITPUB个人空间 _ ?"BO5~ ] TOi

#W&|c,Em$i!{0returnSUCCESS;
uFA.L3T%}n/S0ITPUB个人空间x#g n4S[ VLB!o
}
\kLI)t@0b*^0
2mT:t:]W0publicvoid validate()ITPUB个人空间7d8^ u,vq;F{-|r r
ITPUB个人空间 JUh/I ysj
{ITPUB个人空间 l}2Y6yX\ T4s

7]h EsVH)kw N0if(!msg.equalsIgnoreCase("hello"))ITPUB个人空间B } V&Q/A.\] [

l~? n&H/W#R*Nv S0{
&Gz2i0GUH3j"k([0
^(}'njj6g6T.~h?:E0
1TF v ]~!]3}IV0System.out.println(INPUT);ITPUB个人空间;S4oDA| q8JH)Ev c
ITPUB个人空间6TN0H){Td$@#G

%zs$tMB'|/OC0this.addFieldError("msg.hello","必须输入hello!");
*O3X$Z)R~*LJ:]kI0ITPUB个人空间@A.p7K4Ac~Z7vs

4T1Y6R!? Q]*? D0this.addActionError("处理动作失败!");ITPUB个人空间~&p3_)b5TQ3hL

/C)v7d(GY0}
EGUP%q9n5v2^0
Kf*pQ'~4J3m(B;ZX+N,G0elseITPUB个人空间`] s8xoO
ITPUB个人空间4VE Y&E i
{ITPUB个人空间c*Glw.i
ITPUB个人空间E2[0D}K$`
ITPUB个人空间%jW`*~Fc {
this.addActionMessage("提交成功");
'I%MEd3l#a%FKw0ITPUB个人空间,rGM mNGa)E;W
}ITPUB个人空间x:cSb.|*f+H
ITPUB个人空间 g%S3|OWszA
}
!t:I Z`A(}6t]R%s0
%NazuX Qk0m(G;v0publicString getMsg()ITPUB个人空间&T J"k/D&N\+o4})t+t `

kG%t+h&X\ S5[|0{
n6d KoLcc*vb}0ITPUB个人空间qD2E!|pI8Q
returnmsg;ITPUB个人空间_M*zEs:Akd
ITPUB个人空间/z7~(|.~UM3vp5?
}ITPUB个人空间&q]!XiPum,i
ITPUB个人空间5r#cQV0v p$XJ
publicvoid setMsg(String msg)ITPUB个人空间e m,X)q Y-x)O^

TxT(h4cg`0{
&k/c,r)R,m6`|)`P"]/O0
OMz8Q*h]hm0this.msg= msg;ITPUB个人空间9JC#Gk Hl@9vy Ir
ITPUB个人空间b7\4pt%D NN
}ITPUB个人空间e/c/BJ-?
}ITPUB个人空间{9A/oH0S"C&zJ.?
ITPUB个人空间X%K2V&s:AT0x
大家从上面的代码可以看出,Field错误需要一个key(一般用来表示是哪一个属性出的错误),而Action错误和Action消息只要提供一个信息字符串就可以了。
1p)J|s T.Q#L0最后来配置一下这个Action,代码如下:ITPUB个人空间X(X$l!EU

|8` w:nmv^ E"u0<package name="demo"extends="struts-default">ITPUB个人空间@r&x } tF
<action name="validate"class="action.ValidateAction">ITPUB个人空间y(d-l t#N:Y3s2W q
<result name="success">/error/validate.jsp</result>ITPUB个人空间.V e}-~3zQB'Z
<resultname="input">/error/validate.jsp</result>ITPUB个人空间'i mD1{Max
</action>ITPUB个人空间*Y,g3y4[-y
</package>ITPUB个人空间4Q9m_\r;hm,V"]

/BGb(E#H*}3i J0假设应用程序的上下文路径为demo,则可通过如下的URL来测试程序:ITPUB个人空间 qx [/]Ga TpKe

(k2Zju}2nu)Q0http://localhost:8080/demo/validate.jsp
&Z;D5G/D0U_P4ET }2Y0
Xk)HXu3x)L}|1G0我们还可以使用ValidationAware接口的其他方法(由ValidationAwareSupport类实现)获得或设置字段错误信息、动作错误信息以及动作消息。如hasActionErrors方法判断是否存在动作层的错误,getFieldErrors获得字段错误信息(一个Map对象)。下面是ValidationAware接口提供的所有的方法:ITPUB个人空间g|4Ca(s/h"e8S

j v-bP(t$DD0package com.opensymphony.xwork2;ITPUB个人空间2f#}%Z^-Pa,X

jo WI4{{B*~]I0import java.util.Collection;
CpnV|(}H0import java.util.Map;ITPUB个人空间%u};`;N@0|
ITPUB个人空间9Jsxzp,KJ.oj.x7T
public interface ValidationAwareITPUB个人空间9c)Fzvr8qr4zf
{ITPUB个人空间4OlS gR-{W[
ITPUB个人空间"Y+i'v$IYyAz
voidsetActionErrors(Collection errorMessages);ITPUB个人空间Z&l;RH0a `o3z

3k,JWUn[^:T0{0CollectiongetActionErrors();ITPUB个人空间(RNb,W3C B9Jz0Y&}

qW9t&f1o0
4arDYy4_;e+S0voidsetActionMessages(Collection messages);ITPUB个人空间 dq*tr~1V.T
ITPUB个人空间kd+wh[r8d$g!]
CollectiongetActionMessages();ITPUB个人空间)xQ!u7M zT Ed)f
ITPUB个人空间x%QnFa
voidsetFieldErrors(Map errorMap);
9_ L4B Ji B0
^ k.|#o|B7yf8W/O0MapgetFieldErrors();
6r8U(h&[h!{V5Kk.L0
@IU.Q4|BA/d_0voidaddActionError(String anErrorMessage);
)h0s PO|2YG0ITPUB个人空间9]:R(JONr
voidaddActionMessage(String aMessage);
`2L8e#nr/q4D8H(G0ITPUB个人空间3j0en9h7i0P"Y t!a6Nng8s
voidaddFieldError(String fieldName, String errorMessage);ITPUB个人空间Q\Xc'S

1HZ?|"[4dd3[&^H0booleanhasActionErrors();ITPUB个人空间rY4TJW3gv1h.t*{

jAzjF0booleanhasActionMessages();ITPUB个人空间q[O b2A/J
ITPUB个人空间 K7A-Zq'qzBn
booleanhasErrors();ITPUB个人空间9p7dHFIQq'\G
ITPUB个人空间5O}!P ayl5Q1W
booleanhasFieldErrors();ITPUB个人空间ziJ#c+LfM*l gG~
}
"t T#Q4l!do9{ h ?2Z0ITPUB个人空间 XM9k6A8^1q!TI
ITPUB个人空间(bC3N#r?D `
在以后的文章中将介绍Struts2更高级的验证功能!ITPUB个人空间s(f"E#lo+I_&]c

^9KDg]0

TAG:

carniege的个人空间 carniege 发布于2008-04-18 09:52:44
最好把几个功能发在一个帖子里,这样别人找起来容易
我来说两句

(可选)

日历

« 2008-10-12  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

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

RSS订阅

Open Toolbar