JSP Sayfasından JavaBean Çağırmak

Java Bean sınıflarının ne olduğunu “Java Bean Nedir?” adlı makalemde incelemiştik. Bu yazımda ise JSP sayfalarından Java Bean sınıflarına action etiketleri ile nasıl erişildiğinden bahsedeceğim.

[box type=”info”] NOT : JSP sayfalarında kullanılan tüm deyimler için “JSP Sayfalarında Kullanılan Deyimler” başlıklı yazımı inceleyebilirisiniz. [/box]

JSP sayfalarında Java Bean sınıfları ile ilgili işlemler yapabilmek için kullanılan 3 tane etiket vardır. Bunlar ;

  1. <jsp:useBean>
  2. <jsp:setProperty>
  3. <jsp:getProperty>

etiketleridir. Sırasıyla ne işe yaradıklarını ve hangi özellikleri olduğundan bahsedelim.

1)      <jsp:useBean>

Bu etiket JSP sayfasında bir JavaBean sınıfı tanımlamak ve instance’ını yaratmak için kullanılır. Yazımı aşağıdaki gibidir.

[codesyntax lang=”xml” lines=”no”]

<jsp:useBean
        id="nesne-ismi"
        scope="page | request | session | application"
        type="nesne-tipi"     
        beanName="bean-ismi"
/>

[/codesyntax]

  • id : Sayfa içerisinde instance’ı yaratılan nesneye ulaşacağımız isimdir. Nasıl ki ;

Personel personel = new Pesonel();  dediğimizde küçük harfle yazılan referans tipindeki değişken Personel nesnesini gösteriyorsa bu etiketteki id de aynı işi yapar.

  • scope : Yaratılan nesnenin hangi geçerlilik bölgesinde saklanacağının belirtildiği özelliktir. Varsayılan olarak page scope kullanılır. Yani sayfa her yüklendiğinde yeni bir bean instance’ı yaratılır.
[box type=”info”] “Web Uygulamalarında Scope Kavramı” isimli yazıyı inceleyiniz.[/box]
  • type : Nesnenin tipinin belirtildiği özelliktir. Değer olarak kendi tipi veya türediği herhangi bir tip verilebilir. Örneğin yaratılan nesne Honda nesnesi ise type özelliği Honda veya türediği Araba tipinde olabilir. Çok biçimlilik ilkesine dayanarak gerçekleştirdiği arabirimler varsa o interface’ler de olabilir.

Zorunlu bir özellik değildir. Kullanılmasa da olur.

  • class : Yaratılan nesnenin tipinin sınıf adıdır. Mesela ,

Date tarih = new java.util.Date(); şeklindeki bir nesne için class : java.util.Date olacaktır.

  • beanName : Aynı class özelliği gibi beanName özelliği de instance’ı yaratılan nesnenin isminin belirtildiği özelliktir. Aralarındaki fark ise beanName özelliğinin istek anında belirtilebilir olmasıdır.

2)      <jsp:setProperty>

Bu etiket sayesinde instance’ı yaratılan bean sınıfının içerisindeki bir değişkenin ya da değişkenlerin değerlerinin tamamının setlenmesi sağlanır. Yazımı aşağıdaki gibidir.

[codesyntax lang=”xml” lines=”no”]

<jsp:setProperty
        name="nesne-ismi"
        property="degisken-ismi"
        param="setlenecek-parametre-ismi"
        value="setlenecek-degisken-degeri"
/>

[/codesyntax]

  • name : <useBean> etiketinde verdiğimiz id özelliğinin ismidir. Bu sayede sayfa içerisindeki hangi bean nesnesinin özellikleri set edilecek anlaşılmış olur.
  • property : Değeri setlenecek olan özelliğin ismidir. Bean sınıfındaki değişkenlere karşılık gelir.
  • param : Değeri setlenecek olan özelliğin istek parametresinin ismidir. Örneğin Servlet sınıflarında kullandığımız request.getParameter(“isim”) metodunda kullanılan “isim” değeri gibi.
  • value : Setlenecek değeri ifade eder.

3)      <jsp:getProperty>

Bean sınıfındaki değişken değerlerine ulaşmak için kullanılan etikettir. Yazımı aşağıdaki şekildedir :

[codesyntax lang="xml" lines="no"]
<jsp:getProperty
        name="nesne-ismi"
        property="degisken-ismi"
/>
[/codesyntax] 
  • name : Aynı <jsp:setProperty> etiketinde olduğu gibi nesnenin id’sine verilen değerdir.
  • property : Değeri okunacak değişkenin ismidir.

JSP Sayfalarında Kullanılan Deyimler

JSP sayfaları dinamik içerikten oluşur. Bu dinamikliği sağlamak için JSP’lerde kullanılan bildirim deyimleri vardır.

