7 Kasım 2012 Çarşamba

Wicket ile Formlar

HTML ile oluşturulan formların içine konulabilecek elementler burada gösteriliyor.Aşağıya da buradan aldığım bir örnek form resmini ekliyorum.

Peki wicket formlar eklenen elementleri nasıl bir sınıf hiyerarşisine almış ?
Herşey FormComponent sınıfı ile başlıyor. Bu sınıfın altında derin bir hiyerarşi var. Aşağıdaki şekili buradan aldım ve wicket çatısı altında FormComponent'in nereye oturduğunu kabaca görmek mümkün.

WebMarkupContainer
FormComponentlerin türediği WebMarkupContainer isminden de anlaşıldığı gibi kendisi görünür olmayan ancak diğer bileşenleri içerebilen bir sınıf. Apache Wicket and Single Page Application (SPA) - How to create Panels from Menu? sorusunda bu sınıfa başka bir bileşen ekleyip çıkarabilme özelliği gösterilmiş.

Form Submit
Form sınıfının kendi onSubmit metodu var. Bu metod ile formun modeline erişmek mümkün. Örnek :
@Override
protected void
onSubmit() {
    Item item = (Item) getModelObject();
    dao.storeItem(item);
    setResponsePage(page);
}
Form İşleme Silsilesi
Bir form submit edilince buradan aldığım şekilde de görüldüğü gibi bir işlem silsilesinden geçiyor.


Bir formu submit etmek için aşağıdaki sınıflar kullanılabilir

SubmitLink, AjaxSubmitLink, Button, AjaxButton sınıfları ile gönderilen bilginin Converter veya Validator'lerden geçmeden ve de model nesnelerini güncellemeden çalışması için setDefaultFormProcessing metodunun false parametresi ile çağırılması gerekir. Simple way to reload page with form data filled with previous data sorusundan aldığım cevap aşağıda.


Converter
Wicket ile kullanılan Converter'ların ilişkisini gösteren bir şekli aşağıya ekledim.
How Wicket models works with generic? sorusunun cevabında da DefaultConverter daha iyi açıklanıyor.

Aşağıdaki kod parçasını buradan aldım ve bir converter'ın application sınıfına nasıl eklendiği ve nasıl çalıştığını gösteriyor.

Form işlenirken formdaki tüm komponentlerin convertInput() metodu çağırılır. Her komponent HTML ile gelen ham stringi bir Java nesnesine çevirir. Eğer çevirme işlemi başarılıysa form işleme silsilesi devam eder. Buradan aldığım açıklama da faydalı.

Validator
Burada dikkat edilmesi gereken nokta "Validate Input"  adımında IValidator arayüzünden türeyen sınıfların kullanılması. Eğer istenirse bu arayüzden başka sınıflar türeterek doğrulama işlemini yapmak ta mümkün.

Aşağıdaki şekilde notlarımı görebilirsiniz.
StringValidator
Bu sınıf ile girilebilen veriye üst sınıf koyabiliriz. Örnek :
TextArea<String> comments = new TextArea<String>("comments");
comments.add(StringValidator.maximumLength(250));

Form Input Elementlerine Özellik Eklemek
AttributeModifier sınıfı ile bir komponente yeni özellikler eklemek mümkün. Örneğin Label sınıfına tooltip eklemek için Display Wicket panel content as tooltip on mouse hover of a page component sorusundaki kod kullanılabilir.


Form Input Elementleri

Bu başlık altında wicket ile kullanılabilen form elementlerine bakacağım.

AutoCompleteTextField
Aşağıda AutoCompleteTextField elementinin sınıf hiyerarşisini görmek mümkün. Tek yapılması gereken getChoice metodunu yazmak.
Button
Her formda submit işlemini yerine getiren bir button bulunur.

CheckGroup
Aşağıda CheckGroup'un nasıl kullanılacağını gösteren bir şekil var.

Wicket : Check of CheckGroup not getting the selected options and perform the submit actionsorusunu daokumak faydalı.

CheckBox
How to unselect checkbox in chrome browser sorusundan aldığım örnek aşağıda.
Html için :

<input type="checkbox" wicket:id="1" />
Java için ise :
Checkbox c1 = new CheckBox("1").setOutputMarkupId(true);
c1.add(new AjaxFormComponentUpdatingBehavior("onclick"){
    protected void onUpdate(final AjaxRequestTarget target) {
        if (Boolean.TRUE.equals(c1.getModelObject()){
            c2.setModelObject(Boolean.FALSE);
            c3.setModelObject(Boolean.FALSE);
            target.addComponent(c2);
            target.addComponent(c3);
        }
    }
});

Wicket checkbox that automatically submits its changed value to domain object sorusunda ise checkbox her değiştiğinde belli bir kod parçası çalışsın isteniyorsa wantOnSelectionChangedNotifications() metodunun kullanılması gösterilmiş.

DateTime
DateTime için wicket-extensions kütüphanesinde iki seçenek var. Birincisi org.apache.wicket.extensions.yui.calendar.DateTimeFied.

Diğeri ise wicket.extensions.markup.html.form.DateTextField ve bununla beraber kullanılan org.apache.wicket.extensions.yui.calendar.DatePicker ise popup takvim gösterimini yapıyor.Bu sınıf ta YUI kütüphanesini kullanıyor. DateTextField kullanmak için aşağıdaki gibi bir html lazım.


Bu yazı devam edecek...

Hiç yorum yok:

Yorum Gönder