Sansür, bir toplumun kendine olan güvensizliğini yansıtır ve otoriter rejimlerin belirgin bir özelliğidir.

--Potter Stewart

28.04.2008

JSF DataTable Bileşeni için çoklu satır seçimi..

JSF’de dataTable bileşenini kullanarak iş modelinde yer olan sınıfıma ait nesneleri tabloda listeleme ve herbir satırına çoklu seçimi olanaklı kılacak seçim kutucuğu (checkbox) iliştirme gereği duydum. Her ne kadar ilk akla gelen ve kolay çözüm iş modeli sınıfıma ekrandaki seçim kutucuğuyla ilişkili Boolean tipinde bir nitelik eklemek olsa da iş modeli tasarımına aykırı olması sebebiyle başka çözüm yolları aradım:


public class Baglanti {

private Long id;

private String ip;

private Integer port;

private Boolean checkBox;

// Getters/Setters

...

}

public class ViewBean {

private List<Baglanti> baglantilar = new ArrayList<Baglanti>();

...

}

<h:dataTable id="kurumBaglantilar" rows="10"

value="#{viewBean.baglantilar}" var="baglanti" >

<h:column>

<h:selectBooleanCheckbox id="lbl_check"

value="#{baglanti.checkBox}"/> </h:column>

<h:column>

<h:outputText value="#{baglanti.ip}" />

</h:column>

<h:column>

<h:outputText value="#{baglanti.port}" />

</h:column>

...

</h:dataTable>


Akla gelen ikinci çözüm ViewBean içinde ayrı ayrı liste veri yapısı içinde veri listesini ve seçim kutucuğu listesini tutarak JSF sayfasında görünümü ayrı dataTable’lar ile ele almak; iş mantığında da iki listeyi index tabanlı birbirleriyle ilişkilendirmek (seçim kutucüğü listesinde n. Boolean true ise veri listesinde n. veri seçilmiştir) olsa da iki ayrı dataTable’ı yönetme zorluğundan daha iyi bir çözüm için araştırmaya devam ettim:


public class Baglanti {

private Long id;

private String ip;

private Integer port;

// Getters/Setters

...

}

public class ViewBean {

private List<Baglanti> baglantilar = new ArrayList<Baglanti>();

private List<Boolean> checkBoxList = new ArrayList<Boolean>();

}

<h:panelGrid>

<h:dataTable id="kurumBaglantilarSecim" rows="10"

value="#{viewBean.checkBoxList}" var="checkBox" >

<h:column>

<h:selectBooleanCheckbox id="lbl_check"

value="#{checkBox}"/>

</h:column>

</h:dataTable>

<h:dataTable id="kurumBaglantilar" rows="10"

value="#{viewBean.baglantilar}" var="baglanti" >

<h:column>

<h:outputText value="#{baglanti.ip}" />

</h:column>

<h:column>

<h:outputText value="#{baglanti.port}" />

</h:column>

...

</h:dataTable>

</h:panelGrid>


En sonunda bulduğum bir blog hem sorunuma çözüm oldu hem de dataTable bileşenin yönetilmesiyle ilgili yeni şeyler öğretti. Soruna çözüm olarak seçim kutucuklarını Map veri yapısıyla ViewBean içinde saklıyor ve dataTable içinde erişimi veri satırının biricik bilgisini kullanarak yapıyor:


public class Baglanti {

private Long id;

private String ip;

private Integer port;

// Getters/Setters

...

}

public class ViewBean {

private List<Baglanti> baglantilar = new ArrayList<Baglanti>();

private Map<Long, Boolean> checkBoxMap = new HashMap<Long, Boolean>();

}

<h:dataTable id="kurumBaglantilar" rows="10"

value="#{viewBean.baglantilar}" var="baglanti" >

<h:column>

<h:selectBooleanCheckbox id="lbl_check"

value="#{viewBean.checkBoxMap[baglanti.ip]}"/> </h:column>

<h:column>

<h:outputText value="#{baglanti.ip}" />

</h:column>

<h:column>

<h:outputText value="#{baglanti.port}" />

</h:column>

...

</h:dataTable>


Daha detaylı bilgi için söz konusu blog girdisinin adresi de şu şekilde:

http://balusc.blogspot.com/2006/06/using-datatables.html