Jsp sayfalarında kullanılan deyimler 6 çeşittir. Bunlar ;

  1. <%@ directives %>                : Çevirim anı olaylarını JSP Engine’e tayin eder.
  2. <%! Java declarations %>    : Metod ve değişken tanımları yapılır.
  3. <% java code %>                     : Jsp sayfası içerisine Java kodları yazılır.
  4. <%= expression %>               : Değerleri ekrana yazmanın kısa yoludur.
  5. <jsp:actionName />              : İstekleri Jsp Engine’e temin eder.
  6. <%– comment –%>              : Commentler yazılır.

1)      DIRECTIVES (<%@ directives %>) :

3 çeşit direktif vardır :

  • page: sayfanın genel özellikleri hakkında bilgi verir.
    • <%@page language=“java” %>
  • include: Jsp Engine’e o sayfanın başka bir dosyayı kullandığını belirtir. (file özelliği zorunludur)
    • <%@include file=”copy.html” %>
  • taglib: Jsp sayfasında kullanılan tag kütüphanesini prefix ile ilişkilendirir.
    • <%@taglib prefix=”test” uri=”taglib.tld” %>

Etiket isimleri, özellikleri, değerleri küçük büyük harf duyarlıdır. Değerler tek tırnak veya çift tırnak içerisine yazılabilir. İkisi de aynı anlama gelir. =’den sonra boşluk bırakılmaz.

2)      DECLARATIONS (<%! declarations%>) : 

Bu bloğun içerisine yazılan Java kodları Jsp Engine tarafından oluşturulan servlet sınıfının service() metodu dışarısında oluşturulur. Eğer JSP içerisinde jspInit() ve jspDestroy() metodları ezilecekse declaration içerisine yazılmalıdır. Declaration içerisine yazılmayan tüm java kodları, html kodları, JSP scriptletleri ve expressionları service() metodunun bir parçasıdırlar.

3)      JAVA CODE (<% java code %>) :

JSP sayfasının herhangi bir yerinde <% … %> tagleri arasına Java kodu yazılabilir. Bu etiketler arasında yazılan kodlar normal Java kodu olduğundan komut sonlarına “;” konulması gerekir.

4)      EXPRESSIONS (<%= expressions %>) :

Dinamik bir şekilde üretilen değerleri ekrana yazmanın kısa yoludur. Uzun yolu servlette yapıldığı şekliyle <% %> tagleri arasına PrintWriter objesi oluşturarak println() metodunu çağırmaktır. Expressionlar kullanılırken eğer bir metod çağrılıyorsa mutlaka o metodun değer döndürmesi gerekir. Void metodlar kullanılmaz, hata verir.

5)      ACTION (<jsp:actionName />) :

6 çeşit standart action vardır :

  • jsp:include                    JSP sayfasının başka web bileşenlerini kullanmasını sağlar
  • jsp:forward
  • jsp:useBean
  • jsp:setProperty         JSP sayfasında JavaBean’leri kullanabilmeyi sağlar.
  • jsp:getProperty
  • jsp:plugin             Applet’ler gibi client-side componentlara HTML kodu oluşturulması için Jsp Engine’e yol gösterir.

6)      COMMENT (<%– comments–%>) :

JSP commentleri <%– … –%> arasına,

HTML commentleri <!– … –> arasına yazılır.

Servlet Sınıfları

Servlet sınıfları dinamik web sayfaları tasarlamak için kullanılan nesnelerdir. İlk olarak CGI programlarının dezavantajlarını gidermek için ortaya çıkmıştır. Aslında CGI programlarıyla aynı işi yapsalarda farklı şekilde çalışırlar.

Servlet’ler web container içerisinde ayrı bir process olarak çalışmazlar. Web container kendisi işletim sistemi için bir process’tir. Bu sayede aynı servlet sınıfına birden fazla istek gelse bile birden fazla instance yaratılmaz. Her istek için bir thread oluşturulur.

Avantajları :

  • Java ile yazılmıştır. 🙂
  • CGI’dan çok daha hızlı çalışır.
  • Web container, servlet sınıflarına özel güvenlik ve hata ayıklama servisleri destekler.

Servlet sınıflarının dezavantajı yok denecek kadar azdır. Java ile yazıldığı için bu programlama diline hakim olmak gerekir. Servlet sınıflarının çalışma mantığı şu şekildedir :

  • Servlet’ler, Java sınıfları oldukları için istek geldiği anda instance’larının yaratılması gerekir. Yalnız  normalde biz sınıfların instance’larını new saklı kelimesi ile yaratırken Servlet sınıflarında iş biraz değişir. Web Container başka bir adıyla Servlet Engine, istek sınıfa yapıldığı anda instance yaratır.
  • Servlet sınıflarının diğer sınıflardan farklı olduğu uygulamanın konfigurasyon dosyasında ya da annotation kullanarak belirtilir.
  • Her HTTP metodu için servletlerde kullanılan doXxx() metotları vardır. Gelen isteğin metoduna bakılarak servlet içerisindeki ilgili metot çalıştırılır.

