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;
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ı şöyle1. 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ı.İ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
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 metoduEğ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 metoduBu 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