13 Ekim 2014 Pazartesi

PrimeFaces ile Excel'den Database'e Veri Aktarımı

Bu yazımda sizlere PrimeFaces fileUpload componentini kullanarak bir excel dosyasında ki verileri okuyup , okuduğumuz bu verileri JPA ile DB ye nasıl kaydedeceğimizi anlatacağım


Öncelikle bir excel dosyasını okumak için aşağıda ki linkden gerekli jarları indirip projeye eklemeniz gerekiyor.


Bu kütüphaneleri indirip projeye ekledikten sonra artık excel i parse etmeye başlayabiliriz.(Örnek bir excel dosyası yazının sonunda ekte bulunmakta)

private Vector read(String fileName) {
        Vector cellVectorHolder = new Vector();
        try {
            File file = new File(fileName);
            Workbook wb = WorkbookFactory.create(file);
            Sheet mySheet = wb.getSheetAt(0);
            Iterator<Row> rowIter = mySheet.rowIterator();
            while (rowIter.hasNext()) {
                   XSSFRow myRow = (XSSFRow) rowIter.next();
                   Iterator cellIter = myRow.cellIterator();
                   Vector cellStoreVector = new Vector();
                   while (cellIter.hasNext()) {
                          XSSFCell myCell = (XSSFCell) cellIter.next();
                          cellStoreVector.addElement(myCell);
                   }
                   cellVectorHolder.addElement(cellStoreVector);
                   file.delete();
             }
             } catch (Exception e) {
                    e.printStackTrace();
             }
        return cellVectorHolder;
}

Yukarıda ki  metod excelin içinde ki verileri Vector tipinde bir object şeklinde bize dönüyor.Ön yüzde bu component aşağıda ki gibi kullanılır.

<p:fileUpload  fileUploadListener="#{kitapKayitBean.handleFileUpload}"
       mode="advanced"/>

Artık handleFileUpload metodumuzu yazabiliriz

public void handleFileUpload(FileUploadEvent event) {
       Kitaplar kitapobj = new Kitaplar();
       List<Kitaplar> kitaplarList = new ArrayList<Kitaplar>();
       Vector dataHolder = read(path + event.getFile().getFileName());
       for (int i = 1; i < dataHolder.size(); i++) {
             Vector cellStoreVector = (Vector) dataHolder.elementAt(i);
       for (int j = 0; j < cellStoreVector.size(); j++) {
             XSSFCell myCell = (XSSFCell) cellStoreVector.elementAt(j);
             if (myCell.getColumnIndex() == 0) {                                                    kitapobj.setKitapID(Integer.parseInt(myCell.toString()
                                               .split("\\.")[0]));
             } else if (myCell.getColumnIndex() == 1) {
                                  kitapobj.setKitapad(myCell.toString());
             } else if (myCell.getColumnIndex() == 2) {
                                  kitapobj.setYazarad(myCell.toString());
             } else if (myCell.getColumnIndex() == 3) {
                                  kitapobj.setKitaptur(myCell.toString());
             } else {
                    kitapobj.setKitapdurum(myCell.toString());
             }
             if (kitapobj.getKitapID() != null
                && kitapobj.getKitapad() != null
                && kitapobj.getYazarad() != null
                && kitapobj.getKitaptur() != null
                && kitapobj.getKitapdurum() != null) {
                    kitaplarList.add(kitapobj);
                    kitapobj = new Kitaplar();
             }
                          
         }
    }
            
             for (int i = 0; i < kitaplarList.size(); i++) {
                    service.kitapKaydet(kitaplarList.get(i));
             }
            
}

Bu kodda kendinize göre ufak değişiklikler yaparak kullandığımız takdirde DB ye kayıt atabiliriz.

for (int i = 0; i < kitaplarList.size(); i++) {
       service.kitapKaydet(kitaplarList.get(i));
}

Bu kısımda daha önceki yazılarımda anlattığım gibi JPA ile kayıt atıyoruz.

Buradan bahsettiğim örnek excel dosyasını indirebilirsiniz.

27 Temmuz 2014 Pazar

JSF selectOneMenu de Object Kullanımı

Öncelikle herkese iyi bayramlar diyerek yazıma başlıyorum.

Bu konu ile alakalı yazacağım örnek uygulama da;

-EJB 3.0
-JSF 2.2
-PrimeFaces 4.0
 teknolojilerini kullanarak GlassFish Server 4.0 üzerinde geliştirdim.

Daha önce ki yazılarımdan birinde JSF de selectOneMenu componentinin kullanımından bahsetmiştim.Buradan yazıya ulaşabilirsiniz.

Orada ki örnek de <f:selectItem> ın value su bir String list di. Fakat bize gelen değerler her zaman String olmayabilir.Yani custom type larda dönebilir.Dolayısıyla selectOneMenu nün value su da o custom type ın tipi olur. İşte tam bu zamanda da imdadımıza converter yetişir.

