- नेटवर्किंग के बारे में
- सॉफ्टवेयर आर्किटेक्चर के बारे में
- HTTP/HTTPS के बारे में
- मेवेन की मूल बातें के बारे में
सर्वलेट क्या है?
सबसे पहले, आइए जानें कि सर्वलेट्स क्या हैं और आप उनके बारे में इतनी बार क्यों सुनते हैं। जावा सर्वलेट एपीआई एक मानकीकृत एपीआई है जिसे सर्वर पर लागू करने का इरादा है। यह अनुरोध-प्रतिक्रिया योजना के अनुसार ग्राहकों के साथ बातचीत करता है। सर्वलेट एक ऐसा वर्ग है जो क्लाइंट से अनुरोध प्राप्त कर सकता है और क्लाइंट को प्रतिक्रियाएँ लौटा सकता है । वास्तव में, सर्वलेट वास्तव में बिल्डिंग ब्लॉक्स हैं जिनका उपयोग हम जावा में क्लाइंट-सर्वर आर्किटेक्चर बनाने के लिए करते हैं। आपको याद हो सकता है कि हम पहले ही श्रृंखला के अन्य लेखों में उस वास्तुकला के बारे में बात कर चुके हैं। हम घुमा फिराकर नहीं चलेंगे: चलो अभी कुछ कोड लिखते हैं।वेब एप्लिकेशन बनाने के लिए आपको क्या चाहिए
Java सर्वलेट्स के साथ काम करते समय सबसे अधिक सुविधा के लिए, आपको IntelliJ IDEA अल्टीमेट एडिशन की आवश्यकता है। यह एक सशुल्क उत्पाद है, लेकिन आप 30-दिन के परीक्षण को सक्रिय कर सकते हैं या शुरुआती एक्सेस संस्करण का उपयोग कर सकते हैं, जो हमेशा निःशुल्क होता है। साथ ही, Apache Tomcat — हमारे एप्लिकेशन का सर्वर इंस्टॉल करें। टॉमकैट एक सर्वलेट कंटेनर है: यह आने वाले अनुरोधों को संसाधित करता है और उन्हें हमारे आवेदन में भेजता है। टॉमकैट को यहां से डाउनलोड करें ।आइए अपना पहला वेब एप्लिकेशन बनाएं
यदि सब कुछ तैयार है, तो मावेन प्रोजेक्ट बनाएं। यदि आप मावेन से परिचित नहीं हैं, तो पिछले लेख पर एक नज़र डालें । चलो शुरू करें!-
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()
एनोटेशन इंगित करते हैं। यह वह जगह है जहां हम सर्वलेट को एक विशिष्ट पथ ("/ हैलो") से बांधते हैं (या मैप करते हैं)। यह एनोटेशन केवल जावा सर्वलेट एपीआई 3.0 में दिखाई दिया, इसलिए इंटरनेट में ऐसे कई उदाहरण हैं जहां एक्सएमएल फ़ाइल के माध्यम से सर्वलेट मैपिंग होती है। यह अब आवश्यक नहीं है। जीईटी अनुरोधों को संभालने के लिए , हम 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("/")
. इस सर्वलेट का उद्देश्य अनुरोधों को "/ हैलो" पथ पर पुनर्निर्देशित करना है। ऐसा करने के दो तरीके हैं: "आगे" या "रीडायरेक्ट" का उपयोग करना। शायद उनके बीच के अंतर को समझना सार्थक है। एक अग्रेषित प्रतिनिधि सर्वर पर किसी अन्य सर्वलेट के अनुरोध को संसाधित करता है। ग्राहक शामिल नहीं है। ऐसा करने के लिए, निम्नलिखित कोड को नए सर्वलेट के doGet () विधि में जोड़ें:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
इस कोड में, हम सर्वलेट संदर्भ का उपयोग करते हैं, प्रासंगिक सर्वलेट के लिए अनुरोध डिस्पैचर प्राप्त करते हैं, और निर्दिष्ट तर्कों (req, resp) के साथ एक विशिष्ट अनुरोध को संसाधित करने के लिए कहते हैं। रीडायरेक्ट क्लाइंट को उस पते पर लौटाता है जिसका उपयोग क्लाइंट को उसके अनुरोध को संसाधित करने के लिए करना चाहिए । अधिकांश ब्राउज़र स्वचालित रूप से लौटाए गए यूआरएल पर नेविगेट करते हैं। रीडायरेक्ट लागू करने के लिए, आपको यह कोड जोड़ना होगा:
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");
}
}