16 Aralık 2021 Perşembe

Servlet HttpServlet Sınıfı

Giriş
Eski kodlarda şu satırı dahil ederiz
import javax.servlet.http.HttpServlet;
Yeni kodlarda yani Jakarta'da şu satırı dahil ederiz
import jakarta.servlet.http.HttpServlet;
Bu sınıfı kullanabilmek için javax.servlet-api.jar classpath'te bir şekilde mevcut olmalı.

Kendi sınıfımızı yazmak istersek şöyle yaparız. Burada Serializable'dan kalıtmak isteğe bağlı.
public class MyServlet extends HttpServlet implements Serializable {
...
}
Sınıfın 3 tane önemli metodu var. Bu 3 metodun hepsi protected ve hepsi service metodu tarafından tetikleniyor.

public service metodu
Container public service metodunu çağırır. Metodun imzası şöyle
public void service(ServletRequest req,ServletResponse res)
  throws ServletException,java.io.IOException
Açıklaması şöyle
1. Upon request from the client, Container creates two objects : HttpServletRequest and HttpServletResponse.

2. Based on the request, Container will find correct Servlet (as per URL mapping), creates new thread for that particular request(one-to-one mapping - new thread for each request) and calls Servlet's service method, passing in created HttpServletRequest and HttpServletResponse objects as arguments.

3. Based on request method (GET or POST) service() method will call doGet() or doPost() method in Servlet, again passing the same HttpServletRequest and HttpServletResponse objects as arguments.
Bu metod protected service metodunu tetikler.

protected service metodu
Görüldüğü gibi yukarıdaki ServletRequest nesnesi  HttpServletRequest nesnesine,  ServletResponse ise HttpServletResponse nesnesine dönüştürülüyor. Metodun imzası şöyle
protected void service(HttpServletRequest req, HttpServletResponse resp)
  throws ServletException,java.io.IOException
Kendi servlet'imizi yazarsak bu metodu override ederiz. Şöyle yaparız.
@Override
protected  void service (HttpServletRequest req, HttpServletResponse resp) 
  throws ServletException, IOException {
  System.out.println(req.toString());        
}
Ancak bence bu metodu override etmek için hiçbir sebep yok. Her zaman doGet(), doPost() metodları kullanılmalı.

doGet metodu
İmzası şöyle
public void doGet(HttpServletRequest req, HttpServletResponse res);
Bu metod sadece veriyi sunucundan çekmek için kullanılmalı. Get metodu ile silme (delete) işlemi yapmak yanlıştırÖrneğin aşağıdaki html get ile delete işlemi yapıyor!
<a href="delete.php?deleteWhat=everything&deleteMode=unrecoverable">index me!</a>

Container'lar tarafından sağlanan default metodlar şöyle. Yani hata döndürüyorlar.
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
  String protocol = req.getProtocol();
  String msg = lStrings.getString("http.method_get_not_supported");
  if (protocol.endsWith("1.1")) {
    resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
  } else {
    resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
  }
}
Dolayısıyla doGet() metodu içinde super.doGet() yapılmamalı! Aşağıdaki kod yanlış
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
  super.doGet(request, response);
  ...
}
Örnek
Şöyle yaparız
public class HelloServlet extends HttpServlet {
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
    response.setContentType("text/plain");
    response.setStatus(HttpServletResponse.SC_OK);
    response.getWriter().println("Hello World!");
  }
}
doPut metodu
Bu metod verilen resource'u saklamak için vardır. Dolayısıyla doGet() metodundaki gibi parametre geçilemiyor. Yani HttpServletRequest nesnesinden parametre alınamıyor. Aşağıdaki örnekte params'ın boyu 0 gelir.
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws {
   Map<String,String[]> params = req.getParameterMap();
   System.out.println(params.size());
}
Bir başka örnekte aynı şeyi görebiliriz.
public void doPut(HttpServletRequest request, HttpServletResponse response) {
    String name = request.getParameter("name");
    // name is null
}
Verilen resource ancak request.getInputStream() ile okunabilir.
BufferedReader br=new BufferedReader(new InputStreamReader(req.getInputStream());
String data = br.readLine();
Örnekte verilen PUT ile gönderilen json nesnesi önce stream'den okunuyor daha sonra nesneye çevriliyor.
ServletInputStream inputStream = request.getInputStream();
String string = convertStreamToString(inputStream); 
JSONObject jsonArray= new JSONObject(string);
doPost metodu
Eğer istenirse post ile get birleştirilebilir.
public void doGet(HttpServletRequest request,HttpServletResponse response)
 throws ServletException, IOException {
 // Servlet code
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
 doGet(request, response);
}
getServletContext  metodu
Bu metod ile ServletContext arayüzüne erişilebilir.
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {
  ServletContext appContext = getServletContext();
  ...
}

Hiç yorum yok:

Yorum Gönder

Bean Validation @GroupSequence Anotasyonu

Örnek Elimizde şöyle bir kod olsun public class SampleRequest {   @NotNull   LocalDate startDate;   @NotNull   LocalDate endDate;   @AssertT...