Başlangıç düzeyi (?)
Bölüm: Java EE
Okuma süresi: 20min
Yazar: Destan Sarpkaya
Oluşturulma: 2014-09-03
2 Son güncellenme: 2014-09-03
Sürüm: v1
Lisans: Creative Commons License Attribution-ShareAlike 4.0 International

Örnek Servlet | Servlet Tutorial

Bu yazının sonunda sunucuda çalışan bir Java uygulamamız olacak. Biz tarayıcımıza bu uygulamanın URLsini yazınca, uygulama bir HTML sayfası üretecek ve tarayıcıya gönderecek. Böylelikle siz de üretilen HTML sayfasını görmüş olacaksınız.

Yazının sonunda Java Servlet teknolojisiyle ilgili genel bir bilgi sahibi olacak ve servletler ile basit web sayfaları yaratmaya başlayabileceksiniz.

Başlamadan önce

Eğer henüz Servlet nedir? sunumunu okumadıysanız, bu örneğe başlamadan önce okumanızı kesinlikle tavsiye ederim.

Servlet nedir? sunumunda belirtildiği gibi, yazacağımız servletlerin çalıştırılabilmesi için bir servlet containera gereksinimimiz olacak. Servlet container olarak Tomcat 8 kullanacağız.

Tomcat 8 kurulumu

Tomcat 8’i bu adresten indirebilirsiniz.

Tomcat 8 indirme bağlantısı
.tar.gz uzantili dosyayi tercih edin. Windows kullananıyorsanız .zip tercih edin.

Eclipse Kurulumu

Eclipse’i işletim sisteminizin paket yöneticisinden indirebilirsiniz. Ancak paket yöneticisinden yükleyeceğiniz Eclipse’in sürümü oldukça eski olacaktır. O nedenle bir sonraki adıma geçerek kendinizin indirmesini öneririm.

Yine de paket yöneticisi kullanmak isteyenler için Ubuntu’da örnek:

$ sudo apt-get install eclipse-wtp
Paket yöneticisiyle indireceğiniz Eclipse'in sürümünü kurulumdan önce denetlemek için aşağıdaki komutu kullanabilirsiniz.
$ apt-cache policy eclipse-wtp
eclipse-wtp:
  Installed: (none)
  Candidate: 3.5.2-1
  Version table:
     3.5.2-1 0
        500 http://archive.ubuntu.com/ubuntu/ trusty/universe amd64 Packages

Eclipse indirme

Şu adresten “Eclipse IDE for Java EE Developers” bağlantısındaki Eclipse’i indirip sıkıştırılmış dosyayı bir klasöre çıkarın. Başka bir şey yapmanıza gerek kalmadan eclipse dosyasına çift tıklayarak Eclipse’i kullanabilirsiniz.

Eclipse Zaten Kuruluysa

Kullandığınız Eclipse sürümünün web geliştirmeye uygun sürüm olması gerekiyor. Bunu Eclipse’te Help -> About Eclipse menüsünden denetleyebilirsiniz.

Tomcat 8 indirme bağlantısı
"for web developers" ifadesi olmalı


Eğer sizin Eclipse’iniz böyle değilse:

  1. Bir önceki adımdan Eclipse’i indirebilirsiniz.
  2. Eclipse WTP eklentisini kurabilirsiniz.

Eclipse'e sunucu (Tomcat 8) ekleme

Eclipse'te yeni sunucu ekleme - Sağ tıklayarak açılan menü
Sağ tıklayarak açılan menüden 'New -> Other ...' seçeneğinini seçiyoruz


Eclipse'te yeni sunucu ekleme - Server seçeneğinini seçiyoruz
Bu menüden 'Server' seçeneğinini seçiyoruz


Eclipse'te yeni sunucu ekleme - Sağ tıklayarak açılan menü
Apache klasörü altında Tomcat 8 seçeneğinini seçiyoruz


Eclipse'te yeni sunucu ekleme - Sunucunun yerini belirleme
İndirdiğimiz Tomcat 8'i hangi klasör altına attıysak o klasörün yolunu (path) Browse düğmesine basarak veriyoruz.


Eclipse'te yeni sunucu ekleme - Sunucu tabında yeni sunucu görünür
Sunucular (Servers) tabında yeni sunucuyu görebiliriz.



Bir Servlet Uygulaması Örneği

Artık yeni bir proje oluşturarak ilk servletimizi yazmaya hazırız.

Eclipse'te Web Projesi Oluşturma

