- নেটওয়ার্কিং সম্পর্কে
- সফটওয়্যার আর্কিটেকচার সম্পর্কে
- HTTP/HTTPS সম্পর্কে
- Maven এর মূল বিষয় সম্পর্কে
একটি servlet কি?
প্রথমে, আসুন জেনে নেওয়া যাক সার্লেটগুলি কী এবং কেন আপনি সেগুলি সম্পর্কে প্রায়শই শুনতে পান। জাভা সার্ভলেট API হল একটি প্রমিত API যা সার্ভারে প্রয়োগ করার উদ্দেশ্যে। এটি একটি অনুরোধ-প্রতিক্রিয়া স্কিম অনুযায়ী ক্লায়েন্টদের সাথে যোগাযোগ করে। একটি servlet একটি শ্রেণী যা একটি ক্লায়েন্ট থেকে অনুরোধ গ্রহণ করতে পারে এবং ক্লায়েন্টের কাছে প্রতিক্রিয়া ফেরত দিতে পারে। আসলে, servlets হল ঠিক সেই বিল্ডিং ব্লক যা আমরা জাভাতে একটি ক্লায়েন্ট-সার্ভার আর্কিটেকচার তৈরি করতে ব্যবহার করি। আপনি মনে করতে পারেন যে আমরা ইতিমধ্যে সিরিজের অন্য একটি নিবন্ধে সেই স্থাপত্য সম্পর্কে কথা বলেছি। আমরা ঝোপের চারপাশে মারতে যাচ্ছি না: আসুন এখনই কিছু কোড লিখি।একটি ওয়েব অ্যাপ্লিকেশন তৈরি করতে আপনার যা প্রয়োজন
Java servlets এর সাথে কাজ করার সময় সর্বাধিক সুবিধার জন্য, আপনার IntelliJ IDEA আলটিমেট সংস্করণ প্রয়োজন। এটি একটি অর্থপ্রদানের পণ্য, তবে আপনি একটি 30-দিনের ট্রায়াল সক্রিয় করতে পারেন বা প্রাথমিক অ্যাক্সেস সংস্করণটি ব্যবহার করতে পারেন, যা সর্বদা বিনামূল্যে। এছাড়াও, Apache Tomcat ইনস্টল করুন — আমাদের অ্যাপ্লিকেশনের সার্ভার। টমক্যাট একটি সার্লেট ধারক: এটি আগত অনুরোধগুলি প্রক্রিয়া করে এবং সেগুলিকে আমাদের অ্যাপ্লিকেশনে প্রেরণ করে। এখানে টমক্যাট ডাউনলোড করুন ।আসুন আমাদের প্রথম ওয়েব অ্যাপ্লিকেশন তৈরি করি
সবকিছু প্রস্তুত হলে, একটি Maven প্রকল্প তৈরি করুন। আপনি যদি 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 এবং পোর্ট নির্দেশ করি। আপনি ভালো কিছু করা উচিত:
-
এখন আমাদের শুধু আর্টিফ্যাক্টটি নির্দিষ্ট করতে হবে (একটি JAR আর্কাইভে একত্রিত প্রকল্প) যা কন্টেইনারে স্থাপন করা হবে। আপনি ফিক্স বোতামে ক্লিক করতে পারেন এবং যুদ্ধ বিস্ফোরিত নির্বাচন করতে পারেন : এর অর্থ হল প্রকল্পটি পুনর্নির্মাণের পরে, আর্টিফ্যাক্টটি স্বয়ংক্রিয়ভাবে সার্লেট পাত্রে স্থাপন করা হবে।
-
অ্যাপ্লিকেশন প্রসঙ্গের ডিফল্ট মান হল servlets_war_exploded । এর মানে হল যে আমরা এখানে অ্যাপ্লিকেশন অ্যাক্সেস করি: http://localhost:8080/servlets_war_exploded ।
কেন আমরা কোন অতিরিক্ত টেক্সট চাই? যা অপ্রয়োজনীয় তা মুছে ফেলি। এখন আমরা আমাদের ওয়েব অ্যাপ্লিকেশনের ঠিকানা: http://localhost:8080 ।
-
ওকে ক্লিক করুন। আমরা দেখতে পাচ্ছি যে আমরা এখন অ্যাপ্লিকেশনটি চালু করতে পারি:
এখন আপনি যখন আপনার ব্রাউজারে অ্যাপ্লিকেশনটি খুলবেন, আপনার একটি 404 ত্রুটি পাওয়া উচিত। এটি বোধগম্য, কারণ http://localhost:8080/ ঠিকানাটির জন্য একটি সার্লেট প্রয়োজন যা "/" তে ম্যাপ করে কিন্তু আমাদের একমাত্র servlet মানচিত্র "/hello" তে ।
-
আমরা এটি http://localhost:8080/hello এ অ্যাক্সেস করতে পারি । একবার আমরা তা করি, আমরা প্রত্যাশিত উত্তর পাব — স্ট্রিং "হ্যালো"!
@WebServlet()
টীকা নির্দেশ করি। এখানেই আমরা সার্লেটটিকে একটি নির্দিষ্ট পথে ("/হ্যালো") আবদ্ধ করি (বা মানচিত্র)। এই টীকাটি শুধুমাত্র 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("/")
. এই সার্লেটের উদ্দেশ্য হল অনুরোধগুলিকে "/হ্যালো" পাথে পুনঃনির্দেশ করা। এটি করার দুটি উপায় রয়েছে: "ফরোয়ার্ড" বা "পুনঃনির্দেশ" ব্যবহার করে। সম্ভবত এটি তাদের মধ্যে পার্থক্য বোঝা সার্থক। একটি ফরোয়ার্ড প্রতিনিধি সার্ভারে অন্য servlet অনুরোধ প্রক্রিয়াকরণ. ক্লায়েন্ট জড়িত নয়। এটি করার জন্য, নতুন servlet এর 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