Play Framework 框架 验证范本模板Word文档格式.docx
《Play Framework 框架 验证范本模板Word文档格式.docx》由会员分享,可在线阅读,更多相关《Play Framework 框架 验证范本模板Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
stextualdescription。
Themessagecanbeaplainmessageorrefertoakeyfromamessagebundle(typicallyforinternationalizationsupport)。
下面我们看一下怎样去验证一个简单的HTTP参数。
Let’sseehowtovalidateasimpleHTTPparameter:
publicstaticvoidhello(Stringname){
validation。
required(name);
...
}
这段代码检查name变量被正确的设置了,如果不是的话,相应的信息会被增加到当前的错误集合中去。
Thiscodechecksthatthenamevariableiscorrectlyset.Ifnot,thecorrespondingerrorisaddedtothecurrenterrorscollection。
你可以重复这个操作去验证每一个你需要的变量。
Youcanrepeatthisoperationforeachvalidationyouneed:
publicstaticvoidhello(Stringname,Integerage){
required(age);
min(age,0);
。
.。
}
重新得到错误信息
Retrievingerrormessages
在每一个验证结束,你可以检查是否错误都被创建并显示出来了.
Attheendofthevalidationyoucancheckifanyerrorshavebeencreatedanddisplaythem:
publicstaticvoidhello(Stringname,Integerage){
required(name);
min(age,0);
if(validation.hasErrors()){
for(Errorerror:
validation.errors()){
System。
out。
println(error.message());
}
假设name和age是null,那么将会显示出:
Assumingthatnameandagearenull,thiswoulddisplay:
nameisrequired
ageisrequired
默认的消息是key和message集合中key一致的,所以在conf/messages文件中你可以看到:
Defaultmessagesarekeysthatrefertothemessagebundle。
Sointhe**conf/messages**fileyouwillhave:
validation.required=%sisrequired
你可以改变这些默认的消息,然后再每一个项目中覆盖它,%s占位符会被错误的key所替代,你可以使用error.message(Stringfield)方法覆盖它。
Youcanchangethisdefaultmessageandoverrideitforeachapplicationlanguage.The**%s**placeholderwillbereplacedbytheerrorkey。
Youcanoverrideusingthe**error。
message(Stringfield)**method.
例如:
Forexample:
Errorerror=validation.required(name)。
error;
if(error!
=null){
System.out.println(error。
message("
Thename”));
你还可以为每一次检查明确指定不同的信息.
Youcanalsospecifyadifferentmessageforeachcheck:
message(”Fillthename!
"
).error;
=null){
System.out。
println(error。
message());
再模板中显示错误信息
Displayingerrorsinthetemplate
再大多数情况下,你想让错误消息显示在视图模板中,你可以在模板中使用errors对象使用它们,一些tag帮助你显示这些错误。
Inmostcasesyouwanttodisplaytheerrormessagesintheviewtemplate。
Youcanaccesstheminthetemplateusingthe**errors**object.Sometagshelpyoutodisplaytheerrors:
让我们看个例子。
Let’sseeasample:
publicstaticvoidhello(Stringname,Integerage){
validation.required(age);
render(name,age);
现在是模板.
andnowthetemplate:
#{ifErrors}
<
h1>
Oops.。
。
<
/h1>
#{errors}
li>
${error}〈/li〉
#{/errors}
#{/ifErrors}
#{else}
Hello${name},youare${age}。
#{/else}
但是在实际的应用中,你想显示原先的form表单.所以你将有2个action,显示form表单,还要处理POST.
Butinarealapplicationyouwanttoredisplaytheoriginalform.Soyouwillhavetwoactions:
onetodisplaytheformandanotheronetohandlethePOST.
当然如果有错误发生的话你需要重新跳转到第一个action,但是验证会发生在第二个action中,这样你需要一些小技巧在跳转之前保持错误信息。
使用validate。
keey()方法,它可以为下个action保存错误集合。
Ofcoursethevalidationwilloccurinthesecondactionandifsomeerroroccursyouwillhavetoredirecttothefirstaction。
Inthiscaseyouneedaspecialtricktokeepyourerrorsduringtheredirect.Usethe**validation.keep()**method。
Thiswillsavetheerrorscollectionforthenextaction.
让我们看一个真实的例子。
Let'
sseearealsample:
publicclassApplicationextendsController{
publicstaticvoidindex(){
render();
}
publicstaticvoidhello(Stringname,Integerage){
validation.required(name);
validation.min(age,0);
if(validation。
hasErrors()){
params。
flash();
//addhttpparameterstotheflashscope
validation.keep();
//keeptheerrorsforthenextrequest
index();
render(name,age);
Andthe**view/Application/index.html**template:
#{ifErrors}
〈h1>
Oops。
..<
#{errors}
${error}〈/li〉
#{/ifErrors}
#{form@Application。
hello()}
div〉
Name:
〈inputtype="
text”name=”name”value=”${flash。
name}"
/〉
〈/div〉
div>
Age:
inputtype="
text”name="
age"
value=”${flash。
age}"
/〉
/div>
〈div〉
〈inputtype="
submit"
value="
Sayhello"
〈/div>
#{/form}
Youcancreateabetteruserexperiencebydisplayingeacherrormessagenexttothefieldthatgeneratedtheerror:
#{ifErrors}
/h1〉
#{/ifErrors}
#{form@Application.hello()}
inputtype=”text"
name="
name"
${flash.name}"
spanclass=”error"
>
#{error’name’/}〈/span>
inputtype=”text”name=”age”value=”${flash。
age}"
spanclass=”error”>
#{error’age’/}〈/span>
value=”Sayhello"
#{/form}
使用注解
Usingannotations
你可以使用注解做相同的事。
Youcanuseannotationstodothesamething:
publicstaticvoidhello(@RequiredStringname,@Required@Min(0)Integerage){
if(validation。
params.flash();
validation.keep();
index();
render(name,age);
验证对象
Validatingobjects
使用注解你可以轻松的为你的model对象增加约束,让我们重写前一个例子,使用User类。
Usingannotationsyoucaneasilyaddconstraintstoyourmodelobjects。
Let’srewritethepreviousexampleusingaUserclass。
Firstthe**User**class:
packagemodels;
publicclassUser{
@Required
publicStringname;
@Required
@Min(0)
publicIntegerage;
然后修改helloaction。
Thenthemodified**hello**action:
publicstaticvoidhello(@ValidUseruser){
params。
flash();
keep();
最后增加一个修改后的form表单
Andfinallythemodifiedform:
#{ifErrors}
h1〉Oops...<
#{/ifErrors}
#{form@Application。
〈div>
Name:
〈inputtype=”text”name=”user.name"
${flash[’user。
name'
]}"
〈spanclass=”error"
〉#{error’user.name’/}<
/span〉
text"
user。
age”value="
${flash['
age’]}"
〈spanclass="
error"
#{error’user。
age'
/}〈/span〉
inputtype=”submit”value="
#{/form}
自定义验证
Customvalidation
如果在play。
validation没有发现你需要的验证,你可以自己写。
然后使用@CheckWith注解绑定到你自己的Check实现里去。
Can'
tfindthevalidatoryouneedinthe**play。
validation**package?
Writeyourown.Youcanusethegeneric**@CheckWith**annotationtobindyourown**Check**implementation.
例如
Forexample:
@CheckWith(MyPasswordCheck.class)
publicStringpassword;
staticclassMyPasswordCheckextendsCheck{
publicabstractbooleanisSatisfied(Objectuser,Objectpassword){
returnnotMatchPreviousPasswords(password);