CodeGym /وبلاگ جاوا /Random-FA /قسمت 5. Servlets و Java Servlet API. نوشتن یک برنامه وب س...
John Squirrels
مرحله
San Francisco

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

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

سرولت چیست؟

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

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

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

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

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

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

  3. در مرحله بعد، ما نشان می دهیم که از کدام نسخه Tomcat استفاده خواهیم کرد و URL و پورت ارتباط با سرور را نشان می دهیم. شما باید چیزی مشابه این داشته باشید:

    قسمت 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/ به یک سرور نیاز دارد که به "/" نگاشت شود، اما تنها سرور ما به "/hello" نگاشت می شود .

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

اگر همه چیز کار می کند، بیایید کد را تجزیه و تحلیل کنیم. برای ساختن HTTP-servlet از یک کلاس معمولی ، باید کلاس HttpServlet را به ارث ببرد. در بالای اعلان کلاس، @WebServlet()حاشیه نویسی را نشان می دهیم. اینجا جایی است که ما سرورلت را به یک مسیر خاص ("/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 با یک جلسه کار می کند و ارزش visitCounterهر بار بازدید از صفحه را افزایش می دهد. اگر visitCounterمشخصه هنوز ایجاد نشده باشد (در اولین بازدید از صفحه)، متد getAttribute()null را برمی گرداند، بنابراین باید null را بررسی کنیم. در مورد پارامترهای درخواست هم همینطور. اگر کاربر پارامتر نام کاربری را پاس نکند، مقدار آن null خواهد بود. در این صورت به کاربر به عنوان بازدیدکننده ناشناس سلام می کنیم. برای ارسال یک پارامتر در درخواست GET، از یک query string استفاده می شود، به عنوان مثال، می توانیم از URL زیر استفاده کنیم: http:// localhost:8080/hello? نام کاربری = پل. در مقاله قبلی این مجموعه می توانید اطلاعات بیشتری در مورد درخواست های HTTP بخوانید . برنامه ما در حال حاضر منطق زیادی ندارد، اما کمی آزاردهنده است که در مسیر ریشه با خطای 404 مواجه می شویم. برای رفع این مشکل، ما یک servlet دیگر ایجاد می کنیم و آن را به صفحه شروع نگاشت می کنیم: @WebServlet("/"). هدف این سرورلت هدایت درخواست ها به مسیر "/hello" است. دو راه برای انجام این کار وجود دارد: استفاده از "forward" یا "redirect". شاید ارزش درک تفاوت بین آنها را داشته باشد. فوروارد پردازش درخواست را به سرور دیگری در سرور واگذار می کند . مشتری درگیر نیست. برای انجام این کار، کد زیر را به متد ()doGet جدید servlet اضافه کنید:
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");
   }
}

خلاصه

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