Java Servlet Nedir? Kullanımı ve Örnekleri

Kullanıcıdan gelen istekleri yönetmek için kullanılan Java Servlet teknolojisi nedir, yaşam döngüsü, HttpServlet, Request, Response, Cookie, Session ile ilgili bilgiler yer alıyor.

Servlet nedir?

Java EE içerisinde yer alan Servlet sunucu (server) – istemci (client) tabanlı uygulamaların haberleşmesini yönetmek için kullanılan sınıf, arayüz ve paket topluluğudur.

Servlet sunucuya bir istek geldiğinde sırayla çalışacak metotları belirtir.

Bu metotlar Servlet yaşam döngüsü olarakta adlandırılır.

Servlet yaşam döngüsü

Servlet sunucusuna istek geldiğinde javax.servlet.Servlet arayüzünde yer alan metotlar-işlemler çalıştırılır.

  • Servlet sınıfı yüklenir.
  • Servlet sınıfından bir örnek oluşturulur.
  • init metodu çalıştırılır.
    • Servlet başlatıldığında çalıştırılır.
  • service metodu çalıştırılır.
    • Her gelen isteği ayrıştırır ve uygun işlem yapılır.
  • destroy metodu çalıştırılır.
    • Servet durdurulduğunda veya yeniden başlatıldığında çalıştırılır.
  • javax.servlet.Servlet: Temel Servlet arayüzü metotları yer alır.
  • javax.servlet.GenericServlet: Servlet, ServletConfig ve Serializable arayüzünü uygulayan soyut sınıftır.
    • Protokol bağımsız olarak çalışır.
  • javax.servlet.http.HttpServlet: HTTP protokolünden gelen istekler için kullanılır.
    • Soyut sınıf içerisinde yer alan doGet, doPost, doPut, doDelete gibi metotlar kullanılarak gelen istek yöntemine göre dönüş yapılabilir. Servlet içindeki javax.servlet.http paketi gelen istekleri yönetmek için HttpServletRequest, HttpServletResponse, Cookie, HttpSession gibi protokole özgü çeşitli arayüz, soyut sınıf ve sınıflar yer alır.

Servlet Container nedir?

Servlet’in istemciye gönderilmesi için derlenmesine ihtiyaç duyulur.

Bu derleme işlemi Servlet Container olarak adlandırılan Tomcat, Jetty gibi çeşitli uygulamalar tarafından yapılır.

NOT: Tomcat kurulumu için gerekli dosyaların indirilmesi ve bir yere çıkarılıp IDE’ye tanıtılması yeterlidir.

Tomcat kurulumu ve kullanımı hakkında detaylı bilgi için Tomcat yazıma bakmanda fayda var.

Servlet Container vs Web Server vs Application Server

Servlet Container oluşturulan Servlet’leri derler ve web server’a iletir.

Web Server gelen isteklere göre istemciye cevap verir.

NOT: Web Server gelen Servlet istekleri yönetmek için web.xml dosyasını kullanır.

Application Server ise içerisinde Servlet Container, Web Server ve diğer Java EE API’lerini sağlayan daha gelişmiş bir uygulamadır.

web.xml

Servlet dosyaları kendi başlarına bir anlam ifade etmez.

Servlet dosyalarının gelen isteklerle eşleşmesi için web.xml dosyası kullanılır.

Bu dosyada temel olarak gelen isteğe göre hangi Servlet sınıfının çalıştırılacağı belirlenir.

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <context-param>
        <param-name>VTBilgisi</param-name>
        <param-value>...</param-value>
        <description>Veritabanı bağlantı bilgisi</description>
    </context-param>
    <servlet>
        <servlet-name>OrnekServlet</servlet-name>
        <servlet-class>com.yusufsezer.controller.OrnekServlet</servlet-class>
        <init-param>
            <param-name>KisiBilgisi</param-name>
            <param-value>...</param-value>
            <description>Özel bir bilgisi</description>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>OrnekServlet</servlet-name>
        <url-pattern>/OrnekServlet</url-pattern>
    </servlet-mapping>
</web-app>

context-param – Tüm Servlet’lerden erişilecek parametreyi ifade eder.

param-name – Parametre adını ifade eder.

param-value – Parametre değerini ifade eder.

description – Parametre açıklamasını ifade eder.

servlet-name – Servlet adını ifade eder.

servlet-class – Servlet class yolunu ifade eder.

init-param – Servlet’ten erişilecek parametreyi ifade eder.

load-on-startup – Servlet açılış sıralamasını ifade eder.

servlet-mapping – Servlet eşleştirmesi için kullanılır.

url-pattern – Belirtilen Servlet’in hangi isteklerde çalıştırılacağını ifade der.

Java Servlet örnekleri

Servlet’ler Servlet arayüzünü uygulayan sıradan Java sınıflarıdır.

import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class OrnekServlet extends GenericServlet {

    @Override
    public void service(ServletRequest request, ServletResponse response)
            throws ServletException, IOException {
        // yapılacak işlemler
    }
}

