Bu materyal, "Kurumsal Geliştirmeye Giriş" serisinin bir parçasıdır. Önceki makaleler: Bölüm 6. Servlet kapları - 1Son yazımızda servletler ile tanıştık ve bunları web uygulamaları oluşturmak için nasıl kullanacağımızı öğrendik. Bu eğlencenin önemli bir parçasına daha yakından bakmanın zamanı geldi: servlet kapsayıcıları.

İçindekiler:

servlet kapsayıcısı nedir?

Bir sunucu üzerinde çalışan ve oluşturduğumuz servletler ile etkileşim kurabilen bir programdır. Başka bir deyişle, web uygulamamızı bir sunucu üzerinde çalıştırmak istiyorsak, önce bir servlet kapsayıcısını dağıtırız ve ardından bunun içine servletler koyarız. İş akışı basittir: İstemci sunucuya eriştiğinde, kapsayıcı isteğini işler, hangi sunucu uygulamasının onu işlemesi gerektiğini belirler ve ardından isteği iletir. Bölüm 6. Servlet kapları - 2

Servlet kapları nasıl kullanılır?

Yönlendirme isteklerine ek olarak, bir servlet kapsayıcısı başka işlevleri de yerine getirir:
  1. JSP dosyalarından dinamik olarak HTML sayfaları oluşturur.
  2. HTTPS mesajlarını şifreler/şifresini çözer.
  3. Servlet yönetimi için kısıtlı erişim sağlar.
Genel olarak, bunların hepsi kulağa hoş geliyor. Şimdi hepsini nasıl uygulamaya koyacağımızı bulmamız gerekiyor. Pekala, bir şeyi nasıl kullanacağınızı öğrenmek için, sadece dalın ve onu kullanmayı deneyin :) O halde, bugün pratik yapacağız! En popüler servlet kapsayıcısı Apache Tomcat'tir . Açık kaynak kodludur ve ücretsiz olarak kullanılabilir. İşletim sisteminiz için Tomcat'i buradan indirin ve "eylem halinde" kapsayıcılarla çalışmayı keşfedelim.

