सर्व्हलेट म्हणजे काय?
प्रथम, सर्व्हलेट्स काय आहेत आणि आपण त्यांच्याबद्दल वारंवार का ऐकतो ते शोधूया. Java Servlet API हे एक प्रमाणित API आहे जे सर्व्हरवर कार्यान्वित करायचे आहे. विनंती-प्रतिसाद योजनेनुसार ते ग्राहकांशी संवाद साधते. सर्व्हलेट हा एक वर्ग आहे जो क्लायंटकडून विनंत्या प्राप्त करू शकतो आणि क्लायंटला प्रतिसाद देऊ शकतो . खरं तर, सर्व्हलेट्स हे अगदी बिल्डिंग ब्लॉक्स आहेत जे आम्ही Java मध्ये क्लायंट-सर्व्हर आर्किटेक्चर तयार करण्यासाठी वापरतो. तुम्हाला आठवत असेल की आम्ही त्या वास्तुकलेबद्दल या मालिकेतील आणखी एका लेखात आधीच बोललो होतो. आम्ही झुडूप भोवती मारणार नाही: चला लगेच काही कोड लिहू.वेब ऍप्लिकेशन तयार करण्यासाठी तुम्हाला काय आवश्यक आहे
Java servlets सह काम करताना सर्वात जास्त सोयीसाठी, तुम्हाला IntelliJ IDEA अल्टिमेट एडिशन आवश्यक आहे. हे एक सशुल्क उत्पादन आहे, परंतु तुम्ही 30-दिवसांची चाचणी सक्रिय करू शकता किंवा लवकर प्रवेश आवृत्ती वापरू शकता, जी नेहमी विनामूल्य असते. तसेच, Apache Tomcat — आमच्या ऍप्लिकेशनचा सर्व्हर इंस्टॉल करा. Tomcat एक सर्व्हलेट कंटेनर आहे: ते येणार्या विनंत्यांवर प्रक्रिया करते आणि आमच्या अर्जाकडे पाठवते. येथे टॉमकॅट डाउनलोड करा .चला आमचे पहिले वेब ऍप्लिकेशन तयार करू
सर्वकाही तयार असल्यास, एक Maven प्रकल्प तयार करा. तुम्ही मावेनशी परिचित नसल्यास, मागील लेख पहा . चला सुरवात करूया!-
pom.xml मध्ये, javax.servlet-api अवलंबित्व जोडा आणि WAR पॅकेजिंग निर्दिष्ट करा:
<?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>
साधे सर्वलेट वर्ग:
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(); } }
-
अनुप्रयोग चालविण्यासाठी, तुम्हाला टॉमकॅट कॉन्फिगरेशन तयार करण्याची आवश्यकता आहे:
-
पुढे, आम्ही टॉमकॅटची कोणती आवृत्ती वापरू आणि सर्व्हरशी संप्रेषण करण्यासाठी URL आणि पोर्ट सूचित करतो. आपल्याकडे असे काहीतरी असावे:
-
आता आम्हाला फक्त आर्टिफॅक्ट (जेएआर आर्काइव्हमध्ये एकत्रित केलेला प्रकल्प) निर्दिष्ट करण्याची आवश्यकता आहे जी कंटेनरमध्ये तैनात केली जाईल. तुम्ही फिक्स बटणावर क्लिक करू शकता आणि वॉर एक्स्प्लोड निवडू शकता : याचा अर्थ प्रकल्प पुन्हा तयार झाल्यानंतर, आर्टिफॅक्ट स्वयंचलितपणे सर्व्हलेट कंटेनरमध्ये ठेवली जाईल.
-
ऍप्लिकेशन संदर्भासाठी डीफॉल्ट मूल्य servlets_war_exploded आहे . याचा अर्थ आम्ही येथे ऍप्लिकेशन ऍक्सेस करतो: http://localhost:8080/servlets_war_exploded .
आम्हाला कोणताही अतिरिक्त मजकूर का हवा आहे? जे अनावश्यक आहे ते हटवू. आता आम्ही आमच्या वेब ऍप्लिकेशनचा पत्ता आहे: http://localhost:8080 .
-
ओके क्लिक करा. आम्ही पाहतो की आम्ही आता अनुप्रयोग लाँच करू शकतो:
आता जेव्हा तुम्ही तुमच्या ब्राउझरमध्ये अॅप्लिकेशन उघडता तेव्हा तुम्हाला 404 एरर मिळेल. हे अर्थपूर्ण आहे, कारण http://localhost:8080/ या पत्त्याला "/" वर मॅप करणार्या सर्व्हलेटची आवश्यकता आहे, परंतु आमचे एकमेव सर्व्हलेट नकाशे "/hello" वर आहेत .
-
आम्ही http://localhost:8080/hello येथे प्रवेश करू शकतो . एकदा आम्ही ते केल्यावर, आम्हाला अपेक्षित उत्तर मिळेल — स्ट्रिंग "हॅलो"!
@WebServlet()
भाष्य सूचित करतो. येथेच आम्ही सर्व्हलेटला विशिष्ट मार्गावर ("/hello") बांधतो (किंवा नकाशा). हे भाष्य फक्त Java Servlet API 3.0 मध्ये दिसून आले, त्यामुळे इंटरनेटमध्ये बरीच उदाहरणे आहेत जिथे XML फाइलद्वारे सर्व्हलेट मॅपिंग होते. हे आता आवश्यक नाही. GET विनंत्या हाताळण्यासाठी , आम्ही doGet()
पद्धत ओव्हरराइड करतो. पद्धतीच्या पॅरामीटर्सकडे लक्ष द्या: HttpServletRequest
आणि HttpServletResponse
. ऑब्जेक्ट HttpServletRequest
आम्हाला विनंतीबद्दल सर्व आवश्यक माहिती प्रदान करते. मध्ये HttpServletResponse
, आम्ही आमचे प्रतिसाद लिहितो आणि आवश्यक शीर्षलेख सेट करतो.
पॅरामीटर्स आणि सत्रासह कार्य करणे
चला आमचे सर्व्हलेट सुधारूया जेणेकरून ते विनंती पॅरामीटर्सवर प्रक्रिया करू शकेल आणि सत्रासह कार्य करू शकेल:
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
प्रत्येक वेळी पृष्ठास भेट देताना त्याचे मूल्य वाढते. जर visitCounter
विशेषता अद्याप तयार केली गेली नसेल (पृष्ठाला प्रथम भेट दिल्यावर), पद्धत getAttribute()
शून्य दर्शवते, म्हणून आम्हाला शून्य तपासण्याची आवश्यकता आहे. विनंती पॅरामीटर्ससाठीही तेच आहे. जर वापरकर्ता वापरकर्तानाव पॅरामीटर पास करत नसेल तर त्याचे मूल्य शून्य असेल. या प्रकरणात, आम्ही वापरकर्त्याला अनामिक अभ्यागत म्हणून अभिवादन करतो. GET विनंतीमध्ये पॅरामीटर पास करण्यासाठी, क्वेरी स्ट्रिंग वापरली जाते, उदाहरणार्थ, आम्ही खालील URL वापरू शकतो: http:// localhost:8080/hello? वापरकर्तानाव=पॉल. आपण मागील लेखात HTTP विनंत्यांबद्दल अधिक वाचू शकतामालिकेत. आमच्या ऍप्लिकेशनमध्ये सध्या फारसे तर्क नाही, परंतु रूट मार्गावर आम्हाला 404 त्रुटी मिळाली हे थोडे त्रासदायक आहे. याचे निराकरण करण्यासाठी, आम्ही दुसरे सर्व्हलेट तयार करू आणि त्यास प्रारंभ पृष्ठावर मॅप करू: @WebServlet("/")
. या सर्व्हलेटचा उद्देश "/hello" मार्गावर विनंत्या पुनर्निर्देशित करणे आहे. हे करण्याचे दोन मार्ग आहेत: "फॉरवर्ड" किंवा "पुनर्निर्देशित" वापरणे. कदाचित त्यांच्यातील फरक समजून घेणे फायदेशीर आहे. सर्व्हरवरील दुसर्या सर्व्हलेटला विनंतीची प्रक्रिया अग्रेषित करतो . ग्राहक गुंतलेला नाही. हे करण्यासाठी, नवीन सर्व्हलेटच्या doGet() पद्धतीमध्ये खालील कोड जोडा:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
या कोडमध्ये, आम्ही सर्व्हलेट संदर्भामध्ये प्रवेश करतो, संबंधित सर्व्हलेटसाठी विनंती प्रेषक मिळवतो आणि निर्दिष्ट युक्तिवादांसह (req, resp) विशिष्ट विनंतीवर प्रक्रिया करण्यास सांगतो. रीडायरेक्ट क्लायंटला तो पत्ता देतो जो क्लायंटने त्याच्या विनंतीवर प्रक्रिया करण्यासाठी वापरला पाहिजे . बहुतेक ब्राउझर परत दिलेल्या URL वर स्वयंचलितपणे नेव्हिगेट करतात. पुनर्निर्देशन लागू करण्यासाठी, तुम्हाला हा कोड जोडण्याची आवश्यकता आहे:
resp.sendRedirect(req.getContextPath() + "/hello");
आम्ही redirect()
पॅरामीटरवर पद्धत कॉल करतो HttpServletResponse
आणि क्लायंटला वापरण्यासाठी आवश्यक असलेला पत्ता पास करतो. येथे एक महत्त्वाचा तपशील आहे: पूर्ण पुनर्निर्देशन मार्गाच्या शेवटी HTTP पॅरामीटर्स देखील जोडणे आवश्यक आहे, जे फार सोयीचे नाही. आमच्या परिस्थितीत, ते वापरणे श्रेयस्कर आहे forward
, परंतु काहीवेळा वापरणे redirect
चांगले आहे. ते कसे कार्य करतात यातील फरक तुम्हाला समजला, तर तुम्ही चुकीची निवड करणार नाही. नवीन सर्व्हलेटचा कोड असा दिसतो:
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