JavaRush /وبلاگ جاوا /Random-FA /بدون ترحم. بیایید در مورد Java EE، servlet ها و کانتینرها...
eGarmin
مرحله

بدون ترحم. بیایید در مورد Java EE، servlet ها و کانتینرهای آنها صحبت کنیم

در گروه منتشر شد
در این تاپیک، می‌خواهم به صراحت در مورد درک خود از سرولت‌ها صحبت کنم، کانتینرهای سرولت چیست، بیشتر، اگر نه همه، فریمورک‌های فرانت‌اند وب چیست، و همچنین به این موضوع بپردازم که کانتینرهای سرولت و سرورهای برنامه چگونه با آن‌ها ارتباط دارند. یکدیگر و کانتینرهای سرور و سرور وب. بدون ترحم.  بیایید در مورد Java EE، servlet ها و ظروف آنها صحبت کنیم - 1قبل از شروع گفتگو، می خواهم یادآوری کنم که من واقعاً انتظار دارم که بحثی در میان باشد، زیرا ... در اینجا من نمی خواهم یک تکه کد را ارائه دهم، بلکه فقط می خواهم به ماهیت آن دست بزنم که همیشه می تواند با کلمات بیان شود. من سعی خواهم کرد تمام نکاتی را که در ابتدا برای من روشن نبود، بیان کنم. وقتی در انجمن‌های مختلف سؤالاتی درباره این موضوع پرسیدم که ظرف سرولت تامکت با هر سرور برنامه‌ای، مثلاً WebSphere یا Geronimo تفاوت دارد، تنها افرادی که جرأت پاسخ دادن را داشتند، احمق‌هایی بودند که نمی‌توانستند چیزی بگویند به جز «به ویکی‌پدیا نگاه کن» یا «به ویکی‌پدیا نگاه کن». سخت است که بگوییم، برنامه های کاربردی سرور - این یک زیرساخت پیچیده برای برنامه های کاربردی سازمانی است، که..." بلاههههه. من نمی توانم چنین افرادی را تحمل کنم و حدس می زنم که اکثر شما هم اینطور نیستید. بی عدالتی تاریخی را اصلاح خواهیم کرد. برو…

سرولت ها

مهم نیست که هر کسی چه می گوید، یک servlet یک صفحه وب است که به زبان جاوا نوشته شده است. برخی خواهند گفت که من اشتباه می کنم و سرورلت یک برنامه وب است و در این مفاهیم تفاوت وجود دارد، اما اینطور نیست. در حال حاضر هیچ تفاوتی وجود ندارد و سایت هایی که با PHP نوشته شده اند را می توان با خیال راحت وب اپلیکیشن نامید. اکنون این کاملا طبیعی است، زیرا ... php به طور کامل از OOP پشتیبانی می کند و CMS هایی مانند جوملا به طور فعال از آن استفاده می کنند. سرولت در سطح کد چیست؟ این کلاسی است که تعدادی متد دارد که می‌خوابند و می‌بینند که آیا کسی از طریق درخواست‌های HTTP GET یا POST به آنها دسترسی دارد یا خیر. آن ها مقداری درخواست GET را در مرورگر تایپ کردیم، متد مربوطه از کلاس servlet آن را می پذیرد و سپس پاسخی به آن در قالب یک صفحه HTML ایجاد می کند. در مفهوم کلاسیک یک servlet، همانطور که توسط Sun تصور شد، این صفحه خط به خط به مشتری ارسال می‌شود که با خط <!DOCTYPE htm>> شروع می‌شود و با خط </html> ختم می‌شود. بنابراین در جاوا یک کلاس servlet اساسی به نام وجود دارد Servlet. علاوه بر این، دسته‌ای از کلاس‌های دیگر وجود دارند که از این کلاس پایه به ارث می‌برند و در نتیجه عملکرد آن را گسترش می‌دهند. سرولت همین است - نه بیشتر. این فقط یک آنالوگ جاوا از کد PHP است که روی سرور نیز اجرا می شود و تنها پاسخ به درخواست مرورگر وب در قالب یک صفحه وب برای مشتری ارسال می شود. همه.

