CodeGym /Java Blogu /Rastgele /Bölüm 5. Servlet'ler ve Java Servlet API'si. Basit bir we...
John Squirrels
Seviye
San Francisco

Bölüm 5. Servlet'ler ve Java Servlet API'si. Basit bir web uygulaması yazmak

grupta yayınlandı
Bu materyal, "Kurumsal Geliştirmeye Giriş" serisinin bir parçasıdır. Önceki makaleler: Bölüm 5. Servlet'ler ve Java Servlet API'si.  Basit bir web uygulaması yazmak - 1Konsolda metin görüntüleyen Java uygulamalarını nasıl yazacağınızı zaten biliyor, ancak hala ilk web uygulamanızı nasıl oluşturacağınızı gerçekten bilmiyor musunuz? Harika, rahatına bak. Bu yazımızda servletleri tanıyacağız ve arkadaşlarınıza JAR dosyası göndermeden ve onları Java indirmeye zorlamadan övünebileceğiniz bir uygulama yazacağız. Basit bir web uygulaması yazalım . Web geliştirmede kullanılan yaklaşımlara zaten aşina değilseniz, " Kurumsal Geliştirmeye Giriş " serisinin ilk makalesini okuyarak başlamanızı tavsiye ederim.

sunucu uygulaması nedir?

İlk olarak, servletlerin ne olduğunu ve neden onlar hakkında bu kadar çok şey duyduğunuzu bulalım. Java Servlet API, sunucuda uygulanması amaçlanan standartlaştırılmış bir API'dir. İstemcilerle bir istek-yanıt şemasına göre etkileşime girer. Sunucu uygulaması , istemciden istek alabilen ve istemciye yanıt gönderebilen bir sınıftır. Aslında sunucu uygulamaları, Java'da bir istemci-sunucu mimarisi oluşturmak için kullandığımız yapı taşlarıdır. Serinin bir başka yazısında bu mimariden bahsetmiştik hatırlarsınız. Lafı dolandırmayacağız: hemen bir kod yazalım.

Bir web uygulaması oluşturmak için neye ihtiyacınız var?

Java servlet uygulamaları ile çalışırken en büyük kolaylık için IntelliJ IDEA Ultimate Edition'a ihtiyacınız var. Ücretli bir üründür ancak 30 günlük deneme sürümünü etkinleştirebilir veya her zaman ücretsiz olan erken erişim sürümünü kullanabilirsiniz. Ayrıca, uygulamamızın sunucusu olan Apache Tomcat'i kurun. Tomcat bir servlet kabıdır: gelen istekleri işler ve uygulamamıza iletir. Tomcat'i buradan indirin .

İlk web uygulamamızı oluşturalım.

Her şey hazırsa, bir Maven projesi oluşturun. Maven'e aşina değilseniz, önceki makaleye bir göz atın . Hadi başlayalım!
  1. pom.xml'de bir javax.servlet-api bağımlılığı ekleyin ve WAR paketlemesini belirtin:

    
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
    
       <groupId>org.example</groupId>
       <artifactId>servlets</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>war</packaging>
    
       <dependencies>
           <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>4.0.1</version>
           </dependency>
       </dependencies>
    </project>
    

    Basit sunucu uygulaması sınıfı:

    
    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;
    import java.io.PrintWriter;
    
    @WebServlet("/hello")
    public class MainServlet extends HttpServlet {
    
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           resp.setContentType("text/html");
           PrintWriter printWriter = resp.getWriter();
           printWriter.write("Hello!");
           printWriter.close();
       }
    }
    
  2. Uygulamayı çalıştırmak için bir Tomcat yapılandırması oluşturmanız gerekir:

    Bölüm 5. Servlet'ler ve Java Servlet API'si.  Basit bir web uygulaması yazmak - 2Bölüm 5. Servlet'ler ve Java Servlet API'si.  Basit bir web uygulaması yazmak - 3

  3. Ardından, Tomcat'in hangi sürümünü kullanacağımızı ve sunucuyla iletişim kurmak için URL'yi ve bağlantı noktasını belirtiyoruz. Böyle bir şey olmalı:

    Bölüm 5. Servlet'ler ve Java Servlet API'si.  Basit bir web uygulaması yazmak - 4
  4. Şimdi kapsayıcıda konuşlandırılacak eseri (bir JAR arşivindeki birleştirilmiş proje) belirtmemiz gerekiyor. Düzelt düğmesine tıklayabilir ve savaş patladı öğesini seçebilirsiniz : bu, proje yeniden oluşturulduktan sonra yapının otomatik olarak servlet kapsayıcısına yerleştirileceği anlamına gelir. Bölüm 5. Servlet'ler ve Java Servlet API'si.  Basit bir web uygulaması yazmak - 5

  5. Uygulama bağlamı için varsayılan değer servlets_war_exploded şeklindedir . Bu, uygulamaya şu adresten eriştiğimiz anlamına gelir: http://localhost:8080/servlets_war_exploded .

    Neden fazladan metin isteyelim? Gereksiz olanları silelim. Artık web uygulamamızın adresi: http://localhost:8080 .

    Bölüm 5. Servlet'ler ve Java Servlet API'si.  Basit bir web uygulaması yazmak - 6
  6. Tamam'ı tıklayın. Artık uygulamayı başlatabileceğimizi görüyoruz:

    Bölüm 5. Servlet'ler ve Java Servlet API'si.  Basit bir web uygulaması yazmak - 7

    Artık tarayıcınızda uygulamayı açtığınızda 404 hatası almalısınız. Bu mantıklı, çünkü http://localhost:8080/ adresi "/" ile eşleşen bir sunucu uygulamasına ihtiyaç duyuyor, ancak bizim tek sunucu uygulamamız "/hello" ile eşleniyor .

  7. http://localhost:8080/hello adresinden erişebiliriz . Bunu yaptığımızda, beklenen yanıtı alırız - "Merhaba" dizesi!

Her şey çalışıyorsa, kodu inceleyelim. Sıradan bir sınıftan bir HTTP sunucu uygulaması yapmak için HttpServlet sınıfını miras alması gerekir. Sınıf bildiriminin üzerinde ek açıklamayı belirtiyoruz @WebServlet(). Sunucu uygulamasını belirli bir yola ("/hello") bağladığımız (veya eşlediğimiz) yer burasıdır. Bu ek açıklama yalnızca Java Servlet API 3.0'da göründü, bu nedenle İnternet'te servlet eşlemenin bir XML dosyası aracılığıyla gerçekleştiği birçok örnek var. Bu artık gerekli değil. GET isteklerini işlemek için yöntemi geçersiz kılıyoruz doGet(). Yöntemin parametrelerine dikkat edin: HttpServletRequestve HttpServletResponse. Nesne HttpServletRequest, istekle ilgili tüm gerekli bilgileri bize sağlar. HttpServletResponse, yanıtımızı yazıp gerekli başlıkları ayarlıyoruz .

Parametreler ve bir oturumla çalışma