İstemciden gelen istek bilgileri ServletRequest ile alınır.

İstemciye gönderilmek istenen bilgiler veya cevap ise ServletResponse ile gönderilir.

import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class OrnekServlet extends GenericServlet {

    @Override
    public void service(ServletRequest request, ServletResponse response)
            throws ServletException, IOException {
        response.getWriter().println("Merhaba Servlet");
    }
}

HttpServlet

HttpServlet sunucuya gelen GET, POST, PUT, DELETE, HEAD gibi HTTP istek yöntemlerini yönetmek için doGet, doPost, doPut, doDelete, doHead gibi metotlara sahiptir.

ServletRequest yerine HttpServletRequest, ServletResponse yerine HttpServletResponse arayüzü kullanılır.

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

public class OrnekServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.getWriter().println("<h1>Merhaba Servlet</h1>");
    }
}

HTTP yöntemine göre istenilen metot ezilerek-override istenilen işlem yapılabilir.

Farklı HTTP yöntemlerine aynı cevabı vermek için metotlar birbirlerine yönlendirilebilir.

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

public class OrnekServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        calistir(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        calistir(request, response);
    }

    protected void calistir(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.getWriter().println("<h1>Merhaba Servlet</h1>");
    }
}

GET ve POST istekleri calistir metoduna tarafından kontrol edilmiştir.

HttpServletRequest

HttpServlet ile gelen istekler için HttpServletRequest arayüzü kullanılır.

Arayüz gelen isteğe ait üstbilgi(header), parametre(parameter), oturum(session), çerez(cookie) gibi bilgileri almak için kullanılacak metot tanımları yer alır.

Headers

Kullanıcı sunucuya bir istek yaptığında tarayıcılar çeşitli bilgileri sunucuya iletir.

Bu bilgiler tarayıcı bilgileri, istek yapılan sayfa adresi, dil gibi değerlerdir ve header bilgileri olarak adlandırılır.

Header bilgilerini almak için kullanılan metotlar ve kullanımı aşağıdaki örnekte yer almaktadır.

import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OrnekServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // getHeader
        String userAgent = request.getHeader("user-agent");
        System.out.println(userAgent);

        // getHeaderNames
        Enumeration<String> headers = request.getHeaderNames();
        while (headers.hasMoreElements()) {
            String header = headers.nextElement();
            System.out.println(header + ": " + request.getHeader(header));
            //System.out.println(header);
        }

        // getHeaders
        headers = request.getHeaders("user-agent");
        while (headers.hasMoreElements()) {
            String header = headers.nextElement();
            System.out.println(header);
        }
    }
}

Parameters

Adres sonuna eklenen parametreleri (GET) ve form bilgilerini (POST) almak için kullanılır.

/OrnekServlet?firstname=Yusuf&lastname=SEZER

Parametreleri almak için kullanılan metotlar ve kullanımı aşağıdaki örnekte yer almaktadır.

import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OrnekServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // getParameter
        String firstName = request.getParameter("firstname");
        String lastName = request.getParameter("lastname");
        System.out.println(firstName + " " + lastName);

        // getParameterMap
        Map<String, String[]> parameterMap = request.getParameterMap();
        for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
            String key = entry.getKey();
            String[] value = entry.getValue();
            System.out.println(key + " " + value[0] + " " + value.length);
        }

        // getParameterNames
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String parameter = parameterNames.nextElement();
            System.out.println(parameter);
        }

        // getParameterValues
        String[] parameters = request.getParameterValues("firstname");
        if (parameters != null) {
            for (String parameter : parameters) {
                System.out.println(parameter);
            }
        }
    }
}

Sessions

Kullanıcıya ait bilgilerin sunucuda tutulduğu alan oturum veya session olarak adlandırılır.

Üyelik sistemi, işlem adımlarını takip etmek veya kullanıcıyı tanımlamak için sıklıkla kullanılır.

HttpSession session = request.getSession();
Object istekSayisi = session.getAttribute("istekSayisi");
if (istekSayisi == null) {
    session.setAttribute("istekSayisi", 0);
    System.out.println("ilk istek");
} else {
    Integer istek = Integer.parseInt(istekSayisi.toString());
    session.setAttribute("istekSayisi", ++istek);
    System.out.println(istek);
}

Yukarıdaki klasikleşmiş örnekte kullanıcı her istek gönderdiğinde sunucuda tutulan değer arttılarak kullanıcının istek sayısı takip edilebilecektir.

HttpSession arayüzü session silmek için removeAttribute, tüm sessionları silmek için invalidate gibi çeşitli metotlara sahiptir.

Cookies

Kullanıcıya ait bilgilerin istemcide (kullanıcıda) tutulduğu alan çerez veya cookie olarak adlandırılır.

Üyelik sistemi, işlem adımlarını takip etmek veya kullanıcıyı tanımlamak için kullanılabilir.

Bilgiler istemcide tutulduğundan değiştirilme ve silinmeye açıktır.

Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
    System.out.println(cookie.getName());
    System.out.println(cookie.getValue());
}

Cookie sınıfında çerez ile ilgili işlemler yapmak için çeşitli metotlar (get,set) yer alır.

NOT: Çerezler kullanıcı tarafından değiştirilebileceğinden özel bilgiler için session kullanmak faydalı olacaktır.

HttpServletRequest arayüzünde bilgi almak için çeşitli metot tanımları yer alır.

System.out.println(request.getRequestURI());
System.out.println(request.getRemoteHost());
System.out.println(request.getRemoteAddr());
System.out.println(request.getRemotePort());
System.out.println(request.getRemoteUser());
System.out.println(request.getContextPath());
System.out.println(request.getContentLength());
System.out.println(request.getContentType());
System.out.println(request.getProtocol());
System.out.println(request.getLocale());
System.out.println(request.getLocalAddr());
System.out.println(request.getLocalName());
System.out.println(request.getLocalPort());
System.out.println(request.getMethod());
System.out.println(request.getPathInfo());
System.out.println(request.getQueryString());
System.out.println(request.getCharacterEncoding());

HttpServletResponse

HttpServlet ile istemciye gönderilen bilgiler için HttpServletResponse arayüzünü uygulayan sınıf kullanılır.

Arayüzde isteklere cevap vermek için getWriter, setHeader, setCookie, sendRedirect, setStatus, getStatus gibi metot tanımları yer alır.

getWriter

HTML veya text türünden değer göndermek için kullanılır.

PrintWriter writer = response.getWriter();
writer.println("Merhaba Servlet");

setHeader

Üst bilgi veya meta verisi göndermek için kullanılır.

setHeader("anahtar", "deger");

Kullanılan üst bilgi ve değeri tarayıcıdan tarayıcıya farklılık gösterebilir.

response.setHeader("Content-Type", "text/plain");
response.getWriter().println("<b>Merhaba Servlet</b>");

NOT: Çerezler üst bilgi kullanılarak kontrol edilir.

setCookie

İstemcide çerez oluşturmak için kullanılır.

String cookieValue = URLEncoder.encode("Yusuf Sefa SEZER", "UTF-8");
Cookie cookie = new Cookie("name", cookieValue);
response.addCookie(cookie);

Oluşturulan çerezlere erişmek için HttpServletRequest arayüzünde yer alan getCookies metodu kullanılır.

Çerezlere üst bilgi (header) ile erişim sağlanabilir.

String cookies = request.getHeader("cookie");
System.out.println(cookies);

sendRedirect

Kullanıcıyı başka bir adrese yönlendirmek için kullanılır.

response.sendRedirect("http://www.yusufsezer.com.tr");

setStatus

Tarayıcıya sayfa durumu ile ilgili bilgi vermek için kullanılır.

response.setStatus(401);

NOT: Ayrıntılı bilgi için HTTP durum kodlarını incelemek faydalı olacaktır.

sendError

Özel HTTP hata sayfaları için kullanılır.

response.sendError(401);

RequestDispatcher

Gelen isteği başka bir Servlet’a aktarmak için RequestDispatcher kullanılır.

RequestDispatcher requestDispatcher = request.getRequestDispatcher("/MerhabaServlet");
requestDispatcher.include(request, response);
//requestDispatcher.forward(request, response);

sendRedirect sayfayı yönlendirdiğinde adresi değiştirirken RequestDispatcher adresi değiştirmez.

RequestDispatcher arayüzünde yer alan include ve forward metotları aynı işleve sahiptir.

Aralarındaki fark include metodunun önceki çıktıyı birleştirme imkanı vermesidir.

ServletContext

Servlet hakkında bilgi almak için kullanılır.

ServletContext tüm Servlet için tek olduğundan tüm kullanıcılar aynı bilgiye erişebilir.

ServletContext servletContext = request.getServletContext();
servletContext.setAttribute("onlineSayisi", "500");

Servlet listesini almak için aşağıdaki komutlar kullanılabilir.

ServletContext servletContext = request.getServletContext();
Map<String, ? extends ServletRegistration> servletRegistrations = servletContext.getServletRegistrations();
for (Map.Entry<String, ? extends ServletRegistration> entry : servletRegistrations.entrySet()) {
    String key = entry.getKey();
    ServletRegistration value = entry.getValue();
    System.out.println(key);
}

Servlet filtreleri

Java Servlet içerisinde yer alan filter özelliği gelen istekleri filtrelemek için kullanılır.

Örneğin; Özel sayfalara sadece yetkili kullanıcıların erişimi sağlaması, istemciye gönderilecek cevapların sıkıştırılması gibi işlemler yapılabilir.

Servlet filtreleri’de Servlet’ler gibi web.xml ile yönetilir.

Son

İsteklerin yönetilmesi için kullanılan Servlet Java EE uygulamalarında JSP, JSF vb. uygulamaların temelini oluşturur.

Spring gibi framework’lerin temelinde Servlet vardır.

Servlet MVC mimarisinde gelen isteklerin yönetildiği Controller görevini üstlenir.

Java Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!