
هڪ servlet ڇا آهي؟
پهرين، اچو ته اهو معلوم ڪريون ته سروليٽس ڇا آهن ۽ توهان انهن جي باري ۾ اڪثر ٻڌو ٿا. Java Servlet API هڪ معياري API آهي جيڪو سرور تي لاڳو ٿيڻ جو ارادو رکي ٿو. اهو هڪ درخواست-جواب اسڪيم جي مطابق گراهڪن سان رابطو ڪري ٿو. هڪ servlet هڪ ڪلاس آهي جيڪو ڪلائنٽ کان درخواستون وصول ڪري سگهي ٿو ۽ ڪلائنٽ ڏانهن جواب واپس ڪري سگهي ٿو. حقيقت ۾، servlets بلڪل بلڊنگ بلاڪ آھن جيڪي اسان جاوا ۾ ڪلائنٽ-سرور آرڪيٽيڪچر ٺاھڻ لاءِ استعمال ڪندا آھيون. توهان کي ياد هوندو ته اسان اڳ ۾ ئي هن فن تعمير بابت سيريز جي هڪ ٻئي مضمون ۾ ڳالهايو آهي. اسان بش جي چوڌاري مارڻ وارا نه آهيون: اچو ته فوري طور تي ڪجهه ڪوڊ لکون.توهان کي ويب ايپليڪيشن ٺاهڻ جي ڪهڙي ضرورت آهي
سڀ کان وڏي سهولت لاءِ جڏهن جاوا سروليٽس سان ڪم ڪري رهيا آهيو، توهان کي ضرورت آهي IntelliJ IDEA الٽيميٽ ايڊيشن. اهو هڪ ادا ڪيل پراڊڪٽ آهي، پر توهان 30 ڏينهن جي آزمائش کي چالو ڪري سگهو ٿا يا ابتدائي رسائي وارو نسخو استعمال ڪري سگهو ٿا، جيڪو هميشه مفت آهي. پڻ، انسٽال ڪريو Apache Tomcat - اسان جي ايپليڪيشن جو سرور. Tomcat هڪ سروليٽ ڪنٽينر آهي: اهو ايندڙ درخواستن تي عمل ڪري ٿو ۽ انهن کي اسان جي ايپليڪيشن ڏانهن منتقل ڪري ٿو. ڊائون لوڊ ڪريو 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>
سادي servlet ڪلاس:
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(); } }
-
ايپليڪيشن کي هلائڻ لاء، توهان کي Tomcat ترتيب ڏيڻ جي ضرورت آهي:
-
اڳيون، اسان ظاهر ڪريون ٿا ته Tomcat جو ڪهڙو نسخو استعمال ڪنداسين، ۽ سرور سان رابطي لاء URL ۽ بندرگاهه. توھان کي ڪجھھ ھجڻ گھرجي:
-
ھاڻي اسان کي صرف ھڪڙي نموني بيان ڪرڻ جي ضرورت آھي (جماعت واري منصوبي کي JAR آرڪائيو ۾) جيڪو ڪنٽينر ۾ لڳايو ويندو. توھان ڪلڪ ڪري سگھو ٿا درست ڪريو بٽڻ ۽ چونڊيو جنگ ڌماڪو : ان جو مطلب آھي ته منصوبي جي تعمير ٿيڻ کان پوء، آرٽيڪل خودڪار طريقي سان سرورٽ ڪنٽينر ۾ رکيل آھي.
-
ايپليڪيشن جي حوالي سان ڊفالٽ قيمت آهي servlets_war_exploded . ان جو مطلب اهو آهي ته اسان اپليڪيشن تائين رسائي حاصل ڪندا آهيون: http://localhost:8080/servlets_war_exploded .
اسان ڪنهن به اضافي ٽيڪسٽ ڇو چاهيون ٿا؟ اچو ته خارج ڪريون جيڪو غير ضروري آهي. ھاڻي اسان جي ويب ايپليڪيشن جو پتو آھي: http://localhost:8080 .
-
OK تي ڪلڪ ڪريو. اسان ڏسون ٿا ته اسان هاڻي ايپليڪيشن لانچ ڪري سگهون ٿا:
هاڻي جڏهن توهان پنهنجي برائوزر ۾ ايپليڪيشن کوليو ٿا، توهان کي 404 غلطي حاصل ڪرڻ گهرجي. اهو سمجھ ۾ اچي ٿو، ڇاڪاڻ ته ايڊريس http://localhost:8080/ کي هڪ سرورٽ جي ضرورت آهي جيڪا "/" ڏانهن نقشي ٺاهي ٿي، پر اسان جو واحد سرورٽ نقشا "/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
هاڻي servlet هڪ سيشن سان ڪم ڪري ٿو، هر دفعي صفحي جو دورو ڪرڻ جي قيمت وڌائي ٿو . جيڪڏهن visitCounter
وصف اڃا تائين پيدا نه ڪيو ويو آهي (صفحي جي پهرين دوري تي)، طريقو getAttribute()
واپس اچي ٿو null، تنهنڪري اسان کي null جي جانچ ڪرڻ جي ضرورت آهي. ساڳيو ئي درخواست جي پيٽرولن لاءِ وڃي ٿو. جيڪڏهن صارف صارف نام جي پيٽرولر کي پاس نٿو ڪري، ته پوء ان جو قدر null ٿيندو. انهي حالت ۾، اسان صارف کي هڪ گمنام دورو ڪندڙ طور سلام ڪريون ٿا. هڪ GET درخواست ۾ هڪ پيٽرولر کي پاس ڪرڻ لاء، هڪ سوال اسٽرنگ استعمال ڪيو ويندو آهي، مثال طور، اسان هيٺ ڏنل URL استعمال ڪري سگهون ٿا: http:// localhost:8080/hello؟
استعمال ڪندڙ جو نالو = پال. توھان وڌيڪ پڙھي سگھوٿا HTTP درخواستن بابت سيريز جي پوئين مضمون ۾.
اسان جي ايپليڪيشن ۾ في الحال گهڻو منطق نه آهي، پر اهو ٿورڙو ناراض آهي ته اسان کي روٽ رستي ۾ 404 غلطي ملي ٿي. هن کي درست ڪرڻ لاءِ، اسان هڪ ٻيو سروليٽ ٺاهينداسين ۽ ان کي شروعاتي صفحي تي نقشي ۾ آڻينداسين: @WebServlet("/")
. هن سرورٽ جو مقصد درخواستن کي "/ هيلو" رستي ڏانهن منتقل ڪرڻ آهي. هن کي ڪرڻ جا ٻه طريقا آهن: استعمال ڪندي "اڳتي" يا "ريڊائريڪٽ". شايد اھو انھن جي وچ ۾ فرق کي سمجھڻ جي قابل آھي. ھڪڙو پيش ڪندڙ نمائندو درخواست جي پروسيسنگ کي سرور تي ٻي خدمت ڏانھن موڪلي ٿو. ڪسٽمر ملوث نه آهي. ھن کي ڪرڻ لاء، ھيٺ ڏنل ڪوڊ شامل ڪريو نئين servlet جي doGet() طريقي ۾:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
هن ڪوڊ ۾، اسان servlet جي حوالي سان رسائي حاصل ڪندا آهيون، لاڳاپيل servlet لاء درخواست موڪليندڙ حاصل ڪريو، ۽ ان کي مخصوص دليلن (req، resp) سان مخصوص درخواست تي عمل ڪرڻ لاء پڇو. هڪ ريڊائريڪٽ ڪلائنٽ ڏانهن واپسي اهو پتو جيڪو ڪلائنٽ کي استعمال ڪرڻ گهرجي ان جي درخواست تي عمل ڪرڻ لاءِ. گھڻا برائوزر پاڻمرادو نيويگيٽ ڪندا آھن واپسي URL ڏانھن. ريٽائرمينٽ تي عمل ڪرڻ لاءِ، توھان کي ھي ڪوڊ شامل ڪرڻو پوندو:
resp.sendRedirect(req.getContextPath() + "/hello");
اسان پيراميٽر redirect()
تي طريقو سڏين ٿا HttpServletResponse
۽ ان کي پتو ڏيو جيڪو ڪلائنٽ استعمال ڪرڻ جي ضرورت آهي. هتي هڪ اهم تفصيل آهي: مڪمل ريڊائريڪٽ رستي جي آخر ۾ HTTP پيٽرولر پڻ شامل ڪيو وڃي، جيڪو تمام آسان ناهي. اسان جي صورتحال ۾، اهو استعمال ڪرڻ بهتر آهي forward
، پر ڪڏهن ڪڏهن استعمال ڪرڻ redirect
بهتر آهي. جيڪڏهن توهان فرق سمجھو ٿا ته اهي ڪيئن ڪم ڪن ٿا، توهان غلط چونڊ نه ڪندا. نئين servlet لاء ڪوڊ هن طرح ڏسجي ٿو:
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