27 Şubat 2015 Cuma

ZK FRAMEWORK İLE JPA KULLANIMI - 2

Önceki yazımda bir form uygulaması yapıp JPA kullanarak Database e kayıt atmıştık.Bu kayıtlar int,varchar ve longblob tipinde datalardı.
Bu yazımda kaydettiğimiz dataların  ZK Frameworkünün Listbox componenti üzerinde nasıl göstereceğimizi ele alacağım.
Şunu söylemeliyim ki data binding olayı ZK ya göre JSF de daha esnek daha anlaşılır ve daha kolay.ZK nın bu işi daha kolaylaştıracağını temenni ederek kodlamaya başlayalım.


kitapListesi.zul

<?page title="Kitap Listesi" contentType="text/html;charset=UTF-8"?>
<?taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c"?>
<zk>
<listbox id="kitapListBox" emptyMessage="Kayıt yok!"
     mold="paging" pageSize="4" width="1000px"
     checkmark="true"                          apply="com.mesutemre.kitapIslemleri.KitapListesiControl"
     model="${win$composer.kitapListModel}">

     <listhead>
          <listheader width="32px" />
                <listheader label="Kitap Adı" align="center"
                          sort="auto(kitapad)" width="190px" />
                <listheader label="Yazar Adı" align="center"
                          sort="auto(yazarad)" width="190px" />
                <listheader label="Kitap Tür" align="center"
                          width="190px" sort="auto(kitaptur)" />
                <listheader label="Kitap Durum" align="center"
                          sort="auto(kitapdurum)" width="190px" />
                <listheader label="Kitap Resmi" align="center"
                          width="190px" />
     </listhead>
     <template name="model">
                <listitem>
                    <listcell />
                    <listcell label="${each.kitapad}" />
                    <listcell label="${each.yazarad}" />
                    <listcell label="${each.kitaptur}" />
                    <listcell label="${each.kitapdurum}" />
                    <listcell>
                          <image content="${c:new2('org.zkoss.image.AImage','',each.kitapimage)}" />
                    </listcell>
                </listitem>
     </template>
  </listbox>
               
</zk>


KitapListesiControl.java

public class KitapListesiControl extends SelectorComposer<Component> {

     private static final long serialVersionUID = 1L;

     private List<Kitaplar> kitapList = new ArrayList<Kitaplar>();
     private ListModel<Kitaplar> kitapListModel;

     @Wire
     private Listbox kitapListBox;

     @Wire
     private Image kitapImageId = new Image();

     KitapIslemleriDao kid = new KitapIslemleriDaoImpl();

     @Override
     public void doAfterCompose(Component comp) throws Exception {
          super.doAfterCompose(comp);
          kitapList = kid.findAllKitaplar();
          kitapListModel = new ListModelList<Kitaplar>(kitapList);
          kitapListBox.setModel(kitapListModel);

     }

     public List<Kitaplar> getKitapList() {
          return kitapList;
     }

     public void setKitapList(List<Kitaplar> kitapList) {
          this.kitapList = kitapList;
     }

}


DAO katmanında ki metodları bir önceki yazımda gösterdiğim için burada tekrar yazmaya gerek duymadım.Ekran aşağıda ki gibi olur.



26 Şubat 2015 Perşembe

ZK FRAMEWORK İLE JPA KULLANIMI - 1


Yeni başlayacağımız bir proje için ZK Framework kullanmaya karar verdik.Öncelikle biraz ZK dan bahsedelim.Bu framework bir ajax framework ü olmakla birlikte tıpkı PrimeFaces gibi bize kullanmamız için componentler verir.Fakat şunu söylemeliyim ki PrimeFaces daki componentler hem kullanılış bakımından hem de sayıca  ZK da ki componentlerden kat be kat üstündür.
Bu framework de zul sayfasında component e verdiğimiz id ile bu componente dair tüm ayarlamaları Java classlarından yapabiliyoruz.Bu size Swing i hatırlatmış olmalı.Yani anlayacağınız Desktop uygulaması yazar gibi Web uygulamaları yazıyorsunuz.
ZK ile alâkalı daha detaylı bilgiye buradan ulaşabilirsiniz.
Gelelim konumuza. Bu yazımda ki projede Eclipselink ve ZK Framework ve MySQL database i kullandım.Amacım kitaplar tablosuna bir arayüz den JPA ile kayıt atmak.Bu tabloda;

kitapid (INT)
kitapad (VARCHAR)
yazarad (VARCHAR)
kitaptur (VARCHAR)
kitapdurum (VARCHAR)
kitapimage (LONGBLOB)

kolonları bulunmaktadır.kitapimage kolonu bilgisayardan seçilen bir resim dosyası ile dolacaktır.Yazımın devamında  yaptığımız bu kaydı ya da kayıtları bir Listbox üzerinde göstereceğiz.Lafı fazla uzatmadan artık kodlamaya geçebiliriz.



Kitaplar.java
@Entity
@Table(name = "kitaplar")
@NamedQueries({
          @NamedQuery(name = "tumkitaplarigetir", query = "SELECT k FROM Kitaplar k"),
          @NamedQuery(name = "findLastBook", query = "SELECT k FROM Kitaplar k ORDER BY k.kitapId desc") })
public class Kitaplar implements Serializable {

     private static final long serialVersionUID = 1L;

     @Id
     @Column(name = "kitapid")
     private int kitapId;

     @Column(name = "kitapad")
     private String kitapad;

     @Column(name = "yazarad")
     private String yazarad;

     @Column(name = "kitaptur")
     private String kitaptur;

     @Column(name = "kitapdurum")
     private String kitapdurum;

     @Lob
     @Column(name = "kitapimage")
     private byte[] kitapimage;

     public int getKitapId() {
          return kitapId;
     }

     public void setKitapId(int kitapId) {
          this.kitapId = kitapId;
     }

     public String getKitapad() {
          return kitapad;
     }

     public void setKitapad(String kitapad) {
          this.kitapad = kitapad;
     }

     public String getYazarad() {
          return yazarad;
     }

     public void setYazarad(String yazarad) {
          this.yazarad = yazarad;
     }

     public String getKitaptur() {
          return kitaptur;
     }

     public void setKitaptur(String kitaptur) {
          this.kitaptur = kitaptur;
     }

     public String getKitapdurum() {
          return kitapdurum;
     }

     public void setKitapdurum(String kitapdurum) {
          this.kitapdurum = kitapdurum;
     }

     public byte[] getKitapimage() {
          return kitapimage;
     }

     public void setKitapimage(byte[] kitapimage) throws IOException {
          this.kitapimage = kitapimage;
     }

     @Override
     public int hashCode() {
          final int prime = 31;
          int result = 1;
          result = prime * result + kitapId;
          return result;
     }

     @Override
     public boolean equals(Object obj) {
          if (this == obj)
                return true;
          if (obj == null)
                return false;
          if (getClass() != obj.getClass())
                return false;
          Kitaplar other = (Kitaplar) obj;
          if (kitapId != other.kitapId)
                return false;
          return true;
     }

}


KitapIslemleriDaoImpl.java
public class KitapIslemleriDaoImpl implements KitapIslemleriDao {

     private static final String PERSISTANE_UNIT = "ZKDenemeJPA";

     private EntityManagerFactory emf;
     private EntityManager em;

     public KitapIslemleriDaoImpl() {
          emf = Persistence.createEntityManagerFactory(PERSISTANE_UNIT);
          em = emf.createEntityManager();
     }

    
     @Override
     public int findLastBookId() {
          int k;
          List<Kitaplar> kitapList = this.findAllKitaplar();
          if (kitapList.size() == 0) {
                k = 1;
          } else {
                List<Kitaplar> kitaplarList = em.createNamedQuery("findLastBook")
                          .getResultList();
                k = kitaplarList.get(0).getKitapId();
          }
          return k;
     }

     @Override
     public List<Kitaplar> findAllKitaplar() {
          Query query = em.createNamedQuery("tumkitaplarigetir");
          return query.getResultList();
     }

