Server side struts validation'ı çalıştırmaya çalışırken gözden kaçan ufak ama çok zaman alan hatalarla yüzleştim. Bunları not almakta yarar görüyorum. Server side validation'ın bana uygun olmadığını düşünerek client side validation'a döndürdüm.
Bunları da not alalım.
validator-rules'ta zaten tanımlı rule'lar geliyor. Bunlar dışında pek bir rule'a ihtiyaç olacağını sanmıyorum. Ama ihtiyaç olduğu sürece custom rule'lar yazılma imkanı var.
validation.xml'de ise asıl validation adımlarını belirtiyoruz. Burada validator-rules'ta tanımlanmış olan rule'lara depend ediyoruz.
En basitinden required bir field için eklenen kısımı örnek verelim:
<form-validation>
<formset>
<form name="xxxForm">
<field property="zipCode"
depends="required" >
<arg0 key="title.address.adr4"/>
</field>
</form>
</formset>
</form-validation>
validator-rules.xml'deki kullanılmayacak rule'ları temizlemekte yarar var. Buna sonra da değineceğim. validation.xml ve validator-rules.xml'le işimiz bittikten sonra bu xml'lerdeki msg'ları resource properties dosyamıza eklememiz gerekiyor. validator-rules.xml'de msg tag'iyle kullanılan mesajlar içindeki argümanlar da validation.xml'de arg tag'iyla, birden fazla varsa da arg0, arg1 gibi taglerle belirtiliyor. Hem msg hem de arg içindeki key'lerin resource properties dosyamızda tanımlı olmasına dikkat etmeliyiz.
struts-config.xml içinde tanımlanmış olan form ismini validation.xml'de kullanmak gerekiyor.
Sırada, bu validation'ın kullanılacağı ekranda yapılacak değişiklikler var. Öncelikle jsp'nin head kısmına şu bilgiyi eklemeliyiz.
<html:javascript formName="xxxForm"/>
Aynı ekranımızın onSubmit'ine de aşağıdaki gibi js fonksiyon ismini ekliyoruz. Buradaki ismin struts-config'de tanımlı olan form ismiyle aynı olduğuna dikkat edilmeli. Eğer struts-config'de bu form ismi küçük harfle tanımlanmışsa burada büyük harfle başlaması gerektiğini de belirtelim.
<html:form method="post" action="/xxxAction.do" onsubmit="return validateXxxForm(this)">
Bu değişiklikler yapıldıktan sonra client side validation'ın çalışması gerekiyor. Bunu server side'a çevirmek için ise şu değişiklikler gerekiyor.
Öncelikle form'umuzun ActionForm'a değil de ValidatorForm'a extend etmesi sağlanmalı.
Ardından struts-config'deki action mapping'imiz içinde bir input tanımlamalıyız.
<action path="/xxxAction"
type="com.xxx.action.XxxAction"
name="xxxForm"
scope="request"
input="/jsp/xxx/xxxMain.jsp">
validate'i de true set ettiğimiz zaman validation'dan geçemeyen ekranımız input'ta tanımlı olan sayfaya düşecektir.
Akış da şöyle: validate false set edilmediği zaman Struts validate metodunu çağırır. Validate'ten ActionErrors objesi döner. Eğer bu obje null değilse requesti input'ta tanımlı olan ekrana yönlendirir. Eğer ActionErrors objesi null gelmişse Struts validation'ı tamamlar ve execute metoduna devam eder.
Eğer ekran açılışını da aynı action mapping üzerinden yapıyorsa ekran açılırken de validation yapmaya çalışacaktır ve büyük ihtimalle -validation kurallarının nasıl olduğuna bağlı olarak tabi- sürekli input'a düşecektir. O nedenle, server side validasyon için ekran açilisindaki action path'i ile formu submit ettigimizde gitmesini istedigimiz action path'i ayri ayri tanimlamaliyiz.
Client side validation'a dönecek olursak, yukarıda bahsettiğim validator-rules'ta kullanılmayacak kuralların silinmesinin nedeni, client side validation kullanılan ekran açıldığında view source yaparsanız ortaya çıkıyor. Validator-rules'ta tanımlı kuralların ekran tarafında javascript olarak oluşturulduğunu ve tutulduğunu göreceksiniz.
Hakkımda
- Mahir Tarlan
- Istanbul, TR
Thursday, 29 November 2007
struts validation
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment