Menü
Bedava
kayıt
ev  /  ÜZERİNDE/ Sosyal medya kullanıcılarını gözetlemek için bir sunucu uygulaması yazmak. Java

Sosyal medya kullanıcılarını gözetlemek için bir sunucu uygulaması yazmak. Java

Sunucu uygulamaları, bir Web uygulamasının sunucu tarafında çalışan java programlarıdır. Uygulamaların bir Web tarayıcısının işlevselliğini dinamik olarak genişletmesi gibi, sunucu uygulamaları da bir Web sunucusunun işlevselliğini dinamik olarak genişletir. Sunucu uygulamaları herhangi bir isteğe hizmet verebilirken, genellikle web sunucularını genişletmek için kullanılırlar. Bu tür uygulamalar için Java Servlet teknolojisi, HTTP'ye özgü sunucu uygulaması sınıflarını tanımlar. Javax.servlet ve javax.servlet.http paketleri, sunucu uygulamaları oluşturmak için arabirimler ve sınıflar sağlar.

  • Bir web projesinin yapısı nedir?

  • Servlet Konteyneri Nedir? Servlet yaşam döngüsü.

Sunucu uygulaması kapsayıcısı, sunucu uygulamalarının yaşam döngüsünü yöneten bir programdır.
Servlet yaşam döngüsü: Servlet kapsayıcı tarafından yönetilir, servlete ilk erişildiğinde belleğe yüklenir ve init() yöntemi çağrılır. Uygulama boyunca, istemci isteklerini işlemek için hizmet () yöntemi çağrılır. Uygulama sonlandırıldığında, yok etme () yöntemi çağrılır ve sunucu uygulaması bellekten kaldırılır.

  • Servlet kapsayıcısının görevleri ve işlevleri nelerdir?

Bir sunucu uygulaması kapsayıcısı, eksiksiz bir bağımsız web sunucusu olarak işlev görebilir, Apache gibi başka bir web sunucusu için sayfa sağlayıcı olarak hizmet verebilir veya bir Java EE uygulama sunucusuna entegre edilebilir. Sunucu uygulaması ve istemciler arasında veri alışverişini sağlar, çalışan bir sunucu uygulaması için bir yazılım ortamı oluşturma, istemcileri tanımlama ve yetkilendirme, her biri için bir oturum düzenleme gibi işlevleri yerine getirir.

  • sendRedirect() ile forward() arasındaki fark nedir?

İleri () yöntemi, göreli bir yol kullanarak bir JSP'yi çağırmak için kullanılır ve sendRedirect () yöntemi, mutlak bir yol kullanarak bir JSP'ye başvurmak için kullanılır. Bu yöntemler arasındaki fark, mevcut bir istek nesnesinin forward() yöntemiyle iletilmesi ve sendRedirect() yöntemi çağrıldığında yeni bir isteğin üretilmesidir. İkinci durumda, bilgi diğer nesnelerle aktarılmalıdır. Ayrıca, ileri () yöntemi daha hızlıdır.

  • Sunucu uygulaması filtreleri hakkında ne biliyorsunuz?

Filtre arabiriminin uygulanması, isteği engelleyen, istemcinin isteğinin başlığını ve içeriğini dönüştürebilen bir nesne oluşturmanıza olanak tanır. Filtreler bir istek veya yanıt oluşturmazlar, yalnızca onları değiştirirler. Filtre, sunucu uygulamasına ulaşmadan önce isteği önceden işler ve ardından (gerekirse) sunucu uygulamasından gelen yanıtı işler. Filtre, özellikle farklı kaynak türleri ve sunucu uygulamaları ve JSP sayfaları ile etkileşime girebilir. Servlet filtreleri şunları yapabilir:

  • sunucu uygulaması başlatılmadan önce sunucu uygulamasının başlatılmasını durdurun.
  • servlet başlatılmadan önce isteğin içeriğini belirleyin.
  • Gelen isteğin paketlendiği istek başlıklarını ve verilerini değiştirin.
  • alınan yanıtın paketlendiği yanıt başlıklarını ve verileri değiştirin.
  • sunucu uygulamasına yapılan bir çağrıdan sonra bir sunucu uygulamasının başlatılmasını engeller.

Bir sunucu uygulaması filtresi, tek bir sunucu uygulaması veya sunucu uygulaması grubu ile çalışacak şekilde yapılandırılabilir. Filtre oluşturmanın temeli, üç yöntemi uygulayan javax.servlet.Filter arabirimidir:

  • void init (FilterConfig config) ServletException'ı atar;
  • geçersiz yok et ();
  • void doFilter (ServletRequest isteği, ServletResponse yanıtı, FilterChain zinciri) IOException, ServletException oluşturur;

init () yöntemi, filtre çalışmaya başlamadan önce çağrılır ve filtrenin yapılandırma nesnesini ayarlar. doFilter yöntemi, filtrenin asıl işini yapar. Böylece sunucu, filtreyi başlatmak için bir kez init()'i, ardından doğrudan bu filtreye yapılacak istekler kadar doFilter()'i çağırır. Filtre işini bitirdikten sonra yok etme () yöntemi çağrılır.

  • Sunucu uygulamalarında neden dinleyicilere ihtiyacınız var?

Bağlam ve oturum dinleyicileri, bir bağlamın veya oturumun ne zaman başlatıldığını veya ne zaman yok edilmeleri gerektiğini ve bağlam veya oturumdan niteliklerin ne zaman eklendiğini veya kaldırıldığını takip edebilen sınıflardır. Servlet 2.4, bir isteğin nasıl yaratıldığını ve yok edildiğini ve özelliklerin servlet'e nasıl eklendiğini ve kaldırıldığını izlemenize izin vererek istek dinleyici modelini genişletir. Servlet 2.4'e aşağıdaki sınıflar eklenmiştir:

  • ServletRequestListener
  • ServletRequestEtkinlik
  • ServletRequestAttributeListener
  • ServletRequestAttributeEvent

  • Uygulamada başka bir sunucu uygulaması tarafından oluşturulan istisnaları nasıl işleyebilirim?

Tarayıcı yalnızca HTML'yi anladığından, uygulama bir istisna oluşturduğunda, sunucu uygulaması kabı istisnayı işleyecek ve bir HTML yanıtı oluşturacaktır. Bu, 404, 403 vb. gibi hata kodlarında olanlara benzer. Servlet API, dağıtım tanımlayıcısında belirtebileceğimiz istisnaları ve hataları işlemek için kendi sunucu uygulamalarımıza destek sağlar. Bu tür sunucu uygulamalarının ana görevi, hatayı veya istisnayı ele almak ve kullanıcıya net bir HTML yanıtı göndermektir. Örneğin, ana sayfaya bir bağlantı ve hatayla ilgili bazı ayrıntıların açıklamasını sağlayabilirsiniz.

  • Dağıtım tanımlayıcısı nedir?

Dağıtım tanımlayıcısı, sunucu uygulaması kapsayıcısında dağıtılacak bir yapıt yapılandırma dosyasıdır. Java Platform, Enterprise Edition belirtiminde bir dağıtım tanımlayıcısı, bir bileşenin, modülün veya uygulamanın (bir web veya kurumsal uygulama gibi) nasıl dağıtılması gerektiğini açıklar.

Bu yapılandırma dosyası, belirli ayarlara, güvenlik seçeneklerine sahip bir modül veya uygulama için dağıtım seçeneklerini belirtir ve belirli yapılandırma gereksinimlerini açıklar. Dağıtım tanımlayıcı dosyalarının sözdizimi XML'dir.

  • Bir uygulama başlatma ile bir sunucu uygulaması başlatmayı nasıl uygularım?

Sunucu uygulaması kabı genellikle sunucu uygulamasını ilk istemci isteğinde yükler, ancak bazen sunucu uygulamasını uygulamanın hemen başında yüklemek gerekir (örneğin, sunucu uygulaması hacimliyse ve yüklenmesi uzun zaman alacaksa). Bunu yapmak için, tanımlayıcıda (veya loadOnStartup ek açıklamasında) başlangıçta yüklenen öğeyi kullanmanız gerekir; bu, sunucu uygulamasının başlangıçta yüklenip yüklenmeyeceğini belirtecektir.

Değer int olmalıdır. Değer negatifse, istemcinin isteği üzerine sunucu uygulaması yüklenir ve 0 ve daha fazlası ise, uygulamanın başlangıcında yüklenir. Sayı ne kadar düşükse, sunucu uygulaması indirme kuyruğunda o kadar erken olur.

  • ServletConfig nesnesi nedir?

javax.servlet.ServletConfig arabirimi, yapılandırma bilgilerini bir sunucu uygulamasına geçirmek için kullanılır. Her sunucu uygulamasının, sunucu uygulaması kapsayıcısının başlatmaktan sorumlu olduğu kendi ServletConfig nesnesi vardır. web.xml'deki (veya WebInitParam açıklamalarındaki) init parametreleri, yapılandırma parametrelerini ayarlamak için kullanılır. Bu sunucu uygulaması için ServletConfig nesnesini almak için getServletConfig () yöntemi kullanılır.

  • ServletContext nesnesi nedir?

Javax.servlet.ServletContext arabirimi, bir dosyanın MIME türünü alma, istekleri gönderme veya bir günlük dosyasına yazma gibi bir sunucu uygulamasının sunucu uygulaması kapsayıcısıyla iletişim kurmak için kullandığı bir dizi yöntemi tanımlar. ServletContext nesnesi benzersizdir ve bir web uygulamasındaki tüm sunucu uygulamaları için kullanılabilir. Web uygulamasının başlatılmış parametrelerine bir veya daha fazla sunucu uygulamasına erişim sağlamamız gerektiğinde ServletContext nesnesini kullanabiliriz. Bunu yapmak için öğeyi kullanın web.xml'de. ServletContext nesnesi, ServletConfig arabiriminin getServletContext() yöntemi kullanılarak elde edilebilir.

Servlet kapsayıcıları, bir grup servlet için benzersiz olan bağlam nesneleri de sağlayabilir. Grupların her biri, farklı bir ana bilgisayar yolu URL'si grubuyla ilişkilendirilecektir.

ServletContext, Servlet 3 spesifikasyonunda genişletilmiştir ve uygulamanıza programlı olarak dinleyiciler ve filtreler eklemenizi sağlar. Bu arayüz ayrıca getMimeType(), getResourceAsStream(), vb. gibi birçok faydalı metoda sahiptir.

  • ServletContext ve ServletConfig arasındaki fark nedir?

Aşağıda bazı farklılıklar yer almaktadır:

  • ServletConfig, her sunucu uygulaması için benzersiz bir nesnedir, ServletContext ise tüm uygulama için benzersizdir.
  • ServletConfig, sunucu uygulamasına başlatma parametreleri sağlamak için kullanılır ve ServletContext, tüm sunucu uygulamaları için uygulama başlatma parametreleri sağlamak için kullanılır.
  • ServletConfig nesnesinde öznitelikleri ayarlama yeteneğine sahip değiliz, ancak ServletContext nesnesinde diğer sunucu uygulamaları için geçerli olacak öznitelikleri ayarlayabiliriz.

  • ServletResponse arayüzü.

ServletResponse arayüzü, istemciye veri göndermek için bir araçtır. Bu aracın tüm yöntemleri tam olarak bu amaca hizmet eder.

  • ServletRequest arayüzü.

ServletRequest arayüzü, HTTP istek parametrelerini almak için bir araçtır. Bu arabirimin adı ve amacı ServletContext ile aynı olan birkaç yöntemi vardır.

  • İstek Göndericisi nedir?

RequestDispatcher arabirimi, bir isteği başka bir kaynağa iletmek için kullanılır (bu, HTML, JSP veya aynı uygulamadaki başka bir sunucu uygulaması olabilir). Yanıta başka bir kaynaktan içerik eklemek için bunu kullanabiliriz. Bu arabirim, aynı bağlamda sunucu uygulamaları arasında dahili iletişim için kullanılır. Arayüzde uygulanan iki yöntem vardır:

  • void forward (ServletRequest var1, ServletResponse var2) - sunucu uygulamasından bir isteği sunucudaki başka bir kaynağa (sunucu uygulaması, JSP veya HTML dosyası) iletir.
  • void include (ServletRequest var1, ServletResponse var2) - Yanıt olarak kaynak içeriği (Servlet, JSP veya HTML sayfası) içerir.

Arayüze ServletContext getRequestDispatcher (String s) yöntemi kullanılarak erişilebilir. Yol, bağlamın geçerli kök yoluna göre yorumlanacak bir / ile başlamalıdır.

  • Bir sunucu uygulamasında nasıl kilitlenme oluşturabilirsiniz?

Bir kilitlenme, örneğin doGet() yönteminde doPost() yönteminin çağrılması ve doPost() yönteminde doGet() yönteminin çağrılması gibi, döngülü bir yöntem çağrısı uygulanarak elde edilebilir.

  • Sunucudaki sunucu uygulamasının adresini nasıl alabilirim?

Sunucudaki sunucu uygulamasının gerçek yolunu almak için şu yapıyı kullanabilirsiniz: getServletContext().GetRealPath (request.getServletPath()).

  • Bir sunucu uygulamasından sunucu bilgilerini nasıl alabilirim?

Sunucu bilgileri, getServerInfo() yöntemi kullanılarak ServletContext nesnesi kullanılarak elde edilebilir. Onlar. getServletContext().getServerInfo().

  • İstemcinin ip adresi sunucuda nasıl bulunur?

İstemci ipini sunucu uygulamasında almak için request.getRemoteAddr () kullanın.

  • Servlet sarmalayıcı sınıfları hakkında ne biliyorsunuz?

Servlet HTTP API, iki sarmalayıcı sınıfı sağlar - HttpServletRequestWrapper ve HttpServletResponseWrapper. Geliştiricilerin istek ve yanıt sunucu uygulaması türlerine ilişkin kendi uygulamalarını uygulamalarına yardımcı olurlar. Bu sınıfları genişletebilir ve yalnızca kendi yanıt ve istek nesne türlerimizi uygulamak için gerekli yöntemleri geçersiz kılabiliriz. Bu sınıflar standart sunucu uygulaması programlamasında kullanılmaz.

Java programlama dilinin ortaya çıkışından bu yana neredeyse yirmi yıl geçti. Bu süre zarfında Java, ölüm ve unutulma kehanetinde bulundu, yerdeki programcılar bunun engellenmesine ve kaynaklar için açgözlülüğe güldüler. Ama Java'ya inananlar da vardı, her türlü kütüphaneyi geliştirdiler, topluluğu geliştirdiler, Java için hiçbir sınırın olmadığını ısrarla kanıtladılar: gerçek zamanlı, gömülü, AI - her şey mümkün. Bu bölümde bir kenara çekilip Java ile ilgili küçük bir yazı dizisi yapmamaya karar verdik. Gitmek!

Su ısıtıcınız Java'yı seçer

Oracle'ın kendisine göre, Java sanal makinesi şu anda üç milyardan fazla cihaza kurulu. Ve bunlar sadece bilgisayarlar ve akıllı telefonlar değil, aynı zamanda kameralar, TV'ler, Blu-ray oynatıcılar, yazıcılar, SIM kartlar, otomatik vezne makineleri ve hatta arabalar. Liste istikrarlı bir şekilde büyüyecek ve bununla birlikte Java programcıları için işverenlerin teklifleri. Şimdi bile, Java programcıları için boş kadro sayısı diğerlerini aşıyor. Ve şirketler, çalışanlarını avlayarak ve daha iyi çalışma koşulları düzenleyerek, giderek daha fazla ödeme yapmaya istekli.

Ve ne işe yarar?

Java programcıları, sözdiziminin minimalizminden etkilenir. Gereksiz değiştiriciler ve hizmet kelimeleri yok. İlk başta C++ programcılarının kafasını biraz karıştıran çoklu kalıtımın olmaması bile, sonunda makul ve haklı çıkıyor. Basit mantık, otomatik bellek yönetimi, ayrıntılı belgeler, her türlü sorunun yanıtını içeren forumlar, açık kaynak - tüm bunlar, geliştirme sürecini hızlı bir şekilde incelemenize olanak tanır ve olası hataların sayısını önemli ölçüde azaltır. Hintli köylüler bile Java'yı birkaç ayda öğreniyor, en azından diplomaları öyle diyor :). Ayrıca Java, yorumlanan bir dildir. Derleyici, kaynak kodunu, geri dönüştürülmesi kolay olan ve Java'yı tersine mühendislik için özellikle çekici kılan bayt koduna çevirir.

Pekala, başlayalım

Java, nesne yönelimli bir dildir, yani tüm değişkenler, yöntemler, sabitler bir sınıf içinde bildirilir. Sınıflara ek olarak, arayüzler de vardır - belirli bir uygulama belirtmeden bir nesnenin davranışını tanımlamanıza izin veren özel bir soyut yapı. Ve eğer Java'da sınıfların çoklu mirası yoksa, o zaman bir sınıf, bir nesnenin birçok fonksiyona sahip olmasına izin veren, ancak bunların sadece bir kısmını sağlayan herhangi bir sayıda arabirim uygulayabilir.

Veri türleri iki gruba ayrılabilir: basit (int, uzun, karakter vb.) ve nesne: sınıflar, arabirimler, diziler. Basit tipler her zaman ve her yerde sabit boyuttadır. Örneğin, herhangi bir mimaride ve herhangi bir aygıtta bir int, dört bayt bellek kaplar. Bu hesaplamalar için oldukça kullanışlıdır. Veri dizisi, geliştiricilere özel teşekkür ettiği dizinin boyutunu depolayan özel bir uzunluk özniteliği içerir. Farklı veri türleri, yöntemlere farklı şekillerde iletilir. Basit türler her zaman değere göre iletilir. Nesne - her zaman bellekten tasarruf etmek için referans olarak. Bu, int a = 10'u geçersek ve çağrılan yöntemde değerini 5 olarak değiştirirsek, orijinal yöntemde a hala 10 olacaktır. Ancak nesnenin özelliğini değiştirirsek, orijinal yöntemde değişecektir. ilave olarak.

Hafızayı hatırla

Bir Java programcısı bellek ayırma ve boşaltma ihtiyacından kurtulmuş olsa da, sanal makinenin ve çöp toplayıcının bazı özelliklerinin cehaleti, programınızı kolayca CPU zamanını ve tüm kullanılabilir belleği tüketen doyumsuz bir canavara dönüştürebilir.

Yeni bir dizi oluştururken, çok sayıda küçük bellek parçası oluşturmanın tek bir büyük bellek parçası oluşturmaktan çok daha kolay olduğunu daima unutmayın. Aksi takdirde, kabaca hafızanız olduğu anlamına gelen Yetersiz hafıza hatasıyla karşılaşma riskiniz vardır, ancak her şey ortaya çıkar.

Birçok programcı, Java'ya geçip otomatik bellek temizlemeyi öğrendiklerinde, tüm bunların kendiliğinden düzeleceğini umarak büyük miktarlarda nesneler oluşturmaya başlar. Bu arada, bir çöp toplayıcı, sadece bir evin yakınındaki bir çöp kutusuna atılan çöpleri alabilen bir makine gibidir. Artık bazı verilere ihtiyacınız yoksa, eski kartpostal yığını gibi her ihtimale karşı saklamamalısınız - işaretçiyi boş verilere atayın, temizleyicinin temizlemesine yardımcı olun :). Ayrıca, zaten ihtiyacınız yoksa listeyi netleştirmek için iyi bir uygulamadır. Unutmayın, kodda referanslar olduğu sürece nesne bellekte tutulacaktır. Programınız 16 gigabayt bellekte çalışsa ve Yetersiz bellek ile çökme tehdidinde bulunmasa bile, kullanılan bellek fazlalığından giderek daha beceriksiz ve yavaş olacaktır. Yavaş Java programlarıyla ilgili kullanıcı şikayetlerinin %99'u verimsiz yazılmış kaynak kodlarından kaynaklanmaktadır. Sürekli olarak hızlı kullanılan ve artık ihtiyaç duyulmayan, örneğin çok sayıda küçük mesaj gibi nesneler oluşturmanız gerekiyorsa, tekrarlanan kullanım için birkaç örneği depolayacak bir havuz oluşturmayı düşünün. Unutmayın, bir nesne oluşturmak ve silmek maliyetlidir.

Dava için beyler

Bir örnek bin kelimeden daha iyidir. Kılavuzu çevirebilir ve standart Hellowords'e biz olmadan bakabilirsiniz, bu yüzden bunu zaten yaptığınızı ve daha ilginç bir örnek uygulamaya hazır olduğunuzu varsayacağız.

Sen ve ben Java'nın sunucu uygulamasıyla ilgileneceğiz ve sosyal ağ kullanıcılarını "casusluk yapmak" için küçük bir program yazacağız. Bunu yapmak için NSA'da bir iş bulmanız bile gerekmiyor - kullanıcılar her şeyi kendilerine yayıyor ve biz sadece bu bilgiyi almamız, düzenlememiz ve güzelce sergilememiz gerekecek. Foursquare gibi popüler sosyal hizmetlerden birini ele alalım ve bir harita üzerinde arkadaşlarımızın hareketini çizelim.

İlk olarak, foursquare'den neler çıkarabileceğimize bir bakalım. Geliştirici sayfalarını inceledikten sonra dikkatimizi iki yönteme çeviriyoruz:

  • https://developer.foursquare.com/docs/users/checkins - Kullanıcı tarafından ziyaret edilen yerler. Ne yazık ki, şimdiye kadar sadece programa kayıtlı kullanıcı için destekleniyor ve uygulama kısıtlamaları nedeniyle böyle kalacağına dair söylentiler var;
  • https://developer.foursquare.com/docs/checkins/recent - kayıtlı kullanıcının arkadaşları tarafından ziyaret edilen yerler. Bu işlevle biraz oynarsanız, üzücü bir gerçek ortaya çıkar: her arkadaş için tam olarak bir yer döndürülür - en son check-in yaptığı yer.

foursquare API'sini kullanmak için, gelecekteki uygulamamızı kaydettirmeniz, şu adrese gitmeniz, https://en.foursquare.com/developers/register ve alanları doldurmanız gerekir (evet, foursquare'in kendisine kaydolmanız gerekecek, ancak bensiz de yapabilirsin).

Önemli alanlardan yalnızca "Uygulama adı", "İndirme / hoş geldiniz sayfası url'si" (buraya rastgele bir web adresi girin) ve "Yönlendirme URI'si (leri)" olarak işaretleyebilirsiniz - bu, sunucunun daha sonra bize göndereceği adrestir. kayıt. İstenen değeri daha sonra buraya yazacağız, ancak şimdilik herhangi bir web adresini girebilirsiniz. "Kaydet"i tıklayın ve takip uygulamamız başarıyla kaydedildi.

Bulutlara tırmanmak

Kaptan Açıkça, herhangi bir sunucu uygulamasının çalışması için bir sunucu gerektirdiğini iletir. Sunucuyu kendiniz yükseltin, hemoroid, böylece şimdi popüler bulut çözümlerini kullanacağız. Google App Engine ücretsiz, kurulumu ve kullanımı oldukça kolay olduğu için bulut, Google Corporation tarafından desteklenecektir. Öncelikle buraya gidin ve Java için Google App Engine SDK'sını indirin.

Artık projenizi oluşturmaya başlayabilirsiniz. Java geliştirme için IntelliJ IDEA kullanıyorum, ancak ücretsiz ve eşit derecede iyi bilinen Eclipse ortamını kullanabilirsiniz.

Yeni bir Java projesi seçelim. Buna nsa_tracker diyelim.


Sonraki sekmede, soldaki Web Uygulamasını ve Google App Engine'i işaretleyin ve daha önce indirilmiş ve paketlenmemiş App Engine SDK'sının yolunu belirtin.


Şimdi arkanıza yaslanın ve bırakın IDE işini yapsın. IDEA'yı seçtiyseniz ve her şeyi doğru yaptıysanız, sonuç olarak, başlatıldığında boş içeriğe sahip bir tarayıcı penceresi açan bitmiş bir proje göreceksiniz. Kodlamaya başlayabilirsiniz.

aramaya başlıyoruz

Yani, src klasörünü içeren projeli bir klasörümüz var. Kaynakları oraya koyacağız. Java kaynakları pakete göre gruplandırılmıştır. Paket, diskteki bir klasördür. Tüm kaynakları bir yığına yığmak için değil, onları mantık ilkelerinin rehberliğinde ayırmak için paketlere ihtiyaç vardır. Örneğin, kullanıcı arayüzü ile ilgili kodu ui paketine, ağ etkileşimlerini ise ağ paketine koymak mantıklı olacaktır. Bu, projenin daha sonra geliştirilmesini ve desteklenmesini büyük ölçüde kolaylaştırır. Tarihsel olarak, paket yapısını şirket adının ardından program adıyla başlatmak uygulama olmuştur. Bu, gelecekte aynı yığınlar arasında kaynaklarımızı kolayca belirlememize yardımcı olacaktır. Programımız için org.nsa.tracker paketini oluşturacağız. İçinde sınıflar oluşturacağız.

Sunucu uygulamaları, kullanıcı isteklerini işlemek için sunucuda kullanılır. Sunucu uygulaması, tipik olarak HttpServlet'ten miras alan ve istek-yanıt temelinde çalışan bir sınıftır. Tek ihtiyacınız olan doGet yöntemini geçersiz kılmak. Kullanıcının isteği üzerine foursquare'e giriş yapıp, arkadaşların check-in'lerini indirmemiz ve isteği haritalı sayfaya yönlendirmemiz gerekiyor.

foursquare API ile çalışmak için buradan alınabilecek ücretsiz foursquare-api-java kitaplığını kullanacağız. Java Kitaplığı, belirli işlevleri uygulayan derlenmiş Java sınıflarını içeren bir jar uzantısına sahip bir ZIP arşividir. Yetkilendirme için Foursquare'de başvurunun kayıt aşamasında elde edilen ClientId ve ClientSecret'e ihtiyacımız var. Bu parametreler program yürütülürken değişmediği için onları sabit olarak tanımlayacağız.

Özel statik son Dize CLIENT_ID = "FAKE_CLIENT_ID"; özel statik final Dize CLIENT_SECRET = "FAKE_CLIENT_SECRET";

Final, bu değişkene değiştirilemeyecek bir son değer atandığı anlamına gelir. Statik, değişkeni verilen sınıfın tüm örnekleri için kullanılabilir hale getirir. foursquare-api-java kitaplığındaki yetkilendirme örneğini kullanarak aşağıdaki kodu alıyoruz:

Korumalı void doGet (HttpServletRequest req, HttpServletResponse resp) atar ServletException, IOException (FoursquareApi foursquareApi = yeni FoursquareApi (CLIENT_ID, CLIENT_SECRET, CALLBACK_URL); Dize kodu = req.get. .getAuthenticationUrl ());) else (try (foursquareApi.authenticateCode (kod); // Kayıt başarılı, verileri yükle) Sonuç sonuç = foursquareApi.checkinsRecent ("0.0,0.0", 100, 0l); ) yakalama (FoursquareApiException e) (e.printStackTrace ();)))

Yöntem bildiriminde "ServletException, IOException fırlatır" uyarısına dikkat edin. Bu satır, yöntemin potansiyel olarak bu istisnalardan birini atabileceği anlamına gelir. Java'daki bir istisna, bir istisna atıldığında sinyal veren bir nesnedir. Bunlar doğrulanabilir ve doğrulanamaz. Kontrol edilen istisnalar, kodun bir kısmı bir try-catch bloğu ile çevrelenerek veya yukarıda iletilerek ele alınmalıdır. Programın durumunu kurtaramadığı durumlarda atıldıkları için, denetlenmeyen istisnalar genellikle ele alınmaz. Bu yöntemde yalnızca FoursquareApiException'ı ele alıyoruz.

Web sunucusu bir uygulama için bir istek aldığında, istek URL'sini isteği işlemesi gereken kodla eşleştirmek için bir dağıtım tanımlayıcısı kullanır. Dağıtım tanımlayıcısı, web.xml adlı bir XML dosyasıdır. İzleme sunucu uygulamasının bir açıklamasını ekleyelim.

izlemek org.nsa.tracker.TrackerServlet izlemek / izlemek

Artık / takip istekleri TrackerServlet'imiz tarafından ele alınacaktır. Geri Arama Url parametresini http://localhost:8080/track doğru değerine ayarlayabilirsiniz.

Sonuçları görüntülemek için aynı Google şirketi tarafından sağlanan Statik Haritalar API'sini kullanabilirsiniz (https://developers.google.com/maps/documentation/staticmaps/). Sunucu uygulamamız basit bir HTML sayfası oluşturacak ve bir kullanıcı isteğine yanıt olarak onu döndürecektir.

StringBuilder sb = yeni StringBuilder (" NSA İzleyici"); sb.append (" "); sb.append ("

    "); index = 1; for (Checkin check-in: sonuç.getResult()) (sb.append (" ") .append (index ++). append (" - ") .append (checkin.getUser (). getFirstName ()) .append (" ") .append (checkin.getUser (). getLastName ())). ("");) sb.append (");
"); sb.append (" ");

Sayfayı oluşturmak için StringBuilder sınıfı kullanılır, bunun nedeni Java'daki dizelerin değişmez nesneler olmasıdır. + operatörünü kullanarak dizeleri birleştirirken. bellekte yeni bir satır oluşturulur. StringBuilder, birleştirilmiş dizeleri depolamak için bir char dizisi kullanarak bellekten tasarruf sağlar. Cevabı kullanıcıya gönderiyoruz:

Bayt sonuçBytes = sb.toString().GetBytes ("utf-8"); resp.setContentLength (resultBytes.length); resp.getOutputStream().write(resultBytes);

… Ve her şey hazır. Başlatıyoruz ve “Programın çalışmasının sonucu” yazan bir resme benzer bir şey görüyoruz.


Sıradaki ne?

Uygulama, örneğin veri toplama ve görüntülemeyi ayırmak için geliştirilebilir. Veri toplanmasını, sürekli çalışacak ve veritabanındaki tüm kullanıcı hareketlerini hatırlayacak ayrı bir hizmete taşıyın. O zaman tek tek noktaları değil, bağlantılı bir rotayı görüntülemek mümkün olacaktır. Foursquare API'sini biraz araştırarak, kullanıcı etkinliği hakkında daha da fazla bilgi elde edebilirsiniz.

Ama umarım asıl şeyi başarmışımdır: Java'nın basit ve havalı olduğuna sizi ikna etmek. Bir ay sonra görüşürüz!

Java Programcısı için Kitaplar

Dili öğrenmeye “Java” kitabıyla başlamanızı öneririz. Herbert Schildt'in Yeni Başlayanlar Kılavuzu. Bir sonraki seviye “Java. The Complete Guide "Ondan ve Bruce W. Perry'nin "Java Servlet ve JSP Cookbook" kitabında sunucu uygulamaları hakkında daha fazla bilgi edinebilirsiniz.

servlet bir Web uygulamasının sunucu tarafında çalışan bir java programıdır. Uygulamaların bir Web tarayıcısının işlevselliğini dinamik olarak genişletmesi gibi, sunucu uygulamaları da bir Web sunucusunun işlevselliğini dinamik olarak genişletir.

Çalışmak sunucu uygulaması"ancak şu şekilde tanımlanabilir: bir istemciden bir istek geldiğinde, Web sunucusu hangi sunucu uygulamasının yürütüleceğini belirlemek için özel bir yapılandırma dosyası kullanabilir. Bundan sonra, Web sunucusu JVM'yi başlatır ve bu da sunucu uygulamasını yürütür. Servlet isteği işler ve içeriği Web sunucusuna aktarır (muhtemelen bir HTML sayfası biçiminde) Web sunucusu, istemciye bir yanıt (sunucu uygulaması tarafından oluşturulan bir HTML sayfası) gönderir.

Bir WEB sunucusu, esasen yükleyen bir tür kapsayıcıdır. sunucu uygulaması"s, onları yürütür ve onlardan sonucu aldıktan sonra müşteriye gönderir.

Web Uygulama Mimarisinde Servlet

Gücü ve esnekliği nedeniyle, sunucu uygulaması"Sistemin mimarisinde önemli bir rol oynayabilirsiniz. Orta katmana yönelik uygulama görevlerini gerçekleştirebilir, istemci için bir proxy sunucusu görevi görebilir ve hatta yeni protokoller ve yeni protokoller için destek ekleyerek orta katmanın işlevselliğini iyileştirebilirler. diğer işlevler Orta katman, sözde üç katmanlı istemci-sunucu sisteminde bir uygulama sunucusu görevi görür ve Web tarayıcısı gibi "hafif" bir istemci ile veri kaynağı arasında bulunur.

Proxy sunucusu olarak Servlet

Uygulamaları desteklemek için sunucu uygulamaları, onların proxy sunucuları gibi davranabilir. Java güvenliği yalnızca uygulamaların indirildikleri sunucuya bağlanmasına izin verdiği için bu önemli olabilir. Uygulamanın farklı bir makinede bulunan bir veritabanı sunucusuna bağlanması gerekiyorsa, sunucu uygulaması uygulama için bu bağlantıyı oluşturabilir.

Geçici ve kalıcı sunucu uygulaması"NS

Servlet'ler her istemci isteği için başlayabilir ve durabilir. Ayrıca, Web sunucusu başladığında başlayabilir ve durana kadar var olabilir. Geçici sunucu uygulaması"s istek üzerine yüklenir ve nadiren kullanılan işlevler için sunucu kaynaklarını korumanın iyi bir yolunu sunar. Kalıcı sunucu uygulamaları, Web sunucusu başlatıldığında yüklenir ve Web sunucusu kapatılana kadar devam eder. Sunucu uygulamaları, sunucuya kalıcı uzantılar olarak yüklenir. kalıcı sunucu tarafı işlevselliği (örneğin bir RMI hizmeti) sunuyorlarsa veya istemci isteklerine mümkün olduğunca çabuk yanıt vermeleri gerektiği durumlarda (veritabanı bağlantısı kurmak gibi) ek yük çok yüksektir. sunucu uygulaması"ama kalıcı veya geçici; bu, web sunucusunu yapılandırmanın bir işlevidir.

Servlet yaşam döngüsü, javax.servlet.Servlet

Servlet'ler, web sunucusunun kendisiyle aynı işlemin bir parçası olarak web sunucusu platformunda çalışır. Web sunucusu, sunucu uygulamasının her bir örneğini başlatmak, çağırmak ve yok etmekten sorumludur. Web sunucusu, sunucu uygulaması ile basit bir arayüz aracılığıyla iletişim kurar: javax.servlet.Servlet.

javax.servlet.Servlet arabirimi üç ana yöntem içerir:

  • içinde ()
  • hizmet ()
  • tahrip etmek ()

ve iki yardımcı yöntem:

  • getServletConfig ()
  • getServletInfo ()

Arayüzler arasındaki benzerlikler sunucu uygulaması"ah ve Java uygulamaları açıktır. Tam olarak bunu yapmak için tasarlanmıştır! Web tarayıcıları için uygulamalar ne ise Web sunucuları için Java sunucu uygulamaları odur. Bir uygulama Web tarayıcısında yürütülür ve istek üzerine özel bir arabirim aracılığıyla eylemler yürütülür. bir web sunucusunda çalışırken de aynısını yapar.

Servlet başlatma, init () yöntemi

Sunucu uygulaması ilk yüklendiğinde init() yöntemi çağrılır. Bu, sunucu uygulamasının dosyaları açma veya sunucularına bağlantı kurma gibi herhangi bir kurulum işini yapmasına izin verir. Sunucu uygulaması sunucuda kalıcı olarak kuruluysa, sunucu başladığında yüklenir. Aksi takdirde, sunucu, bir istemciden o sunucu uygulaması tarafından sağlanan bir hizmeti gerçekleştirmek için ilk isteği aldığında sunucu uygulamasını çağırır.

Yöntemin garanti edildiği içinde () sunucu uygulamasına yapılan herhangi bir başka çağrıdan önce sona erecektir - örneğin bir yöntem çağrısı gibi hizmet ()... Bunu not et içinde () sadece bir kez çağrılacak; sunucu uygulaması kaldırılıp sunucu tarafından yeniden yüklenene kadar çağrılmayacak.

Yöntem içinde () bir argüman alır - bir nesne referansı ServletConfig servlet'i başlatmak için argümanlar içeren. Bu nesnenin bir yöntemi var getServletContext () bir nesneyi döndürmek ServletContext servlet'in ortamı hakkında bilgi içerir.

Servlet çekirdeği, hizmet () yöntemi

Yöntem hizmet () servlet'in kalbidir. İstemciden gelen her istek bir yöntem çağrısıyla sonuçlanır hizmet ()... Bu yöntem, isteği okur ve ServletRequest ve ServletResponse adlı iki bağımsız değişkenini kullanarak bir yanıt mesajı oluşturur:

Bu nedenle, istemciden sunucu uygulamasına bilgi aktarmanın iki yolu vardır. Birincisi, istek parametrelerindeki değerleri geçmektir. URL'ye parametre değerleri eklenebilir. İstemciden sunucu uygulamasına bilgi aktarmanın ikinci yolu, bir InputStream (veya Okuyucu) aracılığıyladır.

Yöntem çalışması hizmet () aslında basit - sunucudan kendisine gönderilen her istemci isteğine bir yanıt oluşturur. Ancak, aynı anda işlenmekte olan birden fazla paralel istek olabileceğini unutmayın. eğer yöntem hizmet () dosyalar, veritabanları gibi herhangi bir harici kaynak gerektiriyorsa, kaynaklara erişimin iş parçacığı açısından güvenli olduğundan emin olmak gerekir.

Bir sunucu uygulamasını boşaltma, yok etme () yöntemi

Yöntem tahrip etmek () sunucu uygulamasını kaldırmadan önce tüm kaynakları (açık dosyalar ve veritabanı bağlantıları gibi) boşaltmak için çağrılır. Herhangi bir bitirme işlemi yapmaya gerek yoksa bu yöntem boş olabilir. Yöntemi çağırmadan önce tahrip etmek () sunucu, tüm servis işlemlerinin tamamlanmasını veya belirli bir sürenin dolmasını bekler. Bunun anlamı, yöntemin tahrip etmek () bazı uzun süreli yöntemler çalışırken çağrılabilir hizmet ().

Yöntemi resmileştirmek önemlidir tahrip etmek () tüm aramalara kadar gerekli kaynakları kapatmaktan kaçınacak şekilde hizmet () bitmeyecek.

Servlet yapılandırması, getServletConfig () yöntemi

Yöntem getServletConfig () arabirimi uygulayan bir nesneye bir başvuru döndürür ServletConfig... Bu nesne, sunucu uygulaması yapılandırma bilgilerine erişim sağlar, yani. sunucu uygulaması başlatma parametrelerine ve sunucu uygulaması bağlam nesnesine erişim ServletContext bu, sunucu uygulamasına ve ortamına erişim sağlar.

Servlet bilgisi, getServletInfo () yöntemi

Yöntem getServletInfo (), sunucu uygulamasının yazarı ve sürümü gibi sunucu uygulaması hakkında bilgileri içeren bir dize döndürmek için sunucu uygulamasını oluşturan programcı tarafından tanımlanır.

ServletRequest arayüzü

ServletRequest, sunucu uygulamasına HTTP istek parametreleri hakkında istemci bilgileri sağlar, yani. parametre adı ve değerleri, öznitelikler ve bir giriş akışı dahil olmak üzere veriler sağlar. Bu bilgi metoda iletilir. hizmet ().

Sonraki sunucu uygulaması örneği bir parametreden nasıl bilgi alınacağını gösterir rica etmek yöntem hizmet ():

BufferedReader okuyucu; dize param1; dize param2; genel geçersiz hizmet (ServletRequest isteği, ServletResponse yanıtı) (okuyucu = request.getReader (); param1 = request.getParameter ("İlk"); param2 = request.getParameter ("İkinci");)

İstekle ilgili ek bilgiler, ana öğeleri aşağıdaki tabloda gösterilen yöntemlerle sunucu uygulamasına sunulur:

getAttribute () Bu isteğin belirtilen özniteliğinin değerini döndürür.
getContentLength () Biliniyorsa, boyut isteyin.
getContentType () İstek gövdesinin MIME türünü döndürür.
getInputStream() İstek gövdesinden ikili verileri okumak için bir InputStream döndürür.
GetParameterNames () Tüm parametrelerin adlarını içeren bir dizi dizi döndürür.
getParameterValues ​​​​() Belirtilen parametre için bir dizi değer döndürür.
getProtocol () İsteğin protokolünü ve sürümünü formun bir dizesi olarak döndürür /..
getOkuyucu () İstek gövdesinden metni almak için bir BufferedReader döndürür.
getRealPath () Belirtilen sanal yol için gerçek yolu döndürür.
getRemoteAddr () Bu isteği yapan istemcinin IP adresi.
getRemoteHost () Bu isteği yapan istemci makinenin ana bilgisayar adı.
şemayı al () Bu istek için URL'de kullanılan şemayı döndürür (örneğin, https, http, ftp, vb.).
getSunucuAdı () İsteği kabul eden sunucunun ana bilgisayar adı.
getServerPort () Bu isteği almak için kullanılan bağlantı noktası numarasını döndürür.

ServletResponse arayüzü

Arayüz ServletResponse bir istemciye veri göndermek için bir araçtır. Bu aracın tüm yöntemleri tam olarak bu sorunu çözmeye hizmet eder:

Genel java.lang.String getCharacterEncoding () genel geçersiz setLocale (java.util.Locale loc) genel java.util.Locale getLocale ()

İlk yöntem, bilgilerin görüntüleneceği MIME kodlama türünü (örneğin, UTF8) döndürür. İkinci iki yöntem de karakter kümesiyle çalışır. Belgede kullanılan dili belirtirler (örneğin - Rusça).

Public ServletOutputStream getOutputStream (), java.io.IOException öğesini atar

getOutputStream yöntemi, sunucu uygulaması için bir çıktı akışı döndürür. Bu akış, örneğin, ikili dosyaların çıktısını almak için kullanılır. Java.io.Writer kullanılarak metin verilerinin çıktısı alınabilir:

Genel java.io.PrintWriter getWriter (), java.io.IOException'ı atar

getWriter() yöntemi, dizeleri otomatik olarak getCharacterEncoding() ve getLocale() yöntemlerinde belirtilen karakter kümesine dönüştürür.

Public void setContentLength (int len)

setContentLength yöntemi, "Content-Length" HTTP başlığının değerini ayarlar

Genel geçersiz setContentType (Dize türü)

setContentType yöntemi, belgenin MIME içerik türünü göndermek için kullanılır. "İçerik Türü" HTTP başlık alanı.

Çıkış akışı arabelleğe alınır. Bu, yalnızca arabellek dolduktan sonra bir veri yığınının istemciye döndürüleceği anlamına gelir.

Public void setBufferSize (int size) public int getBufferSize () public void flushBuffer (), java.io.IOException public void resetBuffer () atar

Yukarıdaki 4 yöntem, sırasıyla, gönderme arabelleğinin boyutunu ayarlamaya, boyutunu almaya, arabelleğin içeriğini doldurmasını beklemeden istemciye göndermeyi başlatmaya ve bu veri arabelleğini temizlemeye izin verir.

Genel boolean isCommitted ()

isCommitted yöntemini kullanarak, istemciye veri göndermenin zaten başlayıp başlamadığına dair bir bayrak alabilirsiniz. HTTP yanıt başlığı zaten gönderildiyse bayrak pozitif olacaktır.

Genel geçersiz sıfırlama ()

HTTP başlığı henüz gönderilmediyse, sıfırlama yöntemi HTTP başlığını "varsayılan" değerlerine "sıfırlar".

Sunucu uygulamalarında JFreeChart çizelgeleri

JFreeChart grafik kitaplığı, grafikler oluşturmak ve bunları site sayfalarında görüntü olarak görüntülemek için sunucu uygulamalarında kullanılabilir. Sunucu uygulamalarında JFreeChart kullanımına ilişkin ayrıntılar ve örnekler verilmiştir.

Chart.js grafik kitaplığına sahip sunucu uygulaması

sunucu uygulamasında JNI

Bazı durumlarda, bir WEB uygulamasında JNI kullanmanız gerekebilir. Sunucu uygulamalarında JNI kullanımına bir örnek verilmiştir.

Bir sunucu uygulamasında JMS mesajları

Servlet değiş tokuş yapmak için kullanılabilir JMS uygulamalar arasındaki mesajlar. Bir JBoss kapsayıcısında JMS mesajlarını göndermek ve okumak için bir sunucu uygulaması kullanımına bir örnek verilmiştir.

servlet nedir? Servlet'ler aslında web kapıları oluşturmak için kullanılan HTTP ve FTP işleme modülleridir.

Bu portalların temeli, sunucu soketini tutan, veri alan ve ileten bir program olan WEB sunucusunun kendisidir. Çoğu zaman, işi hızlandırmak için sunucu Java'da değil, başka bir programlama dilinde (örneğin, C ++) yazılmıştır.

Temel bir sunucu uygulaması, sunucuyla birlikte çalışır. Sunucunun veri göndermesi ve müşteriye gönderilen yanıtı ondan alması ona aittir. Aslında, temeldeki sunucu uygulaması, sunucunun "beynidir". Bu sunucu uygulamasının ana işlevi, müşterinin isteğini okumak, şifresini çözmek ve şifre çözmeye uygun olarak işi bu tür istenen bilgilerden sorumlu sunucu uygulamasına aktarmaktır. Genellikle sunucunun kendisi, hız elde etmek için temeldeki sunucu uygulaması olarak hareket eder. Jacarta Tomcat tam olarak böyle çalışır.

Şekil, sunucu ve sunucu uygulamaları arasındaki çağrıların (isteklerin) ve yanıtların (yanıtların) bir diyagramını göstermektedir. Bu şema, sırasıyla iki sunucu uygulaması - "Sample1 Servlet" ve "Sample2 Servlet" tarafından işlenen birkaç JSP sayfasına ve "/ sample1" ve "/ sample2" kaynaklarına sahip bir HTTP sunucusunun çalışmasını gösterir.

Şekilde gösterilenleri adım adım analiz edelim:

  1. istemci sunucuya bağlanır
  2. sunucu, isteği "Temel Sunucu Uygulamasına" iletir
  3. temeldeki sunucu uygulaması, istekten kaynak URI'sini çıkarır
    • URI "/ sample1" i gösteriyorsa, istek tamamen(değişmedi) bu isteği daha fazla işleyen "Sample1 Servlet" sunucu uygulamasına geçti
    • URI "/ sample2"yi gösteriyorsa, sunucu isteği "Sample2 Servlet"e iletir.
    • diğer tüm durumlarda, istek "JSP Servlet" modülüne iletilir
  4. kontrol verilen sunucu uygulaması verileri işler, bir yanıt oluşturur ve ardından yanıt, temel alınan sunucu uygulamasına geri gönderilir.
  5. temel sunucu uygulaması, alınan verileri işlemeden hemen sunucuya geri gönderir
  6. sunucu istemciye veri verir

Böylece, bir isteği işleme görevi, her biri için kendi "yazılım tuğlası" olan ayrı bir modülün sorumlu olduğu mantıksal parçalara ayrılır. Aslında, bir isteğin işlenmesinde daha birçok adım olabilir. Örneğin, "GET" ve "POST" yöntemlerinden farklı modüller sorumlu olabilir.

sunucu uygulaması arayüzü

Tüm bu modüllerin ortak noktası, javax.servlet.Servlet arabirimi kullanılarak uçtan uca birbirine bağlı olmalarıdır.

Şimdi bu arayüze bir göz atalım. Yalnızca 5 yöntemi listeler:

Public void init (ServletConfig config) ServletException'ı atar. Bu yöntem, istemci isteklerine hizmet etmek için bir modül olarak dahil edildiğini sunucu uygulamasına bildirmek için çağrılır. config parametresi, sunucu ortamı, sunucu uygulaması adı, başlangıç ​​parametreleri ve diğer özellikler hakkında bilgi taşıyan javax.servlet.ServletConfig arabirimini ayırır. Javax.servlet.ServletConfig arayüzü biraz sonra tartışılacaktır. Bu işlevi çağırdıktan sonra, sunucu uygulamasının bu yapılandırmayı düzgün bir şekilde değişkenine kaydedeceği ve başka bir yöntemle yayınlayacağı varsayılır: public ServletConfig getServletConfig () "getServletConfig ()" kullanarak sistem bilgilerini aldıktan sonra, sunucu bunu öğrenmek isteyebilir. yazarın adı, oluşturulma tarihi, public String getServletInfo () çağırılarak elde edilen sunucu uygulaması hakkında diğer bilgiler

İsteği işlemek ve işlemenin sonucunu almak için işlevi kullanın

Public void hizmeti (ServletRequest request, ServletResponse yanıtı) fırlatır ServletException, java.io.IOException Bu fonksiyonda, verileri işleyecek koda iki araç iletilir: biri sunucudan veri almak, diğeri sonucu göndermek için sunucu uygulamasından. Buna göre javax.servlet.ServletRequest ve javax.servlet.ServletResponse arayüzlerini ayıran istek ve yanıt parametreleri bunlardır.Veri ile yapılan tüm çalışmalar tam olarak bu arayüzler üzerinden gerçekleştirilir, o yüzden biraz daha detaylı konuşalım.

Sunucunun artık bu modüle ihtiyacı kalmadığında yöntem çağrılır.

Servlet nesnesiyle tüm işlemleri tamamlayan public void destroy().

ServletConfig arayüzü

Kendi kendini açıklayan 4 yöntem, javax.servlet.ServletConfig arabirimini oluşturur:

Public String getServletName () public ServletContext getServletContext () public String getInitParameter (Dize adı) public java.util.Enumeration getInitParameterNames ()

dışında tüm işlevlerin amacının açık olduğunu düşünüyorum.

Public ServletContext getServletContext () Bu yöntem, çok kullanışlı bir sunucu aracına bir bağlantı döndürür:

ServletContext arayüzü

ServletContext, aşağıdaki çok kullanışlı işlevlere erişimi tanımlayan bir arabirimdir:

Public Object getAttribute (Dize adı) public java.util.Enumeration getAttributeNames () public void setAttribute (Dize adı, Nesne nesnesi) public void removeAttribute (Dize adı) Özniteliklerle çalışmak için dört yöntem. Niteliklerin rolü, herhangi bir sınıfın herhangi bir nesnesi tarafından gerçekleştirilir. Bu işlevlerin amacı, ilişkisiz sunucu uygulamaları arasında farklı nesneleri aktarmaktır. public String getInitParameter (String name) public Java.util.Enumeration getInitParameterNames () Sunucunun başlatıldığı parametrelere erişim. Ayrıca bir ana bilgisayar adı, bağlantı noktası ve diğer yararlı şeyler olabilir. public int getMajorVersion () public int getMinorVersion () Servlet API sürümlerini döndürür. public String getMimeType (String file) Dosya değişkeninde belirtilen dosyayla ilişkili MIME türünü döndürür. SimpleWEBServer'da MIME'yi nasıl tanımlamanız gerektiğini hatırlayın ve rahatlığı takdir edin! public java.util.Set getResourcePaths () genel java.net.URL getResource (Dize yolu) java.net.MalformedURLException fırlatır public InputStream getResourceAsStream (Dize yolu) Sunucunun kullanabileceği kaynaklara ve kaynakların kendilerine URL'ler ve akış verileri olarak yolları döndürür . public RequestDispatcher getRequestDispatcher (yol) public RequestDispatcher getNamedDispatcher (ad) RequestDispatcher, bir isteği başka bir kaynağa iletmek için bir araçtır. Belirtilen kaynaklar için bu aracın nesnesini almak için bu işlevlere ihtiyaç vardır. Yani, sunucu uygulaması gövdesinden "sample1" sunucu uygulamasına bir istek iletmek için şunu yapabilirsiniz: getServletConfig().GetServletContext().GetNamedDispatcher ("sample1").Forward (istek, yanıt);

RequestDispatcher sınıfının kendisi yalnızca iki yöntem içerir:

Public void forward (ServletRequest request, ServletResponse yanıtı) fırlatır ServletException, java.io.IOException public void include (ServletRequest request, ServletResponse yanıtı) fırlatır ServletException, java.io.IOException İlki isteği yeniden yönlendirmek ve ikincisi dahil etmektir çağrılan sunucu uygulamasının sonucu, geçerli olanın sonucuna. Örneğin, sunucu uygulaması 1 "test 1" kelimesini yazdırır, ardından sunucu uygulaması iki için içerme çağrıları ve ardından "test 2" kelimesini yazdırır. Servlet 2 sadece "ve" kelimesini yazdırır. Servlet 1, "test 1 ve test 2" dizesini çıkaracaktır. public void log (String msg) Sunucu günlüğüne bir şeyler yazın. public void log (Dize mesajı, Atılabilir atılabilir) Bir istisna ve bu istisna alındığında günlüğe kaydedilecek bir ifade tanımlayın. public String getRealPath (String path) "/index.html" gibi bir yolu "http: //host/contextPath/index.html"'ye çevirir public String getServerInfo () Sunucu adını döndürür. public ServletContext getContext (String uripath) Bu yöntem, aynı sunucunun farklı kaynakları arasında ServletContext alışverişi yapmanızı sağlar. public String getServletContextName () Bu ServletContect arabirim nesnesinin ait olduğu sunucu uygulamasının adını döndürür.

ServletRequest arayüzü

ServletRequest arayüzü, HTTP istek parametrelerini almak için bir araçtır. Bu arabirimin adı ve amacı ServletContext ile aynı olan birkaç yöntemi vardır:

Public Object getAttribute (Dize adı) public java.util.Enumeration getAttributeNames () public void setAttribute (Dize adı, Object o) public void removeAttribute (java.lang.String name) public String getServerName () public RequestDispatcher getRequestDispatcher (Dize yolu)

Kalan yöntemler, HTTP istek başlığıyla rahatça çalışmanıza izin verir:

Public String getCharacterEncoding () public void setCharacterEncoding (String env), java.io.UnsupportedEncodingException öğesini atar HTTP başlık alanlarında karakter kodlamasıyla çalışır. İşlevler, % NN formundan gelen CGI isteklerinin normal karakterlere dönüştürülmesi için yöntemi ayarlar. Örneğin, Kiril karakterlerinin şifresini çözmek için hangi standart - KOI8-R, windows-1251 veya UTF-8 - kullanılmalıdır. public int getContentLength () public String getContentType () HTTP isteğinden "Content-Length", "Content-Type" alanlarını okur. public jString getParameter (Dize adı) public java.util.Enumeration getParameterNames () public String getParameterValues ​​​​(Dize adı) public java.util.Map getParameterMap () HTTP başlığından bir alan ve değeri almak için işlevler. public ServletInputStream getInputStream(), java.io.IOException'ı atar. public java.io.BufferedReader getReader(), java.io.IOException'ı atar. Reader, metin bilgilerini okumak için kullanılır - belirtilen karakter kümesine göre dizelerin şifresini otomatik olarak çözer. Dikkat! J2EE 1.3'te önemli bir hata var: %25 karakterinin (Gönder ve Al isteklerindeki % karakteri) şifresini çözerken Reader bir hata veriyor (hata Tomcat 4 ve Resign sunucularında görülüyor). Diğer sembollerde de benzer bir hata olması mümkündür. public String getProtocol () İstek protokolünün HTTP sürümünü alın (örneğin, "HTTP / 1.1"). public String getScheme () İstek şemasının adını döndürür. Örneğin "http", "https" veya "ftp". public int getServerPort () public String getRemoteAddr () public String getRemoteHost () public boolean isSecure () Sunucu bağlantı noktası, istemci IP'si, istemci ana bilgisayar adı ve bağlantının özel olup olmadığı (HTTPS) genel java.util.Locale getLocale () genel java.util .Enumeration getLocales () Müşterinin tercih ettiği belge dili ("Kabul Et-Dil" alanının işlenmesinin sonucu)

ServletResponse arayüzü

ServletResponse arayüzü, istemciye veri göndermek için bir araçtır. Bu aracın tüm yöntemleri tam olarak bu amaca hizmet eder:

Public java.lang.String getCharacterEncoding () public void setLocale (java.util.Locale loc) public java.util.Locale getLocale () İlk yöntem, MIME kodlama türünü (örneğin, UTF8) döndürür; görüntülenir. İkinci iki yöntem de karakter kümesiyle çalışır. Belgede kullanılan dili belirtirler (örneğin - Rusça). public ServletOutputStream getOutputStream (), java.io.IOException fırlatır Sunucu uygulaması için çıktı akışını döndürür. Bu akış, örneğin, ikili dosyaların çıktısını almak için kullanılır. Metin verileri java.io.Writer kullanılarak çıkarılabilir: public java.io.PrintWriter getWriter(), java.io.IOException fırlatır Bu yöntem, dizeleri otomatik olarak getCharacterEncoding() ve getLocale() yöntemlerinde belirtilen karakter kümesine dönüştürür. public void setContentLength (int len) Bu yöntem, "Content-Length" HTTP başlık alanının değerini ayarlar public void setContentType (Dize türü) Belgenin MIME içerik türünü gönderme yöntemi. "İçerik Türü" HTTP başlık alanı. public void setBufferSize (int size) public int getBufferSize () public void flushBuffer () atar java.io.IOException public void resetBuffer () Buradaki nokta, çıktı veri akışının arabelleğe alınmasıdır. Bu, bir sonraki veri yığınının istemciye yalnızca arabellek dolduktan sonra verileceği anlamına gelir. Bu yöntemler, sırasıyla, gönderme arabelleğinin boyutunu ayarlamaya, boyutunu almaya, arabelleğin içeriğini doldurmasını beklemeden istemciye göndermeyi başlatmaya ve bu veri arabelleğini temizlemeye izin verir. public boolean isCommitted () Bu yöntemle, istemciye verinin önceden gönderilip gönderilmediğine dair bir bayrak alabilirsiniz. HTTP yanıt başlığı zaten gönderildiyse bayrak pozitif olacaktır. public void reset () HTTP başlığı henüz gönderilmediyse, bu yöntem HTTP başlığını "varsayılan" değerlerine "sıfırlar".

Önceden Tanımlanmış Sunucu Uygulaması Türleri

Java Servlet API, gerçek arayüzlere ek olarak, programlarınız için temel teşkil edebilecek birkaç servlet sınıfı da içerir.

Tüm bu sınıfların temeli, javax.servlet.GenericServlet soyut sınıfıdır:

Genel soyut sınıf GenericServlet, Servlet, ServletConfig, java.io.Serializable'ı uygular

Bu sınıfın tanımından da anlaşılacağı gibi Servlet ve ServletConfig arayüzlerinin tüm metotlarına sahiptir. Uygulanmayan tek yöntem

Genel soyut geçersiz hizmeti (ServletRequest req, ServletResponse res), soyut olarak bildirilen ServletException, java.io.IOException'ı atar.

Bu sınıf temelinde başka bir soyut sınıf oluşturuldu - javax.servlet.http.HttpServlet:

Genel soyut sınıf HttpServlet, GenericServlet'i genişletir, Java.io.Serializable'ı uygular

Bu sınıf, "programcı için daha fazla kolaylık" kavramına uygun olarak oluşturulmuştur ve birçok faydalı yöntemi vardır:

Korumalı void doDelete (HttpServletRequest req, HttpServletResponse resp) fırlatır ServletException, java.io.IOException korumalı void doGet (HttpServletRequest req, HttpServletResponse resp) Servlet. throwException, java.Servlet. throwException, java.Servlet. HttpServletResponse resp) atar ServletException, java.io.IOException korumalı void doPost (HttpServletRequest req, HttpServletResponse resp) atar Servlet.Exception, ServletException, Java.io.IOException korumalı void doTrace (HttServpServletResponse req,Java. IOException korumalı geçersiz hizmet (HttpServletRequest req, HttpServ atışları, java. resp. , ServletR esponse res) ServletException, java.io.IOException atar DELETE ve GET'ten PUT ve TRACE'e farklı HTTP yöntemleri için farklı hizmet seçenekleri (ServletRequest req, ServletResponse res). CGI arabirimi aracılığıyla başlığın şifresini çözmeden verileri rahatça alabilmek için, javax.servlet paketindeki HttpServlet'e dahil olan HttpServletRequest ve HttpServletResponse sınıfları oluşturuldu.http korumalı uzun getLastModified (HttpServletRequest req) Bu yöntem zamanı döndürür. HttpServlet nesnesinin son değişikliğinin req HTTP istek başlığının "Tarih" alanından zaman değerini alır. Alan bulunamazsa -1 döndürür.

Buna göre HttpServletRequest ve HttpServletResponse arayüzlerini analiz edeceğiz. Sırasıyla ServletRequest ve ServletResponse'den miras alırlar.

HttpServletRequest, ServletRequest'ten devralınan yöntemlere ek olarak aşağıdaki çok kullanışlı yöntemlere de sahiptir:

Cookie getCookies () İstemci tarafından sunucuya gönderilen tanımlama bilgilerinin kümesini döndürür.

Aynı javax.servlet.http paketinin parçası olan Cookie sınıfı, bir cookie hakkında tüm olası bilgileri içerir. Bu sınıfın en önemli yöntemleri şunlardır:

Int getMaxAge () String getName () String getValue () sırasıyla bu cookie'nin ne kadar ömrü kaldığını, cookie'nin adını ve değerini verir. Ayrıca Cookie (String name, String value) void setValue (String newValue) void setMaxAge (int expiry) bir tanımlama bilgisi oluşturmak, değerini ve maksimum yaşını ayarlamak için. long getDateHeader (Dize adı) Varsa, HTTP başlığından tarihi döndürür. int getIntHeader (java.lang.String name) HTTP istek başlığından name adlı alanın sayısal değerini döndürür String getMethod () HTTP istek yöntemini döndürür. Dize getQueryString () Dize getRequestURI () StringBuffer getRequestURL () "?" Karakterinden, belge URI'sinden ve tam URL'den sonra belge URL'sinde bulunan dizeyi döndürür. HttpSession getSession () HttpSession getSession (boolean oluşturma) boolean isRequestedSessionIdFromCookie () boolean isRequestedSessionIdFromURL () boolean isRequestedSessionIdValid () İşlevler. oturumlar gibi önemli bir veri aktarım mekanizmasıyla çalışmanıza izin verir.

Kullanıcıdan sonra sayfadan sayfaya veri sürüklemek için oturumlara ihtiyaç vardır. Örneğin, bir kullanıcı sayfa (1)'i ziyaret eder, burada kendisine sayfa (2) için bazı veriler gönderilir ve bu sayfa (3) için başka şeyler kaydeder.

Prensip olarak, (1) sayfasında kullanıcıya veri gönderebilir, ardından (2) sayfasında alabilir, bir şeyler ekleyebilir, kullanıcıya gönderebilirsiniz... Bu şekilde, tüm veri setini sürekli olarak göndermek zorunda kalacaksınız. istemciden sunucuya ve geriye ve birçok kez. Böyle bir yönlendirme her zaman uygun olmamasına ek olarak, trafiği de tüketir.

Aynı şeyi farklı yapabilirsiniz - oturum mekanizmasını kullanın. Bu mekanizma şu şekilde çalışır: sunucu, kullanıcı tarafından gönderilen verileri ayrı bir dosyaya, yani oturum dosyasına kaydeder. Verileri değiştirmeye yönelik tüm çalışmalar bu dosyanın içeriği ile yapılacaktır. İstemciye bir "oturum anahtarı" (diğer adıyla Oturum anahtarı, diğer adıyla Oturum Kimliği) verilir - bu kullanıcı için özel olarak veri içeren bir dosyaya benzersiz bir işaretçi. Şimdi, bu istemciyle ilgili tüm verileri almak için sunucunun yalnızca oturum anahtarını bilmesi gerekir. Bu yöntemin avantajı, kullanım kolaylığı ve hızıdır.

Bunların hepsi HttpServletRequest arabiriminin ana yöntemleridir. Yöntemlerin tam listesi için Java Servlet API belgelerine bakın.

Şimdi HttpServletRequest arayüzü hakkında. Bu arabirimi paylaşan sınıflar arasındaki temel fark, verilerin hemen çıktılanmamasıdır. İlk olarak, tüm veriler bir HTTP yanıtına paketlenir. Yanıt yalnızca HttpServlet.service () çalışmayı bitirdikten sonra gönderilir.

Ve böylece, yöntemler hakkında:

Void addHeader (Dize adı, Dize değeri) void addIntHeader (Dize adı, int değeri) void addDateHeader (Dize adı, uzun tarih) Yöntemler, HTTP başlığına parametreler ekler. Son yöntem "Tarih" parametresini ayarlar. void addCookie (Çerez çerezi) Yöntem, başlığa bir çerez ekler boolean includeHeader (Dize adı) Başlığın zaten belirtilen parametreyi içerip içermediğini öğrenmenizi sağlar. String encodeURL (String url) String encodeRedirectURL (String url) İlk yöntem, % NN değiştirmeyi kullanarak karakterleri kodlar. İkinci yöntem de aynı şeyi yapar ve void sendRedirect (String konumu) void setStatus (int sc) void sendError (int sc) void sendError (int sc, String msg) çağırır. İlki dönüş kodunu ayarlar, ikincisi bir hata mesajı gönderir . Arayüz, sc parametresi için HTTP protokolü dönüş kodlarına karşılık gelen aşağıdaki olası hatalara sahiptir: SC_CONTINUE - Durum kodu (100) SC_SWITCHING_PROTOCOLS - Durum kodu (101) SC_OK - Durum kodu (200) SC_CREATED - Durum kodu (201) SC_ACCEPTED - Durum kodu (202 ) SC_NON_AUTHORITATIVE_INFORMATION - Durum kodu (203) SC_NO_CONTENT - Durum kodu (204) SC_RESET_CONTENT - Durum kodu (205) SC_PARTIAL_CONTENT - Durum kodu (206) SC_MULTIPLE_CHOICES (Durum_MULTIPLE_CHOICES - Durum kodu_VSEED_2) SCAN 303) SC_NOT_MODIFIED - Durum kodu (304) SC_USE_PROXY - Durum kodu (305) SC_BAD_REQUEST - Durum kodu (400) SC_UNAUTHORIZED - Durum kodu (401) SC_PAYMENT_REQUIRED - Durum kodu (402) SC_FORBID (Durum kodu) - Durum kodu (404) SC_ALLHOD_NOT Durum kodu (405) SC_NOT_ACCEPTABLE - Durum kodu (406) SC_PROXY_AUTHENTICATION_REQUIRED - Durum kodu (407) SC_REQUEST_TIMEOUT - Durum s kodu (408) SC_CONFLICT - Durum kodu (409) SC_GONE - Durum kodu (410) SC_LENGTH_REQUIRED - Durum kodu (411) SC_PRECONDITION_FAILED - Durum kodu (412) SC_REQUEST_ENTITY_TOO_LARGE - Durum (413) SC_REQUEST kodu (415) SC_RENOQUESTED_SATRANGE_ Durum kodu ) SC_EXPECTATION_FAILED - Durum kodu (417) SC_INTERNAL_SERVER_ERROR - Durum kodu (500) SC_NOT_IMPLEMENTED - Durum kodu SC_BAD_CodeAEW2) (504) SC_HTTP_VERSION_NOT_SUPPORTED - Durum kodu (505)

HttpServletResponse hakkında söylenecek tek şey bu

WEB Uygulamalarında Servlet Kullanımı

Şimdi WEB uygulamalarında servlet kullanımından bahsedelim. Bunun için pratikte faydalı olabilecek iki faydalı örnek vereceğim.

İlk örnek, bir HttpServlet ile çalışma ve sıkıştırılmış HTML sayfası içeriğinin çıktısını alma yöntemlerini gösterir. Teoride, tarayıcı yanıtındaki HTML sayfası düz metin olarak görüntülenir, ancak gönderilen veri miktarını azaltmak için GZIP sıkıştırmasını kullanabilirsiniz. Modern tarayıcılar (en az 4. nesil tarayıcılar ve üstü) bu metinsel bilgi gönderme yöntemini destekler ve sayfayı sıkıştırılmamış gibi gösterir.

java'yı içe aktarın. io.*; javax'ı içe aktarın. sunucu uygulaması *; javax'ı içe aktarın. sunucu uygulaması http.*; java'yı içe aktarın. kullan. fermuar *; // sunucu uygulaması HttpServlet'ten miras alır public class ZipServlet, HttpServlet'i genişletir ( // GET yöntemini işlemek için işlev public void doGet (HttpServletRequest isteği, HttpServletResponse yanıtı) ServletException, IOException ( // sayfayı bir HTML belgesi olarak ayarla cevap. setContentType ("metin / html"); // HTTP başlığından "Kabul Et-Kodlama" parametresini alın Dize kodlamaları = istek. getHeader ("Kodlamayı Kabul Et"); // "kodlama" parametresini alın - belgenin önceden belirtilen kodlaması Dize encodeFlag = istek. getParameter ("kodlama"); // nereye çıktı alacağız Yazıcı çıktısı; // istekte "Kabul Et-Kodlama" alanı varsa if (kodlamalar! = null) ( // ve bu alan "gzip" değerini içeriyorsa ve kodlama henüz ayarlanmadıysa, if ((encodings. indexOf ("gzip")! = - 1) &&! encodeFlag. equals ("none")) ( // çıktıyı bir takip edecek ve metni GZIP kullanarak sıkıştıracak out = new PrintWriter (yeni GZIPOutputStream (yanıt. getOutputStream()), false); // ve tarayıcı için belgenin sıkıştırılacağı bir bayrak ayarlayın cevap. setHeader ("İçerik Kodlama", "gzip"); ) else out = yanıt. getWriter(); ) Başka // yoksa sıkıştırma olmadan çıktı alacağız dışarı = yanıt. getWriter(); dışarı. println ("Bu bir test !!!"); // belgenin gövdesini yaz dışarı. kapat (); // ve çıktıyı kapatın. // Her şey, bu işlevin tamamlanmasının ardından belge gönderilecek } }

İkinci örnek, bir sunucu uygulamasının bir sayfayı sürekli olarak nasıl oluşturabileceğini gösterir. Bu tür sayfa görüntüleme, örneğin sohbetlerde kullanılabilir: yeni mesajları okumak için her seferinde sayfayı yenilemeniz gerekmez, yeni mesajlar zaman içinde indirilir. Bazı proxy sunucularının bu tür veri aktarımını desteklemediğine dikkat edilmelidir, ancak bununla - ne yazık ki - hiçbir şey yapılamaz.

java'yı içe aktarın. io.*; javax'ı içe aktarın. sunucu uygulaması *; // program Servlet arayüzünü uygular sınıf DoloadServlet Servlet'i uygular (ServletConfig config; // ServletConfig nesnesi public DoloadServlet () () // hiçbir şey yapmıyor // başlatma sırasında yapılandırmayı kaydet public void init (ServletConfig config), ServletException'ı (bu. config = config;) atar // kayıtlı yapılandırmayı verir public ServletConfig getServletConfig () (dönüş yapılandırması;) // sunucu uygulaması bilgisi public String getServletInfo () ("DoloadServlet" döndür;) public void yok et () () // hiçbir şey yapmıyor // İstek işleniyor genel geçersiz hizmeti (ServletRequest isteği, ServletResponse yanıtı) ServletException, Java'yı atar. io. IOİstisna ( // isteği ayrıştırmayacağız, sadece karışıklık // bir HTTP başlığı oluşturun: String head = "HTTP / 1.0 200 OK \ n" + + "Sunucu: DoloadServlet \ n" + "İçerik Türü: metin / html; karakter kümesi = UTF-8 \ n"+ "Bağlantı: Canlı Tutma \ n" + "İçerik Kodlaması: çok parçalı / karışık \ n"+ "Aktarım-Kodlama: yığınlanmış" + "Pragma: önbelleksiz \ n \ n"; // şimdi ilk verileri ekleyin // bu örnek için - 20 etiket "
"satır sonu ile
for (int i = 0; ben< 20 ; i++ ) head = head + "
\ n "; // çıkış akışını al ServletOutputStream işletim sistemi = yanıt. getOutputStream(); // başlığı ve ilk verileri buraya yaz işletim sistemi. baskı (kafa); // arabelleğe yazılan her şeyi istemciye gönder cevap. floşBuffer(); // yeni satırlar eklemeye başla: // bu satırlar şöyle görünecek: satır numarası, ardından "
\ n "
// her yeni satır her 3 saniyede bir görünecek int ben = 0; while (doğru) ( // sayacı artır ben ++; // os satırını yaz. yazdır ("" + ben + "
\ n "); // tampon yanıtı boşaltın.flushBuffer(); // akışı 3 saniye dondur dene (uyku (3000);) yakala (İstisna e) ())))

Sunucu uygulaması mekanizmasının çok esnek olduğunu ve ayrı bir WEB sunucusu yazmayı gerektirebilecek şeyleri yapmanıza izin verdiğini söylemek gerekir (örneğin, bir sunucu uygulaması özgeçmişi durumunda olduğu gibi). Sunucu uygulamalarının dezavantajları, ilk başlatmanın düşük hızıdır (sunucu uygulaması yalnızca JIT makinesi tarafından derlenir), yüksek bellek tüketimi ve tüm Java programlarının eksikliği - dizelerle çalışmanın düşük hızı. İkinci durum, POST isteklerinde metin verilerini kabul eden sunucu uygulamaları çalıştığında fark edilir hale gelir. HttpServletRequest.getReader () ile ayrıştırırken bir HttpServlet'e yapılan 50 KB'lik bir POST isteği, sunucuyu birkaç dakika felç edebilir. Aynısı diğer java programları için de geçerlidir.

İşte iki küçük örnek:

// bir dize metni verildi // örnek 1 // String için "+" işlemini kullanarak bir string ile çalışma Dizi testi1 = ""; for (int i = 0; ben< text. length(); i++ ) test1 += text. charAt(i); // örnek 2 // arabellek kullanarak bir dize ile çalışma char buf = yeni karakter [metin. uzunluk ()]; for (int i = 0; ben< text. length(); i++ ) buf[ i] = text. charAt(i); String sample2 = new String(buf);