فریمورک های فرانت اند وب

زیرنویس پیچیده است و معمولاً آنها فقط فریم ورک فرانت اند یا حتی وب مازل می نویسند ، اما من تصمیم گرفتم در اینجا تأکید کنم که وقتی در مورد فریم ورک های فرانت اند صحبت می کنیم، در مورد یک رابط کاربری گرافیکی برای کار با جاوا از طریق مرورگر وب صحبت می کنیم. آن ها در اینجا دوباره در مورد وب سایت های جاوا صحبت می کنیم، یعنی. در مورد سرولت ها تقریباً هر فریم ورک فرانت‌اند، به عنوان مثال، Apache Struts چیست. این به سادگی مجموعه ای از کلاس ها است که کلاس پایه را گسترش می دهد Servlet. هیچ چیز بیشتر. آن ها این فقط یک راه متفاوت برای ایجاد همان servlet معمولی است. درست است که توسعه دهندگان این فریم ورک (یا به عبارت دیگر توسعه دهندگان این فناوری) در نظر گرفتند که اضافه کردن کلاس پایه آنها Servletبا برخی روش ها برای برنامه نویس راحت تر از عملکرد ناچیز سرورل کلاسیک Sun/Oracle است. دارد.

صفحات JSP

تقریباً بلافاصله، ایده دیگری به ذهن توسعه دهندگان مفهوم سرولت جاوا رسید. از آنجایی که ما در حال نوشتن یک servlet هستیم که وظیفه آن ارسال یک صفحه html به مشتری است، ممکن است درست تر باشد که بلافاصله این صفحه html را بنویسیم، و اگر به نوعی منطق در جاوا نیاز دارید، به سادگی آن را مستقیماً وارد کنید. به html اگر واضح‌تر نشد، ممکن است این عبارت کمک کند: یک صفحه jsp آنالوگ یک صفحه php است. دشوار؟ بعد دوباره توضیح میدم هنگام نوشتن یک صفحه در PHP چه کنیم؟ ما html ایستا داریم و زمانی که نیاز به درج هر منطقی مانند حلقه ها و شرایط در PHP داریم، آن را در بدنه تگ وارد می کنیم <?php … ?>. با jsp همه چیز یکسان است، فقط منطق در جاوا خالص نوشته شده است که کد آن در بدنه تگ درج شده است <% … %>. اجازه دهید یک بار دیگر به مفهوم servlet برگردیم. در اصل، یک صفحه JSP یک servlet است، اما کمی متفاوت نوشته شده است. در یک servlet معمولی، ما متدی می نویسیم که مقداری منطق را انجام می دهد و بر اساس نتایج آن، یک صفحه HTML برای مشتری ایجاد می کند. درست است که پس از مدتی، توسعه دهندگان servlet شروع به فکر کردن کردند: چه می شود اگر عملاً هیچ منطقی در روش وجود نداشته باشد و تقریباً فقط یک صفحه html تشکیل شود، آیا نوشتن فوری یک صفحه html در آن آسان تر نیست. کدی که حداقل درج جاوا ایجاد کنیم؟ خوب، آخرین نکته در مورد صفحات jsp. اولین باری که به چنین صفحه ای دسترسی پیدا می شود، در یک سرورلت کامپایل شده و سپس اجرا می شود. درخواست‌های بعدی به این صفحه jsp سریع‌تر خواهند بود زیرا قبلاً کامپایل شده و فقط باید اجرا شود.

ظرف سرولت

بنابراین ما یک کلاس servlet یا یک صفحه JSP نوشتیم. بعدش چی؟ چگونه آنها را به یک وب سرور، مثلاً apache، فشار دهیم تا بتواند آنها را به مرورگر وب کاربر ارسال کند؟ وب سرور فقط می تواند html ارسال کند و اگر صفحه ما مثلاً کد php داشته باشد، وب سرور ابتدا صفحه را از طریق مفسری که php را به html ترجمه می کند، عبور می دهد و تنها پس از آن نتیجه برای مشتری ارسال می شود. در مورد سرولت ها نیز همین اتفاق می افتد - قبل از ارسال، آنها باید اجرا شوند تا صفحه HTML ایجاد شود و کانتینر servlet دقیقاً همان چیزی است که وظیفه اجرای سرولت ها و کد صفحه jsp را بر عهده دارد. آن ها یک کانتینر servlet برای جاوا آنالوگ ماژول مفسر php در یک وب سرور است. بنابراین، هنگامی که کاربر آدرسی را در مرورگر وب وارد می کند، درخواست به وب سرور ارسال می شود، وب سرور متوجه می شود که یک servlet در حال درخواست است و درخواست را به ظرف servlet ارسال می کند. پس از این، کانتینر servlet سرولت را اجرا می کند، صفحه HTML حاصل را به وب سرور می فرستد، که به نوبه خود آن را به مشتری باز می گرداند. آیا یک کانتینر servlet می تواند به تنهایی اجرا شود، یعنی. بدون وب سرور؟ چیزی شبیه به تامکت قطعا می تواند. و اگر بخواهیم سایتی بسازیم که هیچ صفحه html دیگری به جز صفحات servlet نداشته باشد، یک کانتینر servlet برای ما کاملاً کافی است. اما اگر بخواهیم یک سایت را از servlets و مثلاً صفحات PHP ترکیب کنیم، باید یک وب سرور نصب کنیم. علاوه بر این، همه سرورهای وب به طور پیش فرض دارای یک کانتینر servlet نیستند، اما تقریباً همه به شما اجازه می دهند آن را به عنوان یک افزونه نصب کنید. بنابراین، اگر می‌خواهیم وب‌سایت خود را بر روی میزبانی اینترنت، جایی که آپاچی به احتمال زیاد اجرا می‌شود، راه‌اندازی کنیم، باید از ارائه‌دهنده بپرسیم که آیا کانتینر servlet متصل است یا خیر.

جاوا EE

به اصطلاح JavaSE (نسخه استاندارد جاوا) وجود دارد. این مفهوم شامل تمام کلاس ها می شود javaکه برای استفاده از آنها فقط باید آنها را وارد کنیم (مثلاً java.util.Date) یا حتی نیازی به انجام این کار نداریم (مثلاً Stringچون در بسته قرار دارد java.lang). و جاوا EE (نسخه سازمانی جاوا) وجود دارد. این کلاس ها نیز متعلق به Sun/Oracle هستند، اما تنها تفاوت این است که استفاده از آنها در پروژه دشوارتر است. یک خط ساده import…کافی نخواهد بود، زیرا... پروژه کامپایل نخواهد شد برای اصلاح وضعیت، باید فایل کتابخانه javaee.jar را پیدا کرده و آن را در پروژه قرار دهید. این را می توان از طریق ویژگی های پروژه در محیط توسعه انجام داد. اغلب گفته می شود که به این فرآیند اتصال می گویند: ثبت نام مستعار jar در مسیر ساخت یا مسیر کلاس پروژه.

سرور برنامه های کاربردی