Tomcat'i yükleme ve başlatma

  1. Tomcat'i yüklemek için, indirilen arşivi istediğiniz dizine açmanız yeterlidir.

  2. Lütfen Tomcat'in başlatılması ve çalıştırılması için Java sürüm 8 veya üzerini gerektirdiğini unutmayın. JAVA_HOME ortam değişkeninin geçerli JDK sürümüne başvurduğunu doğrulayın.

  3. Ardından, Tomcat'e kullanıcı erişimini yapılandırmanız gerekir . Bu, conf klasöründe bulunan tomcat-users.xml dosyasında yapılır.

    Tomcat'te önceden ayarlanmış dört rol vardır:

    • manager-gui — Grafik arayüze ve durum sayfasına erişim
    • manager-script — Metin arayüzüne ve durum sayfasına erişim
    • manager-jmx — JMX'e ve durum sayfasına erişim
    • manager-status — Yalnızca durum sayfasına erişim

    <tomcat-users> etiketinin içinde, bu rolleri açıkça belirtir ve bunları kullanıcımıza atarız:

    
    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <role rolename="manager-jmx"/>
    <role rolename="manager-status"/>
    <user username="user" password="password"
        roles="manager-gui, manager-script, manager-jmx, manager-status"/>
    

    Artık her şey başlamaya hazır!

  4. Bin klasöründe startup.bat dosyasını çalıştırın (Linux'ta startup.sh).

  5. Birkaç saniye sonra tarayıcınızda http://localhost:8080/ bağlantısını açın . Bir grafik kontrol paneli göreceksiniz:

    Bölüm 6. Servlet kapları - 3

    Böyle bir menü görürseniz, Tomcat çalışıyor demektir.

  6. Çalışmıyorsa, Java_HOME ve CATALINA_HOME ortam değişkenlerini manuel olarak kontrol edin:

    • JAVA_HOME — Bu, geçerli Java 8+ sürümüne atıfta bulunmalıdır.
    • CATALINA_BASE — Bu, Tomcat'e atıfta bulunmalı veya bulunmamalıdır (başka bir Tomcat sürümüne atıfta bulunmamalıdır).

Tomcat'te bir uygulama dağıtma

Tomcat'i başlatmayı başardık, bu yüzden şimdi içinde bazı projeler dağıtmanın zamanı geldi. Önceki makaledeki servlet'leri kullanalım . Ana Sunucu Uygulaması:

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 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" + "
"); } else { printWriter.write("Hello, " + username + "
"); } printWriter.write("Page was visited " + visitCounter + " times."); printWriter.close(); } }
IndexServlet:

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 IOException {
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}
Dağıtmadan önce, servletlerimizi bir WAR dosyasında paketlememiz gerekiyor. Maven genellikle bunu yapmak için kullanılır, ancak bir WAR dosyası oluşturmak için tüm servlet'ler için eşleme içeren bir web.xml dosyasına ihtiyacınız vardır. Sunucu uygulamalarını yazmak için yeni @WebServlet ek açıklamasını kullandık, dolayısıyla bir web.xml dosyamız yok. Neyse ki IDEA, projemizi bir WAR dosyasına sararak kirli işi bizim yerimize yapabilir. Bunu yapmak için proje yapısını açın (Ctrl+Shift+Alt+S) -> Eserler -> İstenen WAR dosyasını seçin -> "Proje derlemesine dahil et"in yanındaki onay kutusunu seçin -> "Tamam"a tıklayın. Bölüm 6. Servlet kapları - 4Ctrl+F9 tuş kombinasyonunu kullanarak projeyi oluşturalım. Artık WAR dosyamız hedef dizinde. Bölüm 6. Servlet kapları - 5Dosya daha basit bir adla yeniden adlandırılabilir, örneğin servlet.war ve daha uygun bir yere taşınabilir, örneğin C:\\my\\.bir kaba koyacağız . Bunu yapmanın iki yolu var.
  1. Grafik arayüzü kullanma

    Bunu yapmak için şu bağlantıyı izleyin: http://localhost:8080/manager/html . Tomcat bir kullanıcı adı ve şifre istemelidir.

    Buraya kadar beni takip ettiyseniz kullanıcı adı "user", şifre "password" dir .

    Başarıyla oturum açtıktan sonra, Tomcat Web Uygulama Yöneticisini göreceksiniz. "Uygulamalar" bölümü halihazırda 5 uygulama içerir — bunlar, Tomcat ile çalışmayı kolaylaştıran Tomcat yardımcı programlarıdır. Gelecekte silinebilirler.

    Bölüm 6. Servlet kapları - 6

    Aşağıda "Dağıt" bölümü bulunmaktadır. Burada dağıtılacak WAR arşivini seçebilirsiniz. Yolu ve içeriği manuel olarak girelim:

    Bölüm 6. Servlet kapları - 7

    "Dağıt" düğmesini tıklayın ve uygulamamızın "Uygulamalar" bölümünde göründüğünü görüyoruz:

    Bölüm 6. Servlet kapları - 8Tomcat'in grafik arayüzünü kullanarak bir oturumu durdurabilir, yeniden başlatabilir ve silebilir, ayrıca oturum uzunluğunu ayarlayabiliriz. Dağıtırken, /demo bağlamını belirledik, bu da uygulamamıza http://localhost:8080/demo kullanılarak erişildiği anlamına gelir . Kontrol et. Her şey çalışmalı.

  2. Dosya sistemi aracılığıyla

    Uygulamayı bu şekilde dağıtmak için, Tomcat'in sıkıştırılmış olduğu dizini açmanız gerekir. Ardından "webapps" klasörüne gidin. Burada daha önce karşılaştığımız yardımcı programları bulacaksınız:

    Bölüm 6. Servlet kapları - 9

    Tek yapmamız gereken servlet.war dosyamızı buraya taşımamız.

    Birkaç saniye bekledikten sonra yeni bir "servlet" klasörünün göründüğünü görüyoruz. Bu, uygulamamızın dağıtıldığı anlamına gelir. http://localhost:8080/manager/ adresindeki Uygulama Yöneticisi arayüzüne gidin . Burada uygulamamızın /servlet bağlamında konuşlandırıldığını görüyoruz:

    Bölüm 6. Servlet kapları - 10

    Bu şekilde dağıtıldığında, bağlam, dağıtılan WAR dosyasının adına göre otomatik olarak atanır. Bağlamı değiştirmek için uygulamayı içeren yeni oluşturulan klasörü yeniden adlandırabilirsiniz ancak bunu yapmadan önce WAR dosyasını kaldırmanız gerekir. Aksi takdirde, Tomcat uygulamayı arşiv adıyla yeniden konuşlandıracaktır.

    Gördüğünüz gibi, Tomcat'te uygulama dağıtmak göründüğünden çok daha kolay. Ancak diğer işlevlerinin kullanımı da kolaydır. Hadi kontrol edelim.

HTTP yerine HTTPS kullanma

Hatırlarsanız HTTP ve HTTPS arasındaki farka ayrı bir makalede bakmıştık . HTTPS, HTTP ile aynı protokoldür, ancak iletilen verileri şifreler. İstemci tarafında, tarayıcı şifrelemeden sorumludur, ancak şifrelemeyi sunucu tarafında sağlamalıyız. Tomcat, HTTP isteklerini kabul edip yönlendirdiğinden, ona şifreleme yetkisi vermek mantıklıdır. Bunu yapmak için şunları yapmalıyız:
  1. Kendinden imzalı bir sertifika oluşturun
  2. Ek sunucu ayarları yapın
Bunu yapmak için pratik yapalım.

sertifika oluşturma

Sürümden bağımsız olarak, JDK çok sayıda yardımcı program içerir. Bunlardan biri keytool'dur . Bu, şifreleme anahtarları oluşturmak ve bunlarla çalışmak için bir araçtır. Kullanmak için komut satırında C:\\Program Files\\Java\\jdk1.8.0_181\\bin dizinine gidin ve keytool -genkey -alias tomcat -keyalg RSA komutunu çalıştırın .
  • keytool — Komut satırı seçenekleriyle çalıştırdığımız yardımcı programın adı
  • -genkey — Yeni bir anahtar oluşturmak istediğimizi belirtir
  • -alias tomcat — Bir anahtar takma adı oluşturur
  • -keyalg RSA — Anahtar oluşturma algoritması olarak RSA'yı seçin
Komutu yürüttükten sonra, yardımcı program bizimle bir diyalog başlatır: Bölüm 6. Servlet kapları - 11Gerekli bilgileri girin. Şimdi ana dizinimizde bir anahtar deposu (Windows için bu C:\\Users\\{username}\\.keystore) ve içinde bir Tomcat anahtarı oluşturduk. Çoğu tarayıcının şikayet edeceği basit bir sertifika oluşturduk. Böyle bir sertifika ticari uygulamalar için uygun değildir: sadece test amaçlı kullanılabilir. Bir üretim sunucusunda, bir sertifika yetkilisinden alınan bir sertifika kullanmanız gerekir (örneğin, https://letsencrypt.org/ ).

sunucuyu yapılandırma

Artık sertifika hazır olduğuna göre, sunucu ayarlarını, yani SSL bağlayıcısını ayarlamamız gerekiyor. Bu , apache-Tomcat-9.0.30/conf/ konumunda bulunan server.xml dosyasında yapılır . İçinde bunun gibi bloklar buluyoruz:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                         type="RSA" />
        </SSLHostConfig>
 </Connector>
ve yapılandırmamızı yanlarına koyuyoruz:

    <Connector
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="C:\Users\user\.keystore" keystorePass="mypass"
           clientAuth="false" sslProtocol="TLS"/>
keystoreFile ve keystorePass parametrelerine en son değerleri atıyoruz, dosyayı kaydediyoruz ve ardından shutdown.bat ve startup.bat dosyalarını kullanarak Tomcat'i yeniden başlatıyoruz. Artık sunucu HTTPS isteklerini işlemeye hazır. Adres biraz değişti: https://localhost:8443/demo/hello . Bağlantıya tıkladığınızda, şaşırtıcı olmayan bir şekilde, sertifikanın güvenilirliği hakkında bir uyarı alacaksınız. Biraz önce de söylediğimiz gibi, normal bir sertifika almak için sertifika yetkililerinden birinin hizmetlerini kullanmanız gerekir. Ancak şimdilik hedefimize ulaştık: uygulama HTTPS protokolünü kullanarak çalışıyor ve bu önemli!

Dinamik olarak HTML sayfaları oluşturma

Şimdi başka bir özelliği göz önünde bulundurarak servlet kapsayıcılarına genel bakışımıza devam edeceğiz: dinamik HTML sayfaları oluşturma. Sıkıcı statik HTML kodu yerine değişkenleri, döngüleri, dizileri ve diğer dil yapılarını kullanarak Java kodu yazabileceğiniz mükemmel bir dünya hayal edin. Hayal edebildin mi? İyi haber şu ki, benzer bir şey var. Kötü haber şu ki, bu fanteziyi tamamen gerçekleştirmiyor. Tahmin etmediyseniz, JavaServer Sayfalarından (JSP) bahsediyoruz. Kısacası bu, bir HTML sayfasına Java kodu parçaları eklemenizi sağlayan teknolojidir. Doğru, bu Java kodu hala istemciye gönderilmeden önce HTML'ye dönüştürülür, ancak bu HTML, çeşitli faktörler dikkate alınarak dinamik olarak oluşturulacaktır. Örneğin, koşullu ifadeler kullanabilir ve bazı koşullara bağlı olarak farklı içerikler döndürebilirsiniz. Örnek JSP sayfası:

<%@ page language="java"" %>
<html>
<head>
<title>JSP</title>
</head>

<body>
<%
String firstName="name";
String secondName="surname";
    
    if (firstName.equals("name")){
      out.print("Hello: "+firstName+"<br>");
    }

    if (firstName.equals("name") && secondName.equals("surname"))
    {
      out.print("Hello, my dear friend! <br>");
    }
    else
    {
      out.print("I don't know you. Go away! <br>");
    }
%>
</body>
</html>
JSP hakkında daha fazla bilgiyi buradan edinebilirsiniz.. Günün sonunda, bu makale JSP ile ilgili değil — servlet konteynerleri hakkında konuşmak için buradayız! Peki neden JSP'den bahsettik? Çok basit: Java kodunu JSP'den HTML'ye dönüştüren şey bir servlet kabıdır. Bir sunucu uygulaması, JSP içeriğini yanıt olarak döndüreceği zaman, kapsayıcı not alır ve istemciye bu tür içeriği göndermeden önce onu tarayıcı dostu bir HTML sayfasına dönüştürür. Bugün, JSP teknolojisinin birçok benzerleri var — Thymeleaf, FreeMarket, Moustache ve diğerleri. Hepsi benzer bir şekilde çalışır. İşiniz için hangisini seçeceğiniz bir zevk meselesidir. Bu aynı zamanda bir servlet kabı seçmek için de geçerlidir. Bu örneklerde, en yaygın kapsayıcı olan Tomcat'i kullandık, ancak bazı projeler başka kapsayıcılar kullanıyor. En popüler olanları kısaca gözden geçirmek ve Tomcat'ten nasıl farklı olduklarını düşünmek faydalı olacaktır.

Tomcat'e alternatifler

  1. GlassFish , gelişimi Oracle tarafından desteklenen açık kaynaklı bir konteynerdir.

    Tomcat'in aksine, tam teşekküllü bir web sunucusudur ve servlet'lere ek olarak JavaEE çerçevesindeki diğer bileşenlerle birlikte çalışabilir. Bununla birlikte, çok daha fazla RAM kullanır. Sunucunun ince ayarını yaparken daha fazla esneklik vardır ve bu da kullanımını zorlaştırır. JavaEE çerçevesinde uygulama geliştirirken kullanılmalıdır.

  2. WildFly daha önce JBoss olarak biliniyordu . Aynı zamanda açık kaynaktır. Red Hat tarafından geliştirilmiştir. Şirketin başka bir ürünü olan JBoss Kurumsal Uygulama Platformu ile karıştırılmaması için isim değiştirildi.

    GlassFish gibi, WildFly da tam teşekküllü bir web sunucusudur. Bu arada, WildFly, kaputun altında Tomcat'i bir servlet kabı olarak kullanıyor. GlassFish'in aksine, WildFly daha hafiftir ve yapılandırması kolaydır.

  3. Jetty , öncekiler gibi açık kaynaklıdır. Eclipse tarafından geliştirilmiştir.

    Tomcat gibi, JavaEE çerçevesinin tüm bileşenlerini desteklemeyen basit bir sunucu uygulaması kabıdır. Aynı zamanda daha hafiftir ve cep telefonunda bile çalıştırılabilir. Hızlı bir şekilde başlar ve durur ve iyi ölçeklenir. Tomcat'in aksine, daha küçük bir topluluğa ve bilgi tabanına sahiptir.

  4. WebLogic , kullanımdan önce satın alınması gereken lisanslı bir yazılımdır. Oracle'a aittir.

    Tomcat'ten biraz daha geniş işlevselliğe sahiptir. FTP protokolü ile çalışabilir. Ancak uygulamaları geliştirirken ve test ederken o kadar esnek değildir.

  5. WebSphere (tam olarak WebSphere Uygulama Sunucusu) ücretli bir yazılımdır. IBM tarafından geliştirilmiştir. WildFly ve GlassFish'e benzer şekilde eksiksiz bir uygulama sunucusudur. Ancak daha kolay bir yapılandırma arabirimine ve kullanımda yüksek güvenilirliğe sahiptir.

    Eksiklikleri arasında çok fazla kaynak kullanması ve başlamasının ve durmasının uzun sürmesi yer alıyor, bu da küçük projeler geliştirirken pek uygun değil.

Doğru sunucu uygulaması kabının veya uygulama sunucusunun seçimi ilgili projeye bağlıdır. Açıkça yetersiz olanın bile mükemmel bir seçim olduğunu kanıtlayabileceği projeler var, ancak ilk başta bir servlet kapsayıcısı hakkında derinlemesine bir çalışma yapmak en iyisidir. Tomcat muhtemelen bu çalışma için mükemmel bir adaydır. Ve onu incelemek için ilk adımları çoktan attık, ama buradan sonrası size kalmış! "Kurumsal Geliştirmeye Giriş" serisinin son makalelerinde, MVC modelini tanıyacağız. Bölüm 7. MVC (Model-View-Controller) modeline giriş