Küçük dizeler alırsak - 2-3 kb'ye kadar, örneklerin çalışmasındaki farklılıklar önemsizdir, ancak en az 10 kb boyutunda bir dize metni alırsak, ilk durumda program çalışacaktır. dize ile çok daha yavaş. Bu, Java'da tasarım gereğidir ve String sınıfının işlevlerinin uygulanmasında bir sorundur. Bu nedenle, hızlı bir sunucu uygulaması yazmak istiyorsanız, String sınıfı üzerinden uzun dizelerle çalışmaktan kaçının, örneğin StringBuffer sınıfını kullanın. Bu uyarı öncelikle ağdan büyük metinler almak ve yerel dosyaları işlemek için geçerlidir (örneğin, çok sayıda mesaj içeren bir ziyaretçi defteri için bir metin veritabanı olması durumunda).

Diğer bir sorun, WEB sisteminin çoklu görevleriyle ilgilidir. Birden çok kullanıcının sunucu uygulamanızı aynı anda isteyebileceğini unutmayın. Genellikle veri senkronizasyonu, aynı sunucu uygulamasının farklı hesaplama iş parçacıkları arasındaki bilgi alışverişi ile ilgili sorunlar vardır ve en yaygın sorun, dosyalara ve diğer adlandırılmış sistem kaynaklarına eşzamanlı erişim sorunudur. Örneğin, bir program okumak için bir dosya açarken diğeri oraya bir şeyler yazmaya çalışıyor. Sonuç olarak, ikinci program ya bir istisna alır ya da dosyanın yazmak için serbest bırakılmasını bekler. Bu hususta dikkatinizi çekmek isterim: Kapatılmamış dereleri arkanızda bırakmayın ve ihtiyaç kalmadığı an dereleri kapatın. Akış, elbette, daha sonra otomatik olarak kapanacak, ancak bu yalnızca "çöpçü" ona ulaştığında olacak ve bu arada ikinci programın dosyaya yazma erişimi olmayacak.

Çoklu göreve ek olarak, ServletContext arayüzünün "Object getAttribute (String name)" ve "void setAttribute (String name, Object object)" yöntemlerini kullanarak, senkronizasyon dahil olmak üzere servlet'ler arasında veri alışverişi yapabileceğinizi belirtmek isterim.

Java'nın en güzel özelliklerinden biri çok yönlü doğasıdır. Tabii ki, geleneksel masaüstü ve hatta mobil uygulamalar oluşturmak harika. Peki ya alışılmış yoldan çıkmak ve Java'da web uygulamaları geliştirme alanına girmek istiyorsanız? Sizin için iyi haber şu ki, dil, çok fazla güçlük çekmeden sağlam web uygulamaları oluşturmanıza olanak tanıyan eksiksiz bir Servlet API'si ile birlikte geliyor.

Servlet ile Java Uygulamaları Yazma

Bu nedenle, uygulama için yapılandırma dosyalarını zaten oluşturduk. Ancak, şu anki durumunda, kelimenin tam anlamıyla hiçbir şey yapmıyor. Müşterilerin bir HTML formu kullanarak kaydolabilmelerini istiyoruz, bu nedenle yapmamız gereken sonraki şey, kayıt başarılı olduktan sonra yukarıdaki formu ve müşteri ayrıntılarını görüntüleyecek JSP dosyaları oluşturmaktır. Şimdi yapacağımız şey bu.

Görünüm üzerinde çalışıyoruz

Uygulamanın görünümü iki JSP dosyası tarafından belirlenir - MVC bağlamında bunlara görünüm denir. İlki, kayıt formunun görüntülenmesinden ve girilen verileri kontrol ettikten sonra oluşabilecek olası hatalardan sorumlu olacaktır. İkincisi, kayıt işleminin başarıyla tamamlanmasının ardından müşteri tarafından girilen verileri gösterecek olan normal bir karşılama sayfası olacaktır.

İşte ilk JSP dosyası:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> kayıt

kayıt

$ (ihlal).