Çünkü custom type bean e gönderildiği zaman set edilemez ve aşağıda ki hatayı bize fırlatır.

Conversion Error setting value xxxxx.CustomType@1234567' for 'null Converter'.

İşte bu hatadan kurtulmak için kendi converter ımızı yazmamız gerekir.Lafı fazla uzatmadan artık kodlamaya başlayalım.

ValueListDetail.java

public class ValueListDetail implements Serializable{
      
       private static final long serialVersionUID = 1L;
      
       @Id
       @Column(name = "ID")
       private Integer valueId;
      
       @Column(name = "ACIKLAMA")
       private String description;

       public Integer getValueId() {
             return valueId;
       }

       public void setValueId(Integer valueId) {
             this.valueId = valueId;
       }

       public String getDescription() {
             return description;
       }

       public void setDescription(String description) {
             this.description = description;
       }

       @Override
       public int hashCode() {
             final int prime = 31;
             int result = 1;
             result = prime * result + ((valueId == null) ? 0 : valueId.hashCode());
             return result;
       }

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

selectOneMenu muzu dolduracak Dao aşağıda ki gibidir.

GeneralDao.java

public class GeneralDaoImpl<T> {

private final static String UNIT_NAME ="KutuphaneOtomasyonuEJB";
      
       @PersistenceUnit(unitName = UNIT_NAME)   
       private EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory(UNIT_NAME);
       private EntityManager em = emf.createEntityManager();
      
       private static Connection getConnection(){
             Connection dbConnection = null;
             try {
                    Class.forName("com.mysql.jdbc.Driver").newInstance();
                    dbConnection = DriverManager.getConnection("jdbc:mysql://localhost:3307/kutuphane", "root", "root");
             } catch (Exception e) {
                    e.printStackTrace();
             }
            
             return dbConnection;
       }
      
       @SuppressWarnings("unchecked")
       public List<ValueListDetail> findAllValues(){
             return em.createNamedQuery("findAllValueList").getResultList();
       }
      
       public ValueListDetail findValuebyId(Integer id){
             return em.find(ValueListDetail.class, id);
       }
}

Buradan gelen değerleri convert eden class aşağıda ki gibidir.

ValueListDetailConverter.java

@FacesConverter(forClass = com.mesutemre.valuelistdetailconverter.ValueListDetailConverter.class, value = "valueListDetailConverter")
public class ValueListDetailConverter implements Converter {

       @EJB
       private GeneralFacade service;

       @Override
       public Object getAsObject(FacesContext context, UIComponent component,
                    String submittedValue) {
             if (submittedValue.trim().equals("")) {
                    return null;
             } else {
                    try {

                           return service.findValuebyId(Integer.valueOf(submittedValue));
                    } catch (NumberFormatException exception) {
                           throw new ConverterException(new FacesMessage(
                                        FacesMessage.SEVERITY_ERROR, "Conversion Hatası",
                                        "Geçersiz değer!"));
                    }
             }

       }

       @Override
       public String getAsString(FacesContext context, UIComponent component,
                    Object value) {
             if (value == null || value.equals("")) {
                    return "";
             } else {
                    return String.valueOf(((ValueListDetail) value).getValueId());
             }
       }

}

Gördüğümüz üzere converter yazmak oldukça basit.Bu class ValueListDetail objectini String ' e ya da tersine dönüştürür.


ValueListDetail list aşağıda ki gibi ManagedBean de dolar.

@ManagedBean(name = "kitapKayitBean")
@ViewScoped
public class KitapKayitBean implements Serializable {

       private static final long serialVersionUID = 1L;

       private List<ValueListDetail> ilgiAlanList = new ArrayList<ValueListDetail>();
       private ValueListDetail ilgiValue;

       @EJB
       private GeneralFacade generalFacade;

      
       private void initİlgiAlanList() {
             ilgiAlanList = generalFacade.findAllValues();
       }
       public List<ValueListDetail> getIlgiAlanList() {
             return ilgiAlanList;
       }

       public void setIlgiAlanList(List<ValueListDetail> ilgiAlanList) {
             this.ilgiAlanList = ilgiAlanList;
       }

       public ValueListDetail getIlgiValue() {
             return ilgiValue;
       }

       public void setIlgiValue(ValueListDetail ilgiValue) {
             this.ilgiValue = ilgiValue;
       }

}

Önyüz de kullanırken de converter attribute ünü ve converter ın adını kullanmak yeterli olacaktır. Bu işlem aşağıda ki gibidir.

<p:selectOneMenu value="#{kitapKayitBean.ilgiValue}" converter="valueListDetailConverter" required="true" filter="true"              id="kitapkayitkitaptur"    requiredMessage="#{res['ko.warning.emptyBookType']}">

<f:selectItems value="#{kitapKayitBean.ilgiAlanList}" var="ial"                                 itemLabel="#{ial.description}"/>

</p:selectOneMenu>