Eclipse'te yeni proje ekleme - Sağ tıklayarak açılan menü
Menüden Dynamic Web Project seçeneğini seçiyoruz


Eclipse'te yeni proje ekleme - Proje özelliklerini belirleme
Projenin adını yazarak Finish düğmesine basıyoruz. Diğer seçenekler ön tanımlı olarak geliyor.


Eclipse'te yeni proje ekleme - Projenin ilk yapısı
İlk oluşan proje böyle görünecek, henüz hiç kod yazmadık.


Eclipse'te Paket Oluşturma

Herhangi bir sınıf yaratmadan önce bir paket yaratmalıyız. Paket oluşturmak her zaman uyulması gereken bir standarttır, bunu isteğe bağlı olarak düşünmeyin!

src klasörünün altına bir paket oluşturalım.

Bunu src klasörüne sağ tıklayıp New seçeneğini seçerek veya src klasörünü seçip CTRL+N tuşlarına basarak yapabilirsiniz.

Eclipse'te yeni proje ekleme - Yeni paket oluşturma Eclipse'te yeni proje ekleme - Paketi adlandırma
Paket adını "com.dorukdestan.tutorials.helloworld" olarak giriyoruz.


Servlet Sınıfı Yazımı

com.dorukdestan.tutorials.helloworld paketinin altına HelloWorldServlet adında bir sınıf yaratalım.

package com.dorukdestan.tutorials.helloworld;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorldServlet extends HttpServlet{

  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

    PrintWriter writer = resp.getWriter();
    writer.write("Merhaba dünya!");
  }

}

Sunucuya Servleti Tanıtma Yolu: `web.xml` veya Anotasyon

Projede kullanılan servletleri ve bu servletlere hangi urller üzerinden erişileceğini tanımlamak gereklidir. Bu tanımları yapmak için web.xml adında bir xml dosyası kullanabilir veya Servlet sınıflarının üstünde anotasyon kullanabiliriz.

Bu yazıda iki örneği de göreceğiz.

web.xml Kullanımı

Projedeki Deployment Descriptor: MerhabaDunya öğesine sağ tıklayıp Generate Deployment Descriptor Stub seçeneğini seçerseniz Eclipse sizin için WebContent/WEB-INF klasörü altında bir web.xml dosyası oluştur.

Eclipse'te yeni proje ekleme - Otomatik web.xml oluşturtma
web.xml dosyasının şablonunu otomatik olarak Eclipse oluşturtabiliriz.


web.xml dosyasını, projeyi **ilk oluştururken** açılan pencerede, proje adını girdikten sonra "Finish" düğmesi yerine "Next" düğmesine basarak ilerleyip de oluşturabilirsiniz.
Eclipse'te yeni proje ekleme - Başlangıçta otomatik web.xml oluşturtma
web.xml dosyasının şablonunu otomatik olarak Eclipse oluşturtabiliriz.


Otomatik oluşturulan web.xml dosyasına servlet tanımı ve servlet mappingi ekleyelim. Dosyanın son hali şöyle olacak:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1">

  <display-name>MerhabaDunya</display-name>

  <!-- Servlet tanimi -->
  <servlet>
    <servlet-name>MyFirstServlet</servlet-name>
    <servlet-class>com.dorukdestan.tutorials.helloworld.HelloWorldServlet</servlet-class>
  </servlet>

  <!-- Servlet mapping. Bu servlete hangi url uzerinden erisilebilecegini tanimlar. -->
  <servlet-mapping>
    <servlet-name>MyFirstServlet</servlet-name>
    <url-pattern>/selam</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>


Anotasyon Kullanımı

Servlet 3.0 spesifikasyonundan itibaren web.xml kullanmak yerine servlet tanımlarını anotasyonlarla yapabiliyoruz.

package com.dorukdestan.tutorials.helloworld;

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;

@WebServlet("/selam")
public class HelloWorldServlet extends HttpServlet {

  private static final long serialVersionUID = 1L;

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    PrintWriter writer = resp.getWriter();
    writer.write("Merhaba dünya!");
  }

}

@WebServlet(“/selam”)

Yukarıdaki yeşil bölüm servlet tanımı, mavi bölüm ise servlet url mapping tanımıdır. Url mapping bu servlete hangi urlden yapılan isteklerin ulaşacağını belirler.

@WebServlet("/selam") kullanımı aslında @WebServlet(urlPatterns = { "/selam" }) kullanımının kısayoludur.

Tek bir servlet için `@WebServlet(urlPatterns = { "/selam", "/naber", "/salute" })` biçiminde birden çok URL de tanımlayabilirsiniz.

