
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!-
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(); } }
-
Uygulamayı çalıştırmak için bir Tomcat yapılandırması oluşturmanız gerekir:
-
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ı:
-
Ş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.
-
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 .
-
Tamam'ı tıklayın. Artık uygulamayı başlatabileceğimizi görüyoruz:
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 .
-
http://localhost:8080/hello adresinden erişebiliriz . Bunu yaptığımızda, beklenen yanıtı alırız - "Merhaba" dizesi!
@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: HttpServletRequest
ve 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();
}
}
visitCounter
Artık sunucu uygulaması, sayfanın her ziyaret edildiğinde değerini artıran bir oturumla çalışır . Öznitelik visitCounter
henü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 HttpServletResponse
ve 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 redirect
daha 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");
}
}
GO TO FULL VERSION