Professional Documents
Culture Documents
Merhaba, bu yazıda size adım adım PrimeFaces içeren örnek bir proje nasıl
kolayca yaratılır bunu göstermeye çalışacağım. Kurulum ve çalıştırmak için benim
kullandığım araçlar Maven 2, eclipse 3.3, tomcat 6.0.14 ve tabii ki PrimeFaces.
Maven, eclipse kurulumu, JSF kurulumu gibi konuları biraz hızlı geçip asıl amacımız
olan gerçek bir uygulamada PrimeFacesʼin entegrasyonunu ve çalışmasını göreceğiz.
Maven 2 ile bir JSF projesinin oluşturulmasını Çağatayʼın blogunda bulabilirsiniz. Ben
şimdilik bunları kısaca geçerek bize içinde PrimeFaces olan hazır bir proje yapmak için
gerekli adımları yazacağım.
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-
v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.prime</groupId>
<artifactId>ToplantiOrganizatoru</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>ToplantiOrganizatoru Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>1.2_10</version>
</dependency>
<dependency>
<groupId>com.sun</groupId>
<artifactId>jsf-impl</artifactId>
<version>1.2_10</version>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces-ui</artifactId>
<version>0.8.2</version>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>optimus</artifactId>
<version>0.7.1</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>com.google.code.guice</groupId>
<artifactId>guice</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.sun.facelets</groupId>
<artifactId>jsf-facelets</artifactId>
<version>1.1.14</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.5.6</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<finalName>ToplantiOrganizatoru</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>prime-repo</id>
<name>Prime Technology Maven Repository</name>
<url>http://repository.prime.com.tr/</url>
<layout>default</layout>
</repository>
</repositories>
</project>
Biraz uzun gibi görünse de PrimeFaces, facelets, mojarra 1.2 kullanan basit bir
projenin bağımlılıkları bu kadardır.
<application>
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
</application>
</faces-config>
Bazı forumlarda veya blogʼlarda JSFʼte çok fazla xml var gibi yazılar bu aralar çok
moda ama buradaki xmlʼden başka JSFʼe özel başka bir xml dosyası projemizde
olmayacak.
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<context-param>
<param-name>facelets.SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Resource Servlet</servlet-name>
<servlet-class>
org.primefaces.ui.resource.ResourceServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Resource Servlet</servlet-name>
<url-pattern>/primefaces_resources/*</url-pattern>
</servlet-mapping>
</web-app>
Ayarlamaları bitirdikten sonra artık aşağıdaki test sayfamızı yazıp şimdiye kadar
yaptıklarımızı deneyelim. Aşağıdaki örnek bir JSF test sayfası bulunmaktadır. Bu sayfayı
test.xhtml olarak src/main/webapp/ altına kaydedebilirsiniz:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.prime.com.tr/ui">
<f:view contentType="text/html">
<head>
</head>
<body>
<h:outputText value=”Merhaba” />
</body>
</f:view>
</html>
Test sayfamız da hazır olduktan sonra, projemizi artık tomcat üstünden çalıştırıp,
test edebiliriz. Projemizi çalıştırdıktan sonra aşağıdaki linkten test sayfamız denenmeye
hazır olacaktır. Burada benim projemin adının ToplantiOrganizatoru olduğunu lüten
unutmayın, eğer başka bir proje adı yazdıysanız onu kullanmanız gerekir. Herhangi bir
tarayıcıdan aşağıdaki adres ile test sayfamızı görebiliriz:
http://localhost:8080/ToplantiOrganizatoru/test.jsf
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.prime.com.tr/ui">
<f:view contentType="text/html">
<head>
</head>
<body>
<p:editor />
</body>
</f:view>
</html>
Ama bu hiç de güzel görünmüyor. Bir yerlerde bir eksiklik olduğunu düşünüyorsanız
haklısınız çünkü PrimeFacesʼtaki bileşenlerin çalışması için head içinde p:resources
bileşeninin olması gerekmektedir. Bu bileşen o sayfadaki bileşenler için gerekli javascript
ve imajları sayfanıza yükleyecektir. test.xhtml kodumuzu aşağıdaki şekilde değiştiriyoruz
( head içine sadece p:resources ekledik ) :
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.prime.com.tr/ui">
<f:view contentType="text/html">
<head>
<p:resources/>
</head>
<body>
<p:editor />
</body>
</f:view>
</html>
<dependency>
<groupId>poi</groupId>
<artifactId>poi</artifactId>
<version>2.5.1-final-20040804</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.2.ga</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.2.1.ga</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.2.1.ga</version>
</dependency>
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.7</version>
</dependency>
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Misafir {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Basic
private String isim;
@Basic
private Integer kisiSayisi;
Misafir sınıfımız hazır olduğuna göre şimdi de bu misafir sınıfımızı kaydedecek,
getirecek DAO sınıflarımızı yapalım. com.prime.toplanti.ambar.MisafirAmbari.java
aşağıdaki gibi olsun:
package com.prime.toplanti.ambar;
import java.util.List;
import com.prime.toplanti.alan.Misafir;
List<Misafir> hepsiniGetir();
void kaydet( Misafir misafir );
}
Gene aynı paketteki MisafirAmbariJPA.java ise şöyle:
package com.prime.toplanti.ambar;
import java.util.List;
import javax.persistence.EntityManager;
import org.primefaces.optimus.config.annotations.Transactional;
import com.google.inject.Inject;
import com.prime.toplanti.alan.Misafir;
@Inject
private EntityManager em;
@Transactional
public void kaydet(Misafir misafir) {
em.persist(misafir);
}
Gördüğünüz gibi, çok kolay bir şekilde metotlarımızı ekledik. Burada @Inject ile
gördüğünüz kısımda Google Guice kullanarak EntityManager sınıfını bu MisafirAmbariJPA
sınıfına verdik. PrimeFacesʼin bunu yapması için aşağıdaki 2 eklentiye ihtiyacımız var.
package com.prime.toplanti.kurulum;
import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.Scopes;
import com.prime.toplanti.ambar.MisafirAmbari;
import com.prime.toplanti.ambar.MisafirAmbariJPA;
<context-param>
<param-name>optimus.CONFIG_MODULES</param-name>
<param-value>com.prime.toplanti.kurulum.Konfigurasyon,
org.primefaces.optimus.persistence.JPAModule
</param-value>
</context-param>
<context-param>
<param-name>optimus.CONTEXT_SCAN_PATH</param-name>
<param-value>com.prime.toplanti</param-value>
</context-param>
<filter>
<filter-name>Optimus Filter</filter-name>
<filter-class>
org.primefaces.optimus.persistence.filter.PersistenceFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>Optimus Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
package com.prime.toplanti.web;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.primefaces.optimus.config.Scope;
import org.primefaces.optimus.config.annotations.Controller;
import com.google.inject.Inject;
import com.prime.toplanti.alan.Misafir;
import com.prime.toplanti.ambar.MisafirAmbari;
@Controller(name = "misafirKayit", scope = Scope.REQUEST)
public class MisafirKayit {
@Inject
public MisafirKayit(MisafirAmbari misafirAmbari) {
this.misafirAmbari = misafirAmbari;
misafirler = misafirAmbari.hepsiniGetir();
}
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:opt="http://primefaces.prime.com.tr/optimus"
xmlns:p="http://primefaces.prime.com.tr/ui">
<f:view contentType="text/html">
<head>
<p:resources />
</head>
<body>
<h:form prependId="false">
<h:messages />
<p:panel header="Yeni Misafir">
<h:panelGrid columns="2">
<h:outputLabel value="isim : *" for="txt_isim"></h:outputLabel>
<h:inputText id="txt_isim" value="#{misafirKayit.misafir.isim}"
required="true"/>
<h:panelGroup>
<h:commandButton action="#{misafirKayit.kaydet}" value="Kaydet" />
</h:panelGroup>
</h:panelGrid>
</p:panel>
</h:form>
<br />
<p:column>
<f:facet name="header">
<h:outputText value="Title" />
</f:facet>
<h:outputText value="#{misafir.isim}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Discs" />
</f:facet>
<h:outputText value="#{misafir.kisiSayisi}" />
</p:column>
</p:dataTable>
</body>
</f:view>
</html>
Sayfamız da hazır olduğuna göre, bu sayfayı test edelim. Tarayıcımızdan
http://localhost:8080/ToplantiOrganizatoru/misafirKayit.jsf
sayfasına girdiğimiz zaman aşağıdaki gibi bir görüntü ile misafir kaydımızı yapabileceğiz.
Bu sayfayla bir süre oyalandıktan sonra, bu sayfaya Ajax ekleyelim. Bir kayıt girip
Kaydet butonuna basıntığımızda Ajax ile tablomuza eklenmesi için, mevcut kaydet butonu
yerine aşağıdakini ekleyelim
Evet sadece bu kadar. Artık bir Ajax butonumuz var ve artık misafirler tabloya Ajax
ile ekleniyor.
Her özellik kolay bir şekilde eklenip çıkarılabiliyor gördüğünüz gibi. En son özellik
olarak da bu tabloya bir excel çıktısı ekleyelim. bunun için sayfamıza aşağıdaki buton
kodunu ekliyoruz
<h:commandButton value="Excel">
<opt:exportActionListener type="xls" target="tablo" fileName="misafirler"/>
</h:commandButton>
ve herşey hazır. Bu butona tıkladığımız zaman bize aşağıdakine benzer bir excel
çıktısı verecektir.
Burada fileName indirilecek dosyanın adını, type, çıktı tipini, target ise tabloʼnun
idʼsini gösterir. PDF çıktısı almak için yapmamız gereken tek şey, type="xls" yerine
type="pdf" yazmak. İstersek CSV ve XML çıktılarını gene aynı şekilde type özelliğini
değiştirerek alabiliriz.
<p:pieChart value="#{misafirKayit.misafirler}" var="misafir"
categoryField="#{misafir.isim}" dataField="#{misafir.kisiSayisi}" />
Sadece bu kadar!. Bu kod parçacığını ekledikten sonra sayfamızdaki çıktı aşağıdaki
gibi olacaktır:
Gördüğünüz gibi bu dökümandaki amaç, PrimeFaces ile çok kolay bir şekilde
projelerinizi geliştirebiliyor olabilmemiz. Bu dökümanda bir kayıt işlemi senaryosunu
göstermiş olsak da, daha bahsetmediğimiz aşağıdaki özellikler de PrimeFacesʼde mevcut
http://primefaces.prime.com.tr/tr/ ,
http://code.google.com/p/primefaces/ ,
http://primefaces.prime.com.tr/docs/ToplantiOrganizatoru.zip ,