JSF – 01 – Hello JSF World

Hamd alemlerin Rabbi olan, insana bilmedigini ogreten Allah’a mahsustur.

“Ve ma tevfîkî illa billah aleyhi tevekkeltü ve ileyhi ünîb”
“…Başarım ancak Allah’tandır, O’na güvendim; O’na yöneliyorum.”
Hûd suresi /88

Merhaba Arkadaslar,

2013 yilinda bir kac yazi yazma firsatim olan JSF yazilarimi 2015 yili itibariyle guncelleyecegim.
Faydali olmasi dileklerimle.

Hibernate ve Spring yazilarindan sonra yine benzer bir yapida JavaServerFaces (JSF) dersleri yazacagim . Bu yazi blogumdaki 100.yazim olacak .Bu nedenle bu yazimi degerli Java Ustadi Akin Kaldiroglu Hocama,Ibrahim Demir  Hocama ve degerli dostum Recep Bostanciya ithaf ediyorum.

Java Web ? Hangi Frameworkler ? Neden JSF ?

Java Web dunyasina baktigimizda karsimiza bir cok framework cikmaktadir.
Ornek olarak JSF , Spring MVC , Struts , Vaadin , Play , GWT gibi  verilebilir.

Turkiye sartlarinda dikkate almak gerekirse Spring MVC ve JSF ogrenmek kariyer acisindan daha faydali olacaktir. Tabi hobi olarak diger frameworklere de bakilabilir.

Her zaman temeli guzel bir sekilde ogrenilmesi taraftariyim. Oncelikle Servlet’in ve temel kavramlarin ogrenilmesi daha dogru bir yaklasim olacaktir.

Servlet&JSP yazilarimda bir cok temel kavramdan bahsettim. Burada benzer konular uzerinde pek durmadan devam edecegim.
Servlet&JSP

Java Server Faces ( JSF ) nedir ?

Java Server Faces (JSF) ;

  • Server-side
  • Component-Oriented/Component Based ozelliklerine sahip
  • MVC(Model View Controller) yapisinda  bir Java Web Framework’udur.

Component-Based ‘ ten kasit sudur ; ornegin bir html table kodunu JSP ile yazdigimizda row(sutun) ve column(satir) alanlarini olusturmamiz gerekmektedir fakat JSF kullandigimizda bu islem icin bir component kullanabiliriz.  JSF’i , Swing ‘in server-side sekli olarak dusunebiliriz.

Java Server Faces ( JSF );

  • Hali hazirda tumlesik olarak UI (User Interface) componentlere(bilesen)
  • Event-driven(olaya dayali) programlama modeline
  • Third-party componentlere eklenmesine imkan saglayan bir component-based modele sahiptir.

JSF in componentlerini kullanabilir , kendimiz component’ler olusturabiliriz ya da third-party componentleri projemize ekleyebiliriz.

JSF , event-handling ve component mekanizmasi icin gerekli code yapisina sahiptir. Component-based web framework olarak JSF tek degildir fakat Java EE View Layer standardi olarak JSF kullanilmaktadir.

Hangi calisma ortamlarini kullanacagiz ?

JSF tum Java EE application serverlarda entegrelidir. Bununla birlikte Apache Tomcat gibi Servlet Container ozelligine sahip uygulamalar(application) uzerinde de JSF calisacaktir.

Apache Tomcat , Servlet Container ozelligine sahiptir bir application server degildir.
Apache Tomcat ‘in kurulumu ve ozelliklerini su yazida bulabilirsiniz ;

Servlet & JSP – 04 – Apache Tomcat

  • Eclipse Luna
  • Apache Tomcat 8
  • Glassfish 4
  • JDK 8
  • Kubuntu 15.04
  • Reference Implemantation ; Mojarra
  • Maven

Mojarra nedir ?

Java Server Faces bir belirtim/tanimlama/specification’dir. Mojarra; Java Server Faces ‘ in reference implementation’dir. Benzer sekilde baska implementation’lar da mevcuttur. Ornegin Apache MyFaces

JSF Sayfalari ? Facelets nedir ?

