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