1.1 arayüzü Servlet

Bugün yeni ve ilginç bir konuya başlıyoruz - servlet'ler . Java'nın büyük sunucu uygulamaları için fiili standart olmasına yol açan, Java'ya servletlerin eklenmesiydi. Dünyadaki tüm kurumsal yazılımların %80'i Java ile yazılmıştır. Ve Çin'de her şey %100. Peki servlet nedir?

Bir servlet, tam olarak bir Java programını bir web hizmetine dönüştüren ve istemcilerden gelen istekleri işlemesine izin veren şeydir. Ve böyle oldu...

90'larda, World Wide Web'in ortaya çıkışından hemen sonra, web istemcileri (tarayıcılar) ve web sunucuları ortaya çıktı. Web sunucuları genellikle depoladıkları dosyayı İnternet üzerinden dağıtırlar: html sayfaları, komut dosyaları, resimler vb.

Bir noktada herkes, her iki tarafı da daha akıllı hale getirmenin gerekli olduğu sonucuna vardı. HTML sayfalarına JavaScript eklendi ve sunuculara eklentiler eklendi - belirli isteklere yanıt olarak çağrılan ve sunucunun davranışını daha esnek ve daha akıllı hale getiren özel komut dosyaları.

Dolayısıyla bir servlet, belirli sayfalar için istendiğinde Java kodunu yürütmesine izin veren yerleşik bir Java eklentisidir . Java web-serverVe zaten Servlet sınıfından miras alınan bir sınıf tarafından temsil edilen bu Java kodu, geliştiricilerinin istediğini yaptı.

Ve zaten bildiğiniz gibi, en popüler Java web sunucusu Tomcat'tir . Bu arada, "Tom ve Jerry" çizgi filminden kedi Tom'un onuruna seçildi.

Tomcat, servlet'lerle nasıl etkileşime girer? Aslında, bu süreç standartlaştırılmıştır ve servlet yaşam döngüsü olarak adlandırılır . İçinde, bir sunucu uygulaması yüklenebilir bir nesnedir ve bir web sunucusu bir sunucu uygulaması kabıdır .

Sunucu uygulaması henüz yüklenmemişse , o zaman:

  1. Sunucu uygulaması sınıfı, kapsayıcı tarafından yüklenir.
  2. Kapsayıcı, sunucu uygulamasının sınıfının (nesnesinin) bir örneğini oluşturur.
  3. Konteyner, init()sunucu uygulaması nesnesinde bir yöntem çağırır. Yöntem yalnızca bir kez çağrılır.

Standart iş döngüsü - bir müşteri talebine hizmet verme :

  • Her istek ayrı bir iş parçacığında işlenir.
  • Konteyner, service()sunucu uygulamasında bir yöntem çağırır ve oradaki ServletRequest ve ServletResponse nesnelerini iletir.
  • destroy()Sunucu uygulamasını sonlandırmak için, sunucu uygulaması nesnesinde bir yöntem çağrılır . Sadece bir kez denir.

Bir sunucu uygulamasının sona ermesinin birçok nedeni olabilir:

  • Programcı web sunucusunu yeniden başlatır, tüm servlet'leri incelikle kapatmak gerekir.
  • Programcı sunucu uygulamasının yeni bir sürümünü yükler, eskisinin doğru şekilde boşaltılması gerekir.
  • Ve benzeri.

Ana şeyi hatırlayın: web sunucusu ve sunucu uygulamaları, hatasız çalışmalı ve aylarca yeniden başlatılarak dakikada binlerce isteğe hizmet etmelidir. Bu nedenle, bir servlet'in hem yüklenmesi hem de çalıştırılması ve boşaltılması için kod her zaman çok yüksek kalitede yazılmalıdır.

1.2 HttpServlet sınıfı

Servlet sınıfı, bir sunucu uygulamasının ve bir kapsayıcının nasıl çalıştığını standartlaştırmak için vardır. Programcılar doğrudan bu sınıfla çalışmazlar. Eh, nadiren çalışırlar. En sık kullanılan sınıf HttpServletServlet'ten miras alınır.

Bu sınıfın bizim için yararlı olacak birkaç yöntemi var. Bunları sıklıkla kullanacaksınız:

Yöntem Tanım
1 init() Sunucu uygulaması yüklendiğinde bir kez çağrılır
2 destroy() Sunucu uygulaması kaldırıldığında bir kez çağrılır
3 service(HttpRequest, HttpResponse) Sunucu uygulamasındaki her yeni istek için çağrılır
4 doGet(HttpRequest, HttpResponse) Sunucu uygulamasına yapılan her yeni GET isteği için çağrılır
5 doPost(HttpRequest, HttpResponse) Sunucu uygulamasına yapılan her yeni POST isteği için çağrılır
6 doHead(HttpRequest, HttpResponse) Sunucu uygulamasına yapılan her yeni HEAD isteği için çağrılır
7 doDelete(HttpRequest, HttpResponse) Sunucu uygulamasına yapılan her yeni DELETE isteği için çağrılır
8 doPut(HttpRequest, HttpResponse) Sunucu uygulamasına yapılan her yeni PUT isteği için çağrılır

init()ve yöntemleri destroy()Servlet sınıfından miras alınır. Bu nedenle, sunucu uygulamanızda bunları geçersiz kılmaya karar verirseniz, uygulamalarını temel sınıftan da çağırmanız gerekir. Bunun için komut kullanılır super.method name().

Servlet örneği:


public class FirstHttpServlet extends HttpServlet {
  
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        // Getting the parameter “secret” from request
        String secret = request.getParameter("secret");
 
        // Put parameter “secret” into Http-session
        HttpSession session = request.getSession(true);
        session.setAttribute("secret", secret);
 
        // Print HTML as response for browser
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Header</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet example "+ secret +"</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
}

1.3 hizmet(HttpServletRequest, HttpServletResponse) yöntemi

Bir müşteri isteğinin işlenmesine bir servlet açısından bakarsanız, işler buna benzer bir şeydir.

Her istemci isteği için, kapsayıcı (web sunucusu) oluşturur HttpServletRequestve nesneler HttpServletResponseve ardından service(HttpServletRequest request, HttpServletResponse response)karşılık gelen sunucu uygulamasında bir yöntem çağırır. requestBu nesneler, yöntemin gerekli verileri alıp çalışmanın sonucunu içine koyabilmesi için ona iletilir response.

Yöntemin service()varsayılan bir uygulaması vardır. Yeniden tanımlanmazsa, yürütülür. yaptığı şey bu.

Yöntem, service()istekten (GET, POST, ...) HTTP yöntemi türünü belirler ve isteğe karşılık gelen yöntemi çağırır.

Yöntem Tanım
1 service(HttpRequest, HttpResponse) Sunucu uygulamasındaki her yeni istek için çağrılır
2 doGet(HttpRequest, HttpResponse) Sunucu uygulamasına yapılan her yeni GET isteği için çağrılır
3 doPost(HttpRequest, HttpResponse) Sunucu uygulamasına yapılan her yeni POST isteği için çağrılır
4 doHead(HttpRequest, HttpResponse) Sunucu uygulamasına yapılan her yeni HEAD isteği için çağrılır
5 doDelete(HttpRequest, HttpResponse) Sunucu uygulamasına yapılan her yeni DELETE isteği için çağrılır
6 doPut(HttpRequest, HttpResponse) Sunucu uygulamasına yapılan her yeni PUT isteği için çağrılır

Sınıfınızda, bir yöntemi yeniden tanımlayabilir service()veya onu olduğu gibi bırakabilirsiniz, ancak ardından gerekirse yöntemleri doGet(), , ... yeniden tanımlayabilirsiniz.doPost()