JSF sayfalari icin farkli teknolojiler kullanilabilir. JSF 1.X , JSP (Java Server Pages) uzerine insa edilmisti fakat JSF 2.X ile birlikte JSP yerine Facelet sayfalari kullanilmaktadir.

Facelets , Java Server Faces icin kullanilan view declaration dilini ifade eder.
Facelets sayfalari ;

  • Web sayfalari icin convetion geregi XHTML dosyalari kullanilir.
  • Expression Language (EL) destegi
  • JSTL tag libraries destegi
  • Template destegi
  • Compile-time EL validasyonu

Facelets sayfalarinda kullanabilecegimiz tag library’ler sunlardir ;

Tag Library URI(Uniform Resource Identifier) Prefix
JavaServer Faces HTML Tag Library http://java.sun.com/jsf/html h:
JavaServer Faces Facelets Tag Library http://java.sun.com/jsf/facelets ui:
JavaServer Faces Core Tag Library http://java.sun.com/jsf/core f:
JSTL Core Tag Library http://java.sun.com/jsp/jstl/core c:
JSTL Functions Tag Library http://java.sun.com/jsp/jstl/functions fn:

Hello Java Server Faces 

Yeni bir Dynamic Web Project olusturalim , daha sonrasinda projemize sag tiklayip Convert To Maven Project diyerek projemizi Maven projesi olarak donusturelim.

NOT : Burada detaydan bahsetmeyecegim. Yeni Dynamic Web Project olusumu , dependency eklenmesi gibi konulari Servlet&JSP ve Maven yazilarimda bahsettim. Bunlar ogrenilmeden zaten JSF gibi konulara gecilmemelidir.

pom.xml dosyamiza gerekli dependency tanimlarini ekleyelim ;

       <dependencies>
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-api</artifactId>
			<version>2.2.13</version>
		</dependency>
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-impl</artifactId>
			<version>2.2.13</version>
		</dependency>
	</dependencies>

Managed Bean

Bean; property/ozelliklerin tanimlandigi ve getter/setter metotlarindan olusan , public no-argument yapilandiricya sahip Java siniflaridir.
Bu no-argument yapilandirici JSF tarafinda bean objesi olusturulurken kullanilir. Bu nedenle mutlaka tanimlanmalidir.

Managed Bean , JSF tarafindan ulasilan/yonetilen/manage Java bean’leridir.

JSF 2.0 dan once managed beanler WEB-INF/faces-config.xml dosyasinda tanimlanmak zorundadir. JSF 2.0 ile birlikte Managed beanler @ManagedBean annotation’i kullanilarak yapilabilmektedir.

Not : Ilerleyen bolumlerde faces-config.xml dosyasindan bahsedecegiz ve ornek bir Managed Bean tanimini bu dosya uzerinden gerceklestirecegiz.

PersonBean.java

package _01.hellojsf;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
//@ManagedBean(name="person")
@SessionScoped
public class PersonBean {

	private String name;
	private String password;

	public PersonBean(String name, String password) {
		super();
		this.name = name;
		this.password = password;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
}

