JavaRush /وبلاگ جاوا /Random-FA /قسمت 5. Servlets، Java servlet API. نوشتن یک برنامه وب سا...

قسمت 5. Servlets، Java servlet API. نوشتن یک برنامه وب ساده

در گروه منتشر شد
این مطالب بخشی از مجموعه "مقدمه ای بر توسعه سازمانی" است. مقالات قبلی: قسمت 5. Servlets، Java servlet API.  نوشتن یک برنامه وب ساده - 1آیا قبلاً می‌دانید چگونه برنامه‌های جاوا را بنویسید که متن را به کنسول ارسال می‌کنند، اما هنوز واقعاً نمی‌دانید چگونه اولین برنامه وب خود را ایجاد کنید؟ عالیه خودتو راحت کن در این مقاله با سرولت ها آشنا می شویم و اپلیکیشنی را می نویسیم که بدون ارسال jarnik یا مجبور کردن آنها به دانلود جاوا به دوستان خود نشان دهید. بیایید یک برنامه وب بنویسیم . اگر هنوز با رویکردهایی که در برنامه نویسی وب استفاده می شود آشنا نیستید، به شما توصیه می کنم که مطالعه را از اولین مقاله مجموعه " مقدمه ای بر توسعه سازمانی " شروع کنید.

سرولت چیست

ابتدا، بیایید بفهمیم یک servlet چیست و چرا اغلب در مورد آن می شنوید. Java Servlet API یک API استاندارد شده است که برای پیاده سازی روی سرور و کار با مشتری با استفاده از طرح درخواست-پاسخ طراحی شده است. servlet کلاسی است که می تواند درخواست های یک کلاینت را دریافت کند و به آن پاسخ دهد. بله، سرولت ها در جاوا دقیقاً عناصری هستند که معماری سرویس گیرنده-سرور با آنها ساخته می شود. اگر به خاطر داشته باشید قبلاً در یکی از مقالات این مجموعه در مورد آن صحبت کرده بودیم. بیایید در اطراف بوش ضرب و شتم نکنیم: بیایید فوراً کدی بنویسیم.

آنچه برای ایجاد یک برنامه وب نیاز دارید

برای کار راحت با servlet ها در جاوا، به Intellij IDEA Ultimate Edition نیاز دارید. پرداخت می شود، اما می توانید یک دوره آزمایشی 30 روزه را فعال کنید یا از نسخه دسترسی اولیه استفاده کنید - همیشه رایگان است. همچنین سرور برنامه ما - Apache Tomcat را نصب کنید. Tomcat یک کانتینر servlet است: این ظرف است که درخواست های دریافتی را از خارج پردازش می کند و آنها را به برنامه ما ارسال می کند. شما می توانید Tomcat را از این لینک دانلود کنید .

ایجاد اولین برنامه وب

اگر همه چیز آماده است، بیایید یک پروژه Maven ایجاد کنیم. اگر با Maven آشنایی ندارید، به مقاله قبلی توجه کنید . شروع کنیم!
  1. در 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>

    کلاس سرولت ساده:

    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();
       }
    }
  2. برای اجرای برنامه باید یک پیکربندی Tomcat ایجاد کنید:

    قسمت 5. Servlets، Java servlet API.  نوشتن یک برنامه وب ساده - 2 قسمت 5. Servlets، Java servlet API.  نوشتن یک برنامه وب ساده - 3

  3. سپس، نشان می‌دهیم که از کدام نسخه Tomcat استفاده خواهیم کرد، آدرس اینترنتی که می‌توانیم به سرور دسترسی داشته باشیم و پورت. شما باید چیزی شبیه به این دریافت کنید:

    قسمت 5. Servlets، Java servlet API.  نوشتن یک برنامه وب ساده - 4
  4. تنها چیزی که باقی می ماند این است که مصنوع را مشخص کنیم (پروژه مونتاژ شده در یک بایگانی jar) که در ظرف مستقر می شود. می‌توانید روی دکمه Fix کلیک کنید و war exploded را انتخاب کنید : این بدان معناست که پس از بازسازی پروژه، آرتیفکت به‌طور خودکار در ظرف servlet قرار می‌گیرد. قسمت 5. Servlets، Java servlet API.  نوشتن یک برنامه وب ساده - 5

  5. زمینه برنامه به طور پیش فرض روی servlets_war_exploded تنظیم شده است ، به این معنی که برنامه باید در آدرس زیر قابل دسترسی باشد: http://localhost:8080/servlets_war_exploded .

    چرا به متن اضافی نیاز داریم؟ بیایید چیزهای غیر ضروری را حذف کنیم. اکنون آدرس برنامه ما این است: http://localhost:8080 .

    قسمت 5. Servlets، Java servlet API.  نوشتن یک برنامه وب ساده - 6

  6. روی OK کلیک کنید. می بینیم که اکنون این فرصت را داریم که برنامه را راه اندازی کنیم:

    قسمت 5. Servlets، Java servlet API.  نوشتن یک برنامه وب ساده - 7

    اکنون وقتی برنامه را اجرا می کنید، مرورگر باید باز شود و خطای 404 را نمایش دهد. این منطقی است، زیرا در آدرس http://localhost:8080/ باید یک servlet با نگاشت “/” وجود داشته باشد و تنها سرور ما دارای نگاشت “/hello” است .

  7. ما با آن در http://localhost:8080/hello تماس می گیریم و پاسخ مورد انتظار را دریافت می کنیم - رشته "Hello"!

اگر همه چیز کار می کند، بیایید به کد نگاه کنیم. برای ایجاد یک سرور http از یک کلاس معمولی ، باید آن را از کلاس HttpServlet به ارث ببرید. در بالای کلاس، حاشیه نویسی @WebServlet() را مشخص می کنیم، که در آن servlet را به یک مسیر خاص ("/hello") متصل می کنیم (نقشه یابی می کنیم). این حاشیه‌نویسی فقط در Java Servlet API 3.0 ظاهر شد، بنابراین نمونه‌های زیادی در اینترنت وجود دارد که در آن نقشه‌برداری سرولت از طریق یک فایل XML انجام می‌شود. حالا این لازم نیست. برای پردازش درخواست‌های GET ، متد doGet() را لغو می‌کنیم. به آرگومان های متد - HttpServletRequest و HttpServletResponse توجه کنید. از شی HttpServletRequest می توانیم تمام اطلاعات لازم در مورد درخواست را بگیریم، در HttpServletResponse می توانیم پاسخ خود را ضبط کرده و سربرگ های لازم را تنظیم کنیم.

کار با پارامترها و جلسه

بیایید 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 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 در حال حاضر جلسه را اجرا می کند و هر بار که از صفحه بازدید می شود بازدید Counter را افزایش می دهد. اگر مشخصه visitCounter هنوز ایجاد نشده باشد (اولین باری که از صفحه بازدید می کنید)، متد getAttribute() null برمی گرداند، بنابراین باید null را بررسی کنید. همین امر در مورد پارامترهای درخواست نیز صدق می کند. اگر کاربر پارامتر نام کاربری را پاس نکرده باشد، مقدار آن null خواهد بود. در این صورت به کاربر به عنوان ناشناس سلام خواهیم داد. برای ارسال یک پارامتر در درخواست GET، از path-variables استفاده می شود، یعنی باید به پیوند http://localhost:8080/hello?username=Pavel دسترسی داشته باشید . می توانید اطلاعات بیشتری در مورد درخواست های http در مقاله قبلی این مجموعه بخوانید. اکنون برنامه ما حداقل منطق دارد، اما خطای 404 در مسیر ریشه کمی آزار دهنده است. برای رفع آن، بیایید یک servlet دیگر ایجاد کنیم و آن را به صفحه اولیه @WebServlet("/") نگاشت کنیم. وظیفه این سرولت هدایت درخواست ها به مسیر "/hello" است. دو راه برای انجام این کار وجود دارد: استفاده از فوروارد یا تغییر مسیر. شاید ارزش درک تفاوت بین آنها را داشته باشد. فوروارد - پردازش درخواست را به سرور دیگری در سرور ارسال می کند، مشتری درگیر نیست. برای این کار باید کد زیر را به متد doGet()سرولت جدید اضافه کنید:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
در این کد به متن servlet دسترسی پیدا می کنیم، درخواست مدیر سرور مورد نظر را از آن دریافت می کنیم و از آن می خواهیم که یک درخواست خاص را با پارامترهای مشخص شده (req، resp) پردازش کند. تغییر مسیر - آدرسی را که برای پردازش درخواستش باید با آن تماس بگیرد به مشتری برمی گرداند. اکثر مرورگرها به صورت خودکار به لینک ارسال شده می روند. برای پیاده سازی ریدایرکت باید این کد را اضافه کنید:
resp.sendRedirect(req.getContextPath() + "/hello");
در HttpServletResponse ما متد redirect() را فراخوانی می کنیم و آدرسی را که کلاینت باید با آن تماس بگیرد به آن ارسال می کنیم. یک نکته مهم: پارامترهای http نیز باید در انتهای مسیر تغییر مسیر کامل اضافه شوند که خیلی راحت نیست. در شرایط ما، استفاده از فوروارد ترجیح داده می شود، اما اتفاق می افتد که بهتر است از ریدایرکت استفاده کنیم. اگر تفاوت کار آنها را درک کنید، در انتخاب خود اشتباه نخواهید کرد. کد سرور جدید به صورت زیر است:
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");
   }
}

خط پایین

اولین برنامه وب شما آماده است. در مقاله بعدی نحوه استقرار آن را بدون استفاده از Intellij IDEA یاد خواهید گرفت. ما برنامه ای نوشتیم که فقط درخواست های GET را پردازش می کند. متدهای http باقیمانده به همین روش پردازش می شوند - روش های مربوط به کلاس والد را نادیده می گیرند. با استفاده از چنین سرولت های ساده ای می توانید برنامه های وب پیچیده و غنی بسازید. البته، با استفاده از فریمورک های بزرگ مانند Spring، انجام این کار بسیار ساده تر است. اما اگر واقعاً می‌خواهید تمام قابلیت‌های servlets را با جزئیات بیشتری بررسی کنید، می‌توانید مشخصات رسمی را بخوانید . قسمت 6. ظروف Servlet قسمت 7. مقدمه ای بر الگوی MVC (Model-View-Controller) قسمت 8. نوشتن یک برنامه کوچک در Spring-boot
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION