Seam Framework Modalpanel reRender Problemi

Merhaba arkadaşlar bu ilk yazım kusurlar olursa affola:)

Seam hepimizin bildiği gibi çok populer bir framework, bizde projemizde seam 2( jsf-1.2 ) ve Richfaces kullanıyoruz. Geçen şöyle bir problemle karşılaştım JSF dışardan aldımız inputları 4 katmanlı bir mimaride kabul eder. Yani 1. katman clientın localinde bulunanan inputun girildi yer, 2. ve 3. katman validasyonların,convert işlemlerinin ve hata mesajlarının oluşturulduğu katman  son katman yani 4. katman serverdaki java beanmizdeki propertiye set edildiği katmandır. Benim yaşadığım problem 2. ve 3. katmanda gerçekleşen bir hata.

Hata: Rich modal panelde bir formdaki tüm inputları gerektiği gibi girip submit ediyorum veritabanına kaydoluyor, burda sorun yok. Sonra zorunlu alanları boş bırakıyorum yada Integer bir alana String giriyorum submit etmeye çalıştımda form submit olmuyor uyarı mesajları çıkıyor(2. ve 3. katmanı geçemiyor.) yine sorun yok, öyle olması gerekiyor zaten. Ancak son durumdayken modal paneli kapatıp tekrar açtımda alanları hala kırmızı olduğu uyarı mesajlarının silinmediğini görüyorum çalışma olarak problem yaşamıyorum ama validation mesajlarının kalması pek hoş olmuyor(Müşteri kabul etmez böyle:))

Çözüm: Araştırmalar sonucunda sorunun çözümü için 2. ve 3. katmandaki uyarı mesajlarının bir şekilde temizlenmesi gerekiyor. Peki nasıl bunu yazılmış kodu bozmadan kendimi yormadan temizlerim?

Lafı çok uzattım çözüme geçiyorum, modalpanelleri açan butonlara bir actionlistener yazıp bu listenerla modal panel açılmadan modalpanelin tüm inputları tektek bir or döngüsünden geçirerek temizlemek.

 

 
public class A4JFormReset implements ActionListener {
 
     @Override
     public void processAction(ActionEvent event) throws AbortProcessingException {
          
 
          FacesContext facesContext = FacesContext.getCurrentInstance();     
          AjaxContext ajaxContext = AjaxContext.getCurrentInstance(facesContext);
          UIComponent root = facesContext.getViewRoot();          
 
          ajaxContext.addRegionsFromComponent(event.getComponent());
          Set ids = ajaxContext.getAjaxAreasToRender();          
 
          for (String id : ids) {
               UIComponent form = findParentForm(root.findComponent(id));
               if (form != null) {
                    clearComponentHierarchy(form);
               }
          }     
 
     }
     
     public UIComponent findParentForm(UIComponent component) {
 
          if (component instanceof UIForm) {
               return component;
          }          
 
          if (component == null) {
               return null;
          }          
 
          return findParentForm(component.getParent());
     }
 
     public void clearComponentHierarchy(UIComponent pComponent) {
 
          if (pComponent instanceof EditableValueHolder) {
               EditableValueHolder editableValueHolder = (EditableValueHolder) pComponent;
               editableValueHolder.setSubmittedValue(null);
               editableValueHolder.setValue(null);
               editableValueHolder.setLocalValueSet(false);
               editableValueHolder.setValid(true);
          }          
 
          for (UIComponent child : pComponent.getChildren()) {
               clearComponentHierarchy(child);
          }
 
     }
 
}

 

Peki bu listeneri nasıl çağıracam oda aşağıda

 

	        
		       
		   	

İşte bu kadar.

 

Kolay Gelsinn...



Etiketler :




0.000164985656738 | 3.5