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>


7 Temmuz 2014 Pazartesi

JSF,EJB ve JPA ile Web Uygulaması-2

Öncelikle herkese hayırlı ramazanlar diyerek yazıma başlıyorum.
Geçen yazımda Eclipse üzerinde bir EJB projesinin nasıl create edildiği , JPA , DAO ve Facade patternlerini kullanarak bir MVC projesinin nasıl yapılacağı hakkında konuşmuştuk.
Artık dinamik bir web projesi açıp , bu EJB projesini de dinamik web projemize referans göstererek login ekranımızı yapmaya başlayalım.Eclipse üzerinde dinamik bir web projesi aşağıda ki gibi açılır.






Açtığımız bu web projesinde ki ManagedBean lerde EJB leri kullanmamız için daha önceden create ettiğimiz EJB projesini eklememiz gerekiyor. Bu işlem aşağıda ki gibi olur.




Tüm bunları yaptıktan sonra artık login sayfamızı yazabiliriz.


index.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
       xmlns:ui="http://java.sun.com/jsf/facelets"
       xmlns:h="http://java.sun.com/jsf/html"
       xmlns:p="http://primefaces.org/ui"
       xmlns:f="http://java.sun.com/jsf/core">

 <h:head>
        <title>Giriş</title>
    </h:head>
    <h:body style="background-color: azure">
        <h:outputStylesheet library="css" name="formOrtala.css" />
        <br/><br/><br/><br/><br/><br/><br/>
        <h:form styleClass="centered2">
            <h3>Üye girişi</h3>
            <br/>
            <h:panelGrid columns="3" border="0">
                <h:graphicImage library="images" name="login.png"/>
                <h:outputLabel value=""/>
                <h:outputLabel value=""/>
                <h:outputLabel value="Kullanıcı adı:"/>
                <h:inputText value="#{ugcb.kullaniciadi}" size="25" required="true"
                             requiredMessage="Kullanıcı adını boş bırakmayınız!"
                             id="kullaniciadi"/>
                <h:message for="kullaniciadi" style="color: red"/>
                <h:outputLabel value="Şifre:"/>
                <h:inputSecret value="#{ugcb.sifre}" size="25" required="true"
                               requiredMessage="Şifreyi boş bırakmayınız!"
                               id="kullanicisifre"/>
                <h:message for="kullanicisifre" style="color: red"/>
                <h:commandButton value="Giriş" style="background: skyblue" action="#{ugcb.kontrolYap}" />
                <h:link value="Kayıtlı değilseniz kayıt olmak için tıklayınız!"
                        outcome="kayitSayfasi" target="_new"/>
                <h:outputText value=""/>
                <h:outputText value=""/>
                <h:link value="Şifremi unuttum" outcome="sifremiUnuttum" target="_new"/>
            </h:panelGrid>
            <h:messages  globalOnly="true" style="color: red"/>
        </h:form>
    </h:body>

</html>

Bu sayfanın çıktısı aşağıda ki gibi olur.



Artık login olma kontrolümüzü yapan ManagedBean imizi yazabiliriz.


UyeGirisCikisBean.java

@ManagedBean(name = "ugcb")
@SessionScoped
public class UyeGirisCikisBean implements Serializable {

       private static final long serialVersionUID = 1L;

       private String kullaniciadi;
       private String sifre;
       private Uyeler entity;

       @EJB
       private UyelerFacade service;

       public UyeGirisCikisBean() {
             entity = new Uyeler();
       }

       public String kontrolYap() {

             try {
                    entity = service.findMemberByUserName(kullaniciadi);
             } catch (Exception e) {
                    e.printStackTrace();
             }
             if (entity.getSifre().equals(sifre)) {
                    HttpSession session = Util.getSession();
                    session.setAttribute("kullaniciadi", kullaniciadi);
                    System.out.println("USERNAME:" + Util.getUserName());
                    System.out.println("USERID:" + Util.getUserId());
                    return "giris.xhtml?faces-redirect=true";
             } else {
                    FacesContext.getCurrentInstance().addMessage(null,
                                  new FacesMessage("Şifre yanlış!"));
                    return null;
             }

       }

       public String logout() {
             HttpSession session = Util.getSession();
             session.invalidate();
             return "logoutPage";
       }


       public String getKullaniciadi() {
             return kullaniciadi;
       }

       public void setKullaniciadi(String kullaniciadi) {
             this.kullaniciadi = kullaniciadi;
       }

       public String getSifre() {
             return sifre;
       }

       public void setSifre(String sifre) {
             this.sifre = sifre;
       }

}

Kullanıcı adımız ve şifremiz ile giriş yaptığımız zaman yönlendirildiğimiz giriş sayfası aşağıda ki gibidir.