  • @ManagedBean annotation’i class tanimimiz basinda yapiyoruz.
    import ettigimiz sinif javax.annotation.ManagedBean degil javax.faces.bean.ManagedBean dir.
  • @ManagedBean annotation’da name attribute kullanilabilir. Varsayilan olarak Java Bean convention isim olarak kullanilacaktir ; personBean
  • Varsayilan scope RequestScoped tur. Scope’lari ilerleyen bolumlerde inceleyegiz.
  • JSF, lifecycle yonetiminden sorumludur!

Yeni bir XHTML dosyasi olusturalim ; Eclipse’te varsayilan olarak XHTML dosyasi yoktur bunun icin Web klasoru altinda HTML file olusturalim . Dosya ismi olarak .html degil .xhtml olacak sekilde kullanalim. New XHTML file  secenegi secip xhtml dosyamizi olusturabiliriz.

new xhtml

login.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:h="http://java.sun.com/jsf/html">
<h:head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
   <title>Welcome</title>
</h:head>
<h:body>
   <h:form>
      <h3>Please enter your name and password.</h3>
      <table>
         <tr>
            <td>Name:</td>
            <td><h:inputText value="#{personBean.name}" /></td>
         </tr>
         <tr>
            <td>Password:</td>
            <td><h:inputSecret value="#{personBean.password}" /></td>
         </tr>
      </table>
      <p>
         <h:commandButton value="Login" action="welcome" />
      </p>
   </h:form>
</h:body>
</html>

Namespace tanimlanmasina xmlns:h=”http://java.sun.com/jsf/html” ekleyelim. Boylelikle h:inputText , h:inputSecret  ve h:commandButton gibi JSF componentlerini kullanabiliriz.

input alani PersonBean ‘in name property degeriyle baglanir(bound).

<h:inputText value="#{personBean.name}" />

JSF Expression Language , JSP Expression Language’ten farkli olarak calisir.
Sayfa goruntulendiginde , PersonBean ‘in getName metodunu cagirir , sayfada submit/gonderme islemi oldugunda setName metodu cagrilmaktadir.
JSF, setter metot’larini cagirmaktan sorumludur !

Not : JSP Expression Language konusuna Servlet&JSP yazilarimda degindim. Oradan inceleyebilirsiniz.

h:commandButton da action alani page navigation icin kullanilmaktadir. Ilerleyen bolumlerde page navigation konusunu inceleyecegiz. Burada welcome.xhtml url adresine navigation islemi gerceklesecektir.

<h:commandButton value="Login" action="welcome" />

welcome.xhtml

Burada dikkat etmemiz gereken nokta #{personBean.name}  ifadesidir. Bu ifadeyi(Expression) h:inputText de value alaninda da kullandik. h:inputText component icin setName metodu calisacaktir fakat burada #{personBean.name} ifadesi getName ‘in calismasini saglar.
JSF, getter metot’larini cagirmaktan sorumludur !

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:h="http://java.sun.com/jsf/html">
<h:head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
   <title>Welcome</title>
</h:head>
<h:body>
   <h3>Welcome to www.injavawetrust.com JSF tutorial!
      #{personBean.name}!</h3>
</h:body>
</html>

Servlet Konfigurasyonu

Java Server Faces , MVC (Model View Controller) pattern yapisi uzerine insa edilmistir.
javax.faces.webapp.FacesServlet , istekleri karsilamak (handle request) ve sayfa yonlendirmesi (page navigation) gorevlerini ustlenir.

faces servlet

FacesServlet’ in istekleri karsilayabilmesi icin web.xml dosyasinda servlet tanimini yapmamiz gereklidir.
NOT : JSF 2.2 de bu tanimlama zorunlulugu Apache Tomcat icin yoktur.
Bununla birlikte Glassfish gibi application servler’lar varsayilan olarak .xhtml prefix’si icin mapping tanimlamasina sahiptir.

web.xml

   <servlet>
      <servlet-name>Faces Servlet</servlet-name>
      <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
   </servlet>

<servlet> etiketi icerisinde <servlet-name> etiketi yer almaktadir. <servlet-name> de diledigimiz ismi verebiliriz.

<sevlet-class> etiketi yardimi ile paketismi.sinif ismini yaziyoruz.

<servlet-mapping> etiketinde <servlet-name> alanina url tanimlamasi yapacagimiz Servlet ismini veriyoruz. Burada dikkat ederseniz onceki tanimladigimiz <servlet-name> etiketindeki isim ile ayni isme sahip yani Faces Servlet.

<url-pattern> etiketi yardimi ile Servlet’imiz icin url tanimlamasi yapiyoruz.  *.xhtml  ; sonu xhtml ile biten tum url adresleri icin Faces Servlet calissin anlamina gelmektedir.
*.xhtml seklindeki mapping e extension mapping denilmektedir.

   <servlet-mapping>
      <servlet-name>Faces Servlet</servlet-name>
      <url-pattern>*.xhtml</url-pattern>
   </servlet-mapping>

Run Application

login.xhml dosyamizi calistiralim ;

login xhtml

Login butonuna tikladigimizda ;

welcome xhtml

Github Source Code/Project
injavawetrust-jsf-tutorial

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *