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.
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 PackagesEclipse 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/selamadresini tarayıcının adres çubuğuna yazınca tarayıcı bu adrese HTTP GET isteği yapar.- İstek
http://localhost:8080adresindeki Tomcat’e ulaşır. - Sunucu gelen isteğin pembe kısmına bakar. Tanımlı mappingler içinde bu
/selamURLsine ilişkilendirilmiş bir servlet arar. - Tanımlı mappinglere göre
/selamURLsi ileHelloWorldServletservleti ilişkilendirilmiş. - Sunucu (servlet container)
HelloWorldServletsınıfından bir nesne yaratır. - Gelen istek bir GET isteği olduğu için
HelloWorldServletnesnesinindoGetmethodu çağırılır. - Bizim yazdığımız kodlar
doGetmethodu içinderesponsenesnesini değiştirir. - Sunucu
responsenesnesini 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