Şimdi en basit haliyle örnek bir servlet kodu yazalım.

[codesyntax lang=”java” lines=”no”]

package com.javauzmani.servlets;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Erkin Pehlivan
 */
@WebServlet(name = "MerhabaServlet", urlPatterns = {"/MerhabaServlet"})
public class MerhabaServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Başlık MerhabaServlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Merhaba Dünya</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
}

[/codesyntax]

Gördüğünüz gibi bir Java sınıfı içerisinde HTML kodu yazmak zorunda kaldık. Web sayfalarımız daha karmaşık hale geldikçe kod yazmak zorlaşacaktır. İşte JSP sayfalarının çıkışı da buradaki zorluklardan kaynaklanmıştır.

JSP Sayfaları

JSP sayfaları, Servlet’ler gibi davranan text tabanlı dosyalardır.  JSP Engine adı verilen bir yapı ile JSP sayfasına istek geldiğinde aynı işi yapan bir Java sınıfı yaratılır. Bu sebeple JSP ve Servletleri aynı işi yapan yapılar olarak görebiliriz.

Application server’ın bulduğu dosya eğer bir JSP sayfası ise JSP_Engine adı verilen sınıf çalışarak bu sayfayı bir servlet class’ına çevirir. Oluşturulan bu sınıf derlenerek hafızaya yüklenir ve çalıştırılır. Bulunan dosya eğer bir Jsp sayfası değilse aynen geri döndürülür. Yani resimse resim, javascript ise javascript aynen geri döner.

JSP Engine tarafından yaratılan servlet sınıfı HttpJspPage interface’ini implement eder. HttpJspPage interface’i JspPage interface’inden, o da Servlet interface’inden extend ettiği için yaratılan sınıfın tüm bu interface’lerde tanımlanan metodları override etmesi gerekir.

JspPage arayüzünde jspInit() ve jspDestroy() metodları bulunur. jspInit() metodu servlet instance’ının yaratılması için kullanılır. Yaratılan sınıftaki herhangi bir metod çalışmadan önce bu metod çağrılır. jspDestroy() metodu container’ın instance’ı servis dışı bırakmaya karar verdiği anda çağrılır. Servlet instance’ında çağrılan son metodtur. jspInit() metodu ile yaratılan tüm kaynaklar bu metod çağrılarak yok edilir. Bu metod container tarafından çağrılır ancak kaynaklar yok edilirken yapılacak işler varsa bu metodu override etmek de mümkündür.

HttpJspPage arayüzünde _jspService() adı verilen bir metod tanımı bulunur. Bu metod o sınıfa yapılan her istekte çalıştırılır.

Bahsettiğimiz bu 3 metod servletlerdeki init(), destroy() ve service() metodlarına karşılık gelir.

Bir JSP sayfasına ilk kez erişildiğinde biraz yavaş çalışır. Daha sonrakilerde ise hızlanır. Bunun nedeni JSP sayfalarının servlet sınıflarına dönüştürülme işlemidir. Her istek için Jsp Engine, Jsp sayfası ile oluşturulmuş olan servlet sınıfı aynı mı diye kontrol eder. JSP değişmişse tekrar derleyerek yeni bir servlet sınıfı oluşturur.

                Bir JSP sayfasının yaşam döngüsü şu şekildedir :

  • Sayfa parse edilerek Java sınıfına dönüştürülür.
  • Compile edilir.
  • Hafızaya yüklenir.
  • instance yaratılır.
  • jspInit() metodu çağrılır.
  • _jspService() metodu çağrılır.
  • jspDestroy() metodu çağrılır.

İlk 4 adım JSP’nin servlete dönüşme adımlarıdır.

JSP’lerle servlet’lerde HTML kodu yazmaktan kurtuluruz. Jsp sayfaları HTML sayfalarına benzer yapıdadır. İçerisine bazı özel taglar ile Java kodu da yazılabilir. Bu sayede görsel bütünlük sağlanarak sayfalar tasarlanabilir. Ancak yine Java kodları ile HTML kodları birleşmiş ve aynı sayfada beraber kullanılmış olur. Ayrıca her sayfa için ayrı kod yazılmalıdır. Bundan kurtulmak için geliştirilmiş teknoloji JSTL (Java Standart Tag Library) JSTL ile hazır yazılmış Java kütüphaneleri hiç Java kodu yazmadan kullanılır.

HTML sayfaları ile JSP sayfaları arasındaki fark HTML sayfaları static içerikten oluşurken JSP sayfalarının içeriğinin değiştirilebilir olmasıdır.