İstek parametrelerini işleyebilmesi ve bir oturumla çalışabilmesi için sunucu uygulamamızı geliştirelim:

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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class MainServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       HttpSession session = req.getSession();
       Integer visitCounter = (Integer) session.getAttribute("visitCounter");
       if (visitCounter == null) {
           visitCounter = 1;
       } else {
           visitCounter++;
       }
       session.setAttribute("visitCounter", visitCounter);
       String username = req.getParameter("username");
       resp.setContentType("text/html");
       PrintWriter printWriter = resp.getWriter();
       if (username == null) {
           printWriter.write("Hello, Anonymous" + "<br>");
       } else {
           printWriter.write("Hello, " + username + "<br>");
       }
       printWriter.write("Page was visited " + visitCounter + " times.");
       printWriter.close();
   }
}
visitCounterArtık sunucu uygulaması, sayfanın her ziyaret edildiğinde değerini artıran bir oturumla çalışır . Öznitelik visitCounterhenüz oluşturulmadıysa (sayfanın ilk ziyaretinde), yöntem getAttribute()null döndürür, bu nedenle null olup olmadığını kontrol etmemiz gerekir. Aynı istek parametreleri için de geçerli. Kullanıcı kullanıcı adı parametresini geçmezse, değeri boş olacaktır. Bu durumda, kullanıcıyı isimsiz bir ziyaretçi olarak karşılarız. Bir GET isteğinde parametre iletmek için bir sorgu dizesi kullanılır. Örneğin, şu URL'yi kullanabiliriz: http:// localhost:8080/hello? Kullanıcı adı=Paul. Önceki makalede HTTP istekleri hakkında daha fazla bilgi edinebilirsiniz.dizide. Uygulamamızın şu anda pek bir mantığı yok ama root yolunda 404 hatası almamız biraz can sıkıcı. Bunu düzeltmek için başka bir sunucu uygulaması oluşturacağız ve onu başlangıç ​​sayfasına eşleyeceğiz: @WebServlet("/"). Bu sunucu uygulamasının amacı, istekleri "/hello" yoluna yönlendirmektir. Bunu yapmanın iki yolu vardır: "ilet" veya "yönlendir" kullanmak. Belki de aralarındaki farkı anlamaya değer. Yönlendirme , isteğin işlenmesini sunucudaki başka bir sunucu uygulamasına devreder . Müşteri dahil değildir. Bunu yapmak için, yeni sunucu uygulamasının doGet() yöntemine aşağıdaki kodu ekleyin:

getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Bu kodda, sunucu uygulaması içeriğine erişir, ilgili sunucu uygulaması için istek göndericiyi alır ve belirtilen argümanlarla (req, resp) belirli bir isteği işlemesini isteriz. Yönlendirme , istemcinin isteğini işlemek için kullanması gereken adresi istemciye döndürür. Çoğu tarayıcı otomatik olarak döndürülen URL'ye gider. Bir yönlendirme uygulamak için şu kodu eklemeniz gerekir:

resp.sendRedirect(req.getContextPath() + "/hello");
redirect()Parametredeki yöntemi çağırıyoruz HttpServletResponseve ona istemcinin kullanması gereken adresi iletiyoruz. İşte önemli bir detay: Tam yönlendirme yolunun sonuna HTTP parametrelerinin de eklenmesi gerekiyor ki bu çok uygun değil. Bizim durumumuzda kullanmak tercih edilir forward, ancak bazen kullanmak redirectdaha iyidir. Çalışma biçimlerindeki farkı anlarsanız, yanlış seçim yapmazsınız. Yeni servlet için kod şöyle görünür:

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("/")
public class IndexServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        getServletContext().getRequestDispatcher("/hello").forward(req, resp);
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}

Özet

İlk web uygulamanız yapılır. Bir sonraki makalede, IntelliJ IDEA kullanmadan nasıl dağıtacağınızı öğreneceksiniz. Yalnızca GET isteklerini işleyen bir uygulama yazdık. Geri kalan HTTP yöntemleri, benzer şekilde, üst sınıfın karşılık gelen yöntemlerini geçersiz kılarak işlenir. Sofistike çok yönlü web uygulamaları oluşturmak için bunun gibi basit servlet'ler kullanabilirsiniz. Elbette, Spring gibi büyük çerçeveler kullanmak bunu çok daha kolaylaştırır. Ancak, servlet'lerin tüm yeteneklerini gerçekten daha derinlemesine araştırmak istiyorsanız, resmi spesifikasyonu okuyabilirsiniz . 6. Bölüm. Servlet kapsayıcıları 7. Bölüm. MVC (Model-View-Controller) modeline giriş
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION