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?
Jakarta/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.
NOT: Jakarta EE geçişiyle birlikte paket adları javax yerine jakarta paketiyle kullanılmaya başlanmıştır.
Servlet yaşam döngüsü
Servlet sunucusuna istek geldiğinde jakarta.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.
- jakarta.servlet.Servlet: Temel Servlet arayüzü metotları yer alır.
- jakarta.servlet.GenericServlet: Servlet, ServletConfig ve Serializable arayüzünü uygulayan soyut sınıftır.
- Protokol bağımsız olarak çalışır.
- jakarta.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 jakarta.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 Jakarta/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 jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.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 jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.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 jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.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 jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.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 jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.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 jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.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("https://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 Jakarta/Java EE uygulamalarında JSP, JSF vb. uygulamaların temelini oluşturur.
Spring Web gibi framework’lerin temelinde Servlet vardır.
Servlet MVC mimarisinde gelen isteklerin yönetildiği Controller görevini üstlenir.
Java Servlet örneğine buradan ulaşabilirsiniz.
Java Derslerine buradan ulaşabilirsiniz.
Hayırlı günler dilerim.