Anotasyon kullandığınız zaman, web.xml dosyasını tamamen silebilirsiniz. Uygulamanız sorunsuz çalışır. Ancak anotasyon ile yapamadığımız bazı ayarlar vardır (welcome-files-list, session-timeout gibi). Bu ayarları vermek için web.xml dosyasını anotasyon kullandığımız uygulamalarda da kullanırız.
Anotasyon ve web.xml dosyasını birlikte kullanıyorsanız, web.xml dosyasından servlet tanımlarını ve mappingleri sildiğinizden emin olun!


Projenin Son Görünümü

Proje son durumda şöyle görünüyor:

Eclipse'te yeni proje ekleme - Projenin çalışan durumunda dosya ve klasör yapısı
Projenin çalışan durumunda dosya ve klasör yapısı.


Uygulamayı Çalıştırma

Projeye sağ tıklayarak açılan menüden uygulamamızı Tomcat’e deploy ederek çalıştırabiliriz.

Eclipse'te yeni proje ekleme - Eclipse web uygulaması çalıştırma
Eclipse üzerinden web uygulaması çalıştırma.


Eclipse'te yeni proje ekleme - Uygulamanın üzerinde çalışacağı sunucuyu seçme
Mavi kutucuğu işaretlerseniz bir daha sunucu seçimi için size sormadan Tomcat'e deploy eder.


Merhaba Dünya

http://localhost:8080/MerhabaDunya/selam adresini ziyaret ederseniz Java servlet kullanarak dünyaya merhaba dediğinizi görebilirsiniz.

Uygulamayı ilk çalıştırdığınızda Eclipse'in otomatik olarak gösterdiği tarayıcıda 404 hatası alacaksınız. Çünkü Eclipse http://localhost:8080/MerhabaDunya adresini açar. Bu adres bizim uygulamamız için base adrestir. Yani / URLsine denk gelir. Oysa biz web.xml dosyasında sadece /selam URLsi için bir mapping tanımladık. Bu nedenle uygulamamız / URLsi için ne yapacağını bilmez ve hata verir.


Neler Oldu? Yapılanların İncelemesi

Önce uygulamaya eriştiğimiz adresi inceleyelim:

http://localhost:8080/MerhabaDunya/selam

Domain: Sunucunun çalıştığı bilgisayarın adresidir.
Port: Tomcat varsayılan olarak 8080 portundan çalışır. Bunu Tomcat yapılandırmasından veya Eclipse üzerinden değiştirebilirsiniz.
Context Root: Sunucu üzerinde birden çok uygulama çalışabilir. Erişmek istediğiniz uygulamanın context rootunu yazarak isteklerinizi o uygulamaya iletirsiniz.
URL: Bu bölüme yazılan URLler uygulamada tanımlanan mappinglere göre ilgili servetlere yönlendirilir. Eğer bu kısım yazılmazsa URL / olarak girilmiş kabul edilir.

Adım adım olanlar:

  1. http://localhost:8080/MerhabaDunya/selam adresini tarayıcının adres çubuğuna yazınca tarayıcı bu adrese HTTP GET isteği yapar.
  2. İstek http://localhost:8080 adresindeki Tomcat’e ulaşır.
  3. Sunucu gelen isteğin pembe kısmına bakar. Tanımlı mappingler içinde bu /selam URLsine ilişkilendirilmiş bir servlet arar.
  4. Tanımlı mappinglere göre /selam URLsi ile HelloWorldServlet servleti ilişkilendirilmiş.
  5. Sunucu (servlet container) HelloWorldServlet sınıfından bir nesne yaratır.
  6. Gelen istek bir GET isteği olduğu için HelloWorldServlet nesnesinin doGet methodu çağırılır.
  7. Bizim yazdığımız kodlar doGet methodu içinde response nesnesini değiştirir.
  8. Sunucu response nesnesini HTMLe çevirir ve kullanıcının tarayıcısına geri yollar.

Kaynak Kodları İndirin

Yazıdaki tüm örnekleri içeren Eclipse projesini indirin.

veya

git kullanarak clonela

# Anotasyon kullanan sürüm
$ git clone https://github.com/JavaOrnekleri/OrnekServlet.git

# web.xml kullanan sürüm
$ git clone https://github.com/JavaOrnekleri/OrnekServlet.git --branch web-xml --single-branch

« Tutoriallara geri dön

| Tags: javaEE and servlet
comments powered by Disqus