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 servlet
lerin çalıştırılabilmesi için bir servlet container
a gereksinimimiz olacak. Servlet container olarak Tomcat 8 kullanacağız.
Tomcat 8 kurulumu
Tomcat 8’i bu adresten indirebilirsiniz.
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
$ 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.
Eğer sizin Eclipse’iniz böyle değilse:
- Bir önceki adımdan Eclipse’i indirebilirsiniz.
- Eclipse WTP eklentisini kurabilirsiniz.
Eclipse'e sunucu (Tomcat 8) ekleme
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 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.
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.
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.
Projenin Son Görünümü
Proje son durumda şöyle görünüyor:
Uygulamayı Çalıştırma
Projeye sağ tıklayarak açılan menüden uygulamamızı Tomcat’e deploy ederek çalıştırabiliriz.
Merhaba Dünya
http://localhost:8080/MerhabaDunya/selam adresini ziyaret ederseniz Java servlet kullanarak dünyaya merhaba dediğinizi görebilirsiniz.
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:
http://localhost:8080/MerhabaDunya/selam
adresini tarayıcının adres çubuğuna yazınca tarayıcı bu adrese HTTP GET isteği yapar.- İstek
http://localhost:8080
adresindeki Tomcat’e ulaşır. - Sunucu gelen isteğin pembe kısmına bakar. Tanımlı mappingler içinde bu
/selam
URLsine ilişkilendirilmiş bir servlet arar. - Tanımlı mappinglere göre
/selam
URLsi ileHelloWorldServlet
servleti ilişkilendirilmiş. - Sunucu (servlet container)
HelloWorldServlet
sınıfından bir nesne yaratır. - Gelen istek bir GET isteği olduğu için
HelloWorldServlet
nesnesinindoGet
methodu çağırılır. - Bizim yazdığımız kodlar
doGet
methodu içinderesponse
nesnesini değiştirir. - 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 clone
la
# 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