حال تصور کنید که ما پروژه servlet خود را کامپایل کرده ایم که از Java EE استفاده می کند. همه چیز عالی است، اما اکنون باید کلاس های کامپایل شده خود را در یک ظرف سرولت قرار دهیم. فرض کنید آنها این کار را کردند. آیا برنامه ما کار خواهد کرد؟ پاسخ منفی است. هنگام دسترسی به servlet، استثناهایی ایجاد می شود که نشان می دهد برخی از کلاس ها یافت نشدند. چرا؟ زیرا ما کامپایلر را با لغزش "فریب دادیم" javaee.jar в classpath، یعنی. کامپایلر دید که کلاس‌های Java EE سر جای خود هستند و آرام شد، اما کانتینر servlet این کلاس‌ها را نمی‌بیند، اما پیوندهایی به آن‌ها را از سرولت ما می‌بیند. آیا این وضعیت در یک ظرف سرولت قابل حل است؟ البته بله، شما فقط باید فایل کتابخانه javaee.jar را به پوشه ای که servlet ما در ظرف servlet قرار دارد اضافه کنید . حالا تصور کنید که چنین پروژه هایی وجود داشته باشد و همه آنها در یک ظرف سرولت تامکت اجرا شوند. این بدان معنی است که شما باید این فایل jar را در پوشه هر servlet کپی کنید. این ناخوشایند و اشتباه است. این وضعیت با معرفی مفهوم سرور برنامه حل شد، که در آن این فایل مدت‌هاست در یک نسخه واحد قرار دارد و همه سرورلت‌ها می‌توانند به آن دسترسی داشته باشند و کپی خود را نداشته باشند. به نظر من خیلی راحت و منطقی است. طبیعتاً همه هیاهوها به خاطر یک فایل jar نیست (من آن را به عنوان مثال آوردم) - از این قبیل فایل ها زیاد است. اما این تمام چیزی نیست که سرورهای برنامه به ما می دهند. خود سرورهای برنامه می توانند اتصالات خود را با بسیاری از منابع، به عنوان مثال، پایگاه داده حفظ کنند. در این حالت، سرور ما ممکن است خود چنین اتصالی را باز نکند، بلکه آن را به سادگی از سرور برنامه بگیرد. در یک ظرف سرولت، این غیرممکن است، زیرا ... یک کانتینر تا حدی یک سرور برنامه حذف شده است. در یک کانتینر، یک servlet همیشه باید اتصالاتی را به خود پایگاه داده ایجاد کند. چیزی شبیه این ... war-archive آرشیو جنگ چیست؟ WAR آرشیو وب است. در واقع، این فقط یک فایل فشرده است، مانند هر jar. اساساً، این فقط راهی است که وب سایت ما را که از صفحات وب بسیاری، صفحات jsp و کلاس های servlet تشکیل شده است، در یک فایل فشرده جمع کنیم. web.xml web.xml به اصطلاح Deployment Descriptor است. این فایلی است که به طرز احمقانه ای توضیح می دهد که کدام درخواست خط مرورگر وب برای پردازش به کدام کلاس سرولت ارسال شود، تا ظرف سرولت گیج نشود، کدام سرور مسئول چه چیزی است. به طور کلی، در جاوا توصیف تنظیمات در انواع فایل های xml بسیار شیک است، اما اخیراً تمایل به دور شدن از این سنت وجود دارد. میپرسی چطور؟ و از طریق حاشیه نویسی. خود کلاس های حاشیه نویسی هیچ کاری انجام نمی دهند؛ آنها فقط برای توصیف انواع تنظیمات (متا داده) نه در یک فایل xml جداگانه، بلکه مستقیماً در کد ایجاد شده اند. خیلی راحت با این حال، اکنون یک مرحله میانی خاص وجود دارد، زمانی که برخی از تنظیمات با حاشیه نویسی و برخی با xml مشخص می شوند، و این می تواند گیج کننده باشد، زیرا شما به xml نگاه می‌کنید و یک تنظیم را می‌بینید، اما با توجه به حاشیه‌ها تنظیم دیگری وجود دارد. کدام یک بیشترین اولویت را دارد؟ کی میدونه…

نتیجه

با نوشتن این مطلب، فکر کردم که چنین بررسی سریع به کسی کمک نمی کند، زیرا ... حاوی هیچ گونه مشخصات و مثالی نیست، اما از طرف دیگر آنچه نوشته شده را پاک نکنید، پس بگذارید.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION