16- Web Geliştirme ve Servletler

### Java Servlets: Temeller ve HTTP Protokolü


Servlet'ler, Java'da sunucu tarafı programlama için kullanılan bileşenlerdir ve genellikle web uygulamalarında dinamik içerik üretmek için kullanılır. Aşağıda servlet'lerin temelleri, HTTP protokolü ve servlet yaşam döngüsü, ve request-response işlemleri ile ilgili detaylı bilgiler bulunmaktadır.


---


### Servlet Temelleri


Servlet, Java dilinde yazılmış bir sunucu tarafı programıdır. Java EE (Enterprise Edition) platformunda çalışan bir servlet, genellikle bir web sunucusu veya bir uygulama sunucusu üzerinde çalışır.


#### Servlet Sınıfı


Servlet, `javax.servlet.Servlet` arayüzünü implement eden bir Java sınıfıdır. Ancak, genellikle `HttpServlet` sınıfından türetilir, çünkü bu sınıf HTTP protokolü ile ilgili işlevselliği sağlar.


##### Basit Servlet Örneği


```java

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("/hello")

public class HelloServlet extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");

        PrintWriter out = response.getWriter();

        out.println("<html><body>");

        out.println("<h1>Hello, World!</h1>");

        out.println("</body></html>");

    }

}

```


- **`@WebServlet("/hello")`**: Servlet'i bir URL yoluna bağlar.

- **`doGet(HttpServletRequest request, HttpServletResponse response)`**: HTTP GET isteklerini işler.

- **`PrintWriter`**: HTTP yanıtı yazmak için kullanılır.


---


### HTTP Protokolü ve Servlet Yaşam Döngüsü


#### HTTP Protokolü


HTTP (Hypertext Transfer Protocol), web üzerindeki veri iletimini sağlar. HTTP, istemci (genellikle bir web tarayıcısı) ve sunucu arasında veri alışverişi yapar. HTTP istekleri ve yanıtları içerir.


- **HTTP İstekleri**: İstemciden sunucuya veri gönderir.

- **HTTP Yanıtları**: Sunucudan istemciye veri gönderir.


#### Servlet Yaşam Döngüsü


Servlet'in yaşam döngüsü, dört ana aşamadan oluşur:


1. **Yükleme ve Başlatma**: Servlet, ilk kez çağrıldığında yüklenir ve başlatılır.

    - **`init()`**: Servlet'in başlatılması sırasında çağrılır.


2. **İstek İşleme**: İstemciden gelen her istek için çağrılır.

    - **`service(HttpServletRequest request, HttpServletResponse response)`**: İstek işleme metodu.


3. **Yanıt Üretme**: Servlet, HTTP yanıtını oluşturur ve istemciye gönderir.

    - **`doGet(HttpServletRequest request, HttpServletResponse response)`** veya **`doPost(HttpServletRequest request, HttpServletResponse response)`** metotları kullanılır.


4. **Kapatma**: Servlet'in yaşam döngüsü sona erdiğinde çağrılır.

    - **`destroy()`**: Servlet'in kapanışı sırasında çağrılır.


##### Servlet Yaşam Döngüsü Örneği


```java

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;


@WebServlet("/lifecycle")

public class LifecycleServlet extends HttpServlet {

    

    @Override

    public void init() throws ServletException {

        System.out.println("Servlet başlatıldı.");

    }


    @Override

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.getWriter().println("Servlet'in yaşam döngüsü");

    }


    @Override

    public void destroy() {

        System.out.println("Servlet yok edildi.");

    }

}

```


- **`init()`**: Servlet ilk kez çağrıldığında çalışır.

- **`doGet()`**: HTTP GET isteklerini işler.

- **`destroy()`**: Servlet kaldırıldığında çalışır.


---


### Request ve Response İşlemleri


Servletler, istemciden gelen HTTP isteklerini işleyip uygun yanıtları döner. İstek ve yanıt işlemleri, `HttpServletRequest` ve `HttpServletResponse` sınıfları aracılığıyla gerçekleştirilir.


#### HTTP İsteği


- **`HttpServletRequest`**: İstemciden gelen isteği temsil eder.

    - **`getParameter(String name)`**: Form verilerini alır.

    - **`getHeader(String name)`**: İstek başlıklarını alır.

    - **`getRequestDispatcher(String path)`**: İstek yönlendirmesi sağlar.


**Örnek: Form Verisi Okuma**


```java

import java.io.IOException;

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("/form")

public class FormServlet extends HttpServlet {

    @Override

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String name = request.getParameter("name");

        response.setContentType("text/html");

        response.getWriter().println("<html><body>");

        response.getWriter().println("<h1>Hello, " + name + "!</h1>");

        response.getWriter().println("</body></html>");

    }

}

```


- **`getParameter("name")`**: Form verilerini okur.


#### HTTP Yanıtı


- **`HttpServletResponse`**: Sunucudan istemciye yanıtı temsil eder.

    - **`setContentType(String type)`**: Yanıtın içeriği türünü ayarlar.

    - **`getWriter()`**: Yanıtı yazmak için `PrintWriter` döner.

    - **`sendRedirect(String location)`**: Yanıtı başka bir URL'ye yönlendirir.


**Örnek: Yanıt Gönderme**


```java

import java.io.IOException;

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("/redirect")

public class RedirectServlet extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.sendRedirect("https://www.example.com");

    }

}

```


- **`sendRedirect("https://www.example.com")`**: Kullanıcıyı başka bir sayfaya yönlendirir.


---


### Özet


Java Servlets, dinamik web içeriği oluşturmak için kullanılan sunucu tarafı bileşenleridir. HTTP protokolü, istemci ve sunucu arasındaki veri alışverişini sağlar. Servlet'lerin yaşam döngüsü, yükleme, istek işleme, yanıt üretme ve kapanma aşamalarını içerir. `HttpServletRequest` ve `HttpServletResponse` sınıfları, HTTP isteklerini ve yanıtlarını yönetmek için kullanılır. Bu bilgileri kullanarak, Java web uygulamalarında dinamik içerik üretimini ve veri yönetimini daha etkin bir şekilde yapabilirsiniz.