     @Override
     public void saveKitap(Kitaplar kitap) {
          em.getTransaction().begin();
          em.persist(kitap);
          em.flush();
          em.getTransaction().commit();
          em.close();
          emf = Persistence.createEntityManagerFactory(PERSISTANE_UNIT);
          em = emf.createEntityManager();
     }

Model ve Dao muzu yazdıktan sonra artık kayıt sayfamızı yapalım.

kitapKayit.zul
<window title="Kitap Kayıt Formu" border="normal"
                          width="900px"             apply="com.mesutemre.kitapIslemleri.KitapKayitControl">
     <grid hflex="1">
         <columns visible="false">
              <column></column>
              <column></column>
          </columns>
          <rows>
                <row>
                     <label value="Kitap Adı" />
                      <textbox id="kitapAdId" />
                </row>
                 <row>
                      <label value="Yazar Adı" />
                      <textbox id="yazarAdId" />
                 </row>
                 <row>
                      <label value="Kitap Türü" />
                      <combobox id="kitapTurId" width="100px">
                      <template name="model">
                              <comboitem  label="${each.kitaptur}"                                  value="${each.kitaptur}" />
                       </template>
                       </combobox>
                  </row>
                  <row>
                      <label value="Raf Durumu" />
                      <radiogroup id="rafDurumId">
                      <radio id="raftaId" alue="Rafta"                                               label="Rafta" selected="true" >
                      <space width="20px" />
                      <radio id="raftaDegilId"
                                  value="Rafta Değil" label="Rafta Değil"                         />
                      </radiogroup>
                   </row>
                   <row>
                        <button id="uploadKitapImageFileId"
                               label="Kitap resmi yükle" upload="true" />
                    </row>
                    <row spans="2" align="center">
                        <hlayout>
                              <button id="saveButtonId"
                                               label="Kaydet" />
                               <button id="clearButtonId"
                                               label="Temizle" />
                        </hlayout>
                     </row>
               </rows>
          </grid>
   </window>




KitapKayitControl.java

public class KitapKayitControl extends SelectorComposer<Component> {

     private static final long serialVersionUID = 1L;

     private List<Kitapturleri> kitapTurList = new            ArrayList<Kitapturleri();
     private ListModel<Kitapturleri> kitapTurModelList;

     KitapIslemleriDao kid = new KitapIslemleriDaoImpl();

     @Wire
     private Combobox kitapTurId;

     @Wire
     private Textbox kitapAdId;

     @Wire
     private Textbox yazarAdId;

     @Wire
     private Radiogroup rafDurumId;

     @Wire
     private Radio raftaId;

     @Wire
     private Radio raftaDegilId;

     private org.zkoss.zul.Image image = new org.zkoss.zul.Image();

     AlphaNumericConstraint anc = new AlphaNumericConstraint();

     @Override
     public void doAfterCompose(Component comp) throws Exception {
          super.doAfterCompose(comp);
          kitapTurList = kid.findAllKitaptur();
          kitapTurModelList = new           ListModelList<Kitapturleri>(kitapTurList);
          kitapTurId.setModel(kitapTurModelList);

          raftaId.setParent(rafDurumId);
          raftaDegilId.setParent(rafDurumId);

          kitapAdId.setConstraint(anc);
          yazarAdId.setConstraint(anc);

     }

     @Listen("onClick = #saveButtonId")
     public void saveKitap() {
          Kitaplar kitap = new Kitaplar();
          int id = kid.findLastBookId();
          if (image.getContent() != null) {
                kitap.setKitapId(id + 1);
                kitap.setKitapad(kitapAdId.getValue());
                kitap.setYazarad(yazarAdId.getValue());
                kitap.setKitaptur(kitapTurId.getSelectedItem().getValue()
                          .toString());
                kitap.setKitapdurum(rafDurumId.getSelectedItem().getValue()
                          .toString());
                try {
                     kitap.setKitapimage(image.getContent().getByteData());
                } catch (IOException e) {
                     e.printStackTrace();
                }
                kid.saveKitap(kitap);
                alert("Kitap kaydedildi");
          } else {
                Messagebox.show("Lütfen kitap resmi yükleyiniz!", "Hata Mesajı", 0,
                          Messagebox.EXCLAMATION);
          }
     }
    

     @Listen("onUpload = #uploadKitapImageFileId")
     public void update(UploadEvent ue) {
          Image imageY = (Image) ue.getMedia();
          image.setContent(imageY);
     }

     @Listen("onClick = #clearButtonId")
     public void clearForm() {
          kitapAdId.setRawValue(null);
          yazarAdId.setRawValue(null);
          raftaId.setChecked(true);
          raftaDegilId.setChecked(false);
          kitapTurId.setSelectedItem(null);
          image = new org.zkoss.zul.Image();
     }

}


AlphaNumericConstraint.java
public class AlphaNumericConstraint implements Constraint {

@Override
public void validate(Component comp, Object value)
                throws WrongValueException {
     if (value.toString().isEmpty()) {
          throw new WrongValueException(comp, "Bu alan boş geçilemez!");
     } else {
          if (!value.toString().matches("^[a-zA-ZğüşöçıİĞÜŞÖÇ\\x20]+")) {
          throw new WrongValueException(comp, "Lütfen karakter giriniz!");
                }
          }
     }

}


Constraint ler textbox a girdiğimiz değeri bir ajax kontrolünden geçirir ve validasyonu ona göre yapar.