MVC في JSP (Archiبنية)

⚡ ملخص ذكي

يفصل نمط MVC في JSP وظائف التطبيق إلى طبقات النموذج والعرض والتحكم، حيث يقوم JSP بعرض الواجهة، ويعمل Servlet كوحدة تحكم، و Javaتقوم Beans بتغليف النموذج لتطبيقات الويب النظيفة والقابلة للاختبار والصيانة.

  • 🧱 فصل الاهتمامات: يحتوي النموذج على البيانات ومنطق الأعمال، ويقوم العرض بعرض واجهة المستخدم، ويقوم المتحكم بتوجيه الطلبات بينهما.
  • 📐 دور JSP: تقوم صفحات JSP بعرض ترميز ديناميكي لطبقة العرض بينما يقوم Servlet بمعالجة الطلبات على طبقة التحكم.
  • 🔀 مسار الطلب: يقوم المتصفح بإرسال نموذج، ويقوم سيرفلت بالتحقق من صحة المدخلات، ثم يقوم بتعبئة النموذج. Javaيقوم Bean بعد ذلك بإعادة توجيه التحكم إلى عرض JSP للحصول على الاستجابة.
  • ✅ سهولة الصيانة هي الأهم: تُسهّل بنية MVC في JSP صيانة تطبيقات الويب وتوسيعها واختبارها واختبارها المركزي.
  • 🧪 مثال العمل: يتم إرسال نموذج تسجيل الدخول إلى Mvc_servlet، الذي يقوم بتخزين البريد الإلكتروني وكلمة المرور في TestBean، ثم يقوم بإعادة التوجيه إلى mvc_success.jsp.
  • 🤖 تحديث الذكاء الاصطناعي: تساعد الآن مساعدات الذكاء الاصطناعي في إعادة هيكلة كود JSP MVC القديم إلى Spring MVC، وإنشاء وحدات التحكم، وDTOs، والاختبارات عند الطلب.

MVC في JSP (Archiبنية)

ما هو MVC؟

يرمز MVC إلى نمط تصميم البرمجيات Model-View-Controller، وهو نمط يفصل التطبيق إلى ثلاث طبقات مترابطة: منطق الأعمال، والعرض، والبيانات. في نمط MVC:

  • M يرمز إلى موديل
  • V يرمز إلى View
  • C يرمز إلى وحدة التحكم

نمط MVC هو منهجية منظمة لبناء التطبيقات، حيث يبدأ تدفق البيانات من طبقة العرض (View). يُرسل المستخدم الطلب، ثم تُعالجه طبقة المتحكم (Controller)، ويُرسله إلى طبقة النموذج (Model) لإدخال البيانات أو جلبها. بعد ذلك، يُعيد النموذج استجابة بنجاح أو فشل، تُعرضها طبقة العرض للمستخدم. يوضح الشكل أدناه مخطط بنية MVC:

MVC Architecture
MVC Archiمخطط فني

لماذا نستخدم نمط MVC؟ Archiبنية في JSP؟

قبل القفزping لفهم كيفية عمل نمط MVC في JSP، من المفيد معرفة سبب اعتماد المطورين لهذا النمط. فدمج منطق الأعمال واستدعاءات قواعد البيانات وHTML داخل صفحة JSP واحدة ينتج عنه بسرعة شيفرة معقدة يصعب صيانتها. يحل نمط MVC هذه المشكلة من خلال تخصيص طبقة مستقلة لكل وظيفة.

  • Code يصبح من الأسهل قراءته لأن كل ملف له مسؤولية واحدة.
  • يمكن للفرق العمل على العرض، ووحدة التحكم، والنموذج بالتوازي دون حدوث تعارضات.
  • تستهدف اختبارات الوحدة النموذج بشكل مباشر، دون المساس بعرض JSP.
  • مبادلةping يُعد إنشاء عرض JSP لاستجابة JSON أو محرك قوالب مختلف أمرًا بسيطًا.

كيف يعمل نمط MVC في JSP؟

في تطبيق MVC القائم على JSP، ترتبط كل طبقة بوظيفة محددة Java التكنولوجيا. تقوم ملفات JSP بعرض الواجهة، ويعمل Servlet كوحدة تحكم، و Javaتُغلف المكونات النموذج. تشرح الأقسام التالية مسؤوليات كل طبقة.

طبقة النموذج

  • هذه هي طبقة البيانات التي تحتوي على منطق العمل الخاص بالنظام.
  • وهي تتضمن جميع بيانات التطبيق.
  • كما أنه يمثل حالة التطبيق.
  • تم بناؤه من Javaالكائنات أو الكائنات الافتراضية التي تتصل بـ قاعدة بيانات.
  • يتواصل المتحكم مع النموذج لجلب البيانات ويرسلها إلى طبقة العرض.
  • يتصل النموذج بقاعدة البيانات ويخزن البيانات فيها.

عرض الطبقة

  • هذه هي طبقة العرض الخاصة بالتطبيق.
  • يتكون من HTML و JSP و CSS و Javaالنصي.
  • وهو يعرض عادةً واجهة المستخدم الخاصة بالتطبيق.
  • يعرض البيانات التي يتم جلبها من وحدة التحكم، والتي بدورها تجلب البيانات من فئات طبقة النموذج.
  • تقوم طبقة العرض بعرض البيانات على واجهة المستخدم الخاصة بالتطبيق دون أن تحتوي على منطق الأعمال.

طبقة التحكم

  • يعمل كواجهة بين العرض والنموذج.
  • يعترض جميع الطلبات الواردة من طبقة العرض.
  • يستقبل الطلبات من طبقة العرض، ويعالجها، ويجري التحقق من صحة الطلب.
  • يتم توجيه الطلب إلى طبقة النموذج لمعالجة البيانات. وبمجرد معالجة الطلب، يرسل النموذج النتيجة مرة أخرى إلى وحدة التحكم مع المعلومات المطلوبة، والتي تعرضها واجهة المستخدم بعد ذلك.

مزايا MVC Architecture

مزايا MVC هي:

  • سهلة الصيانة
  • سهل التمديد
  • سهل الاختبار
  • التحكم في الملاحة مركزي
  • يؤدي الترابط غير المحكم بين الطبقات إلى جعل عملية إعادة الهيكلة أكثر أمانًا
  • التطوير المتوازي من قبل أعضاء الفريق المتعددين ممكن

مثال لتصميم تطبيق JSP مع MVC Architecture

في هذا المثال، سنوضح كيفية استخدام بنية MVC في تطبيق JSP.

  • سنأخذ مثالاً على نموذج يحتوي على متغيرين، "البريد الإلكتروني" و "كلمة المرور"، واللذان يمثلان طبقة العرض الخاصة بنا.
  • بمجرد أن يقوم المستخدم بإدخال البريد الإلكتروني وكلمة المرور والنقر على "إرسال"، يتم تمرير الإجراء إلى Mvc_servlet حيث يتم تمرير البريد الإلكتروني وكلمة المرور.
  • Mvc_servlet هي طبقة التحكم. هنا في Mvc_servlet، يتم إرسال الطلب إلى كائن bean الذي يعمل كطبقة النموذج.
  • يتم تعيين قيم البريد الإلكتروني وكلمة المرور في الكائن وتخزينها لاستخدامها لاحقًا.
  • يتم جلب القيمة من الكائن وعرضها في طبقة العرض.

Mvc_example.jsp (عرض)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>MVC Guru Example</title>
</head>
<body>
<form action="Mvc_servlet" method="POST">
Email: <input type="text" name="email">
<br />
Password: <input type="text" name="password" />
<input type="submit" value="Submit" />
</form>
</body>
</html>

شرح الكود:

عرض الطبقة:

Code السطر 10-15: هنا نأخذ نموذجًا يحتوي على حقلين كمعاملات، "البريد الإلكتروني" و"كلمة المرور"، ويجب توجيه هذا الطلب إلى وحدة تحكم، Mvc_servlet.java، والتي يتم تمريرها في خاصية الإجراء. طريقة HTTP المستخدمة هي POST.

Mvc_servlet.java (وحدة التحكم)

package demotest;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Mvc_servlet
 */
public class Mvc_servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Mvc_servlet() {
        super();
        // TODO Auto-generated constructor stub
    }


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String email=request.getParameter("email");
        String password=request.getParameter("password");

        TestBean testobj = new TestBean();
        testobj.setEmail(email);
        testobj.setPassword(password);
        request.setAttribute("gurubean",testobj);
        RequestDispatcher rd=request.getRequestDispatcher("mvc_success.jsp");
        rd.forward(request, response);
	}

}

شرح الكود:

طبقة التحكم:

Code خط 14: Mvc_servlet هو امتداد لـ HttpServlet.

Code خط 26: بما أن الطريقة المستخدمة هي POST، فإن الطلب يدخل إلى طريقة doPost الخاصة بـ Servlet، والتي تعالج الطلب وتحفظه في كائن bean باسم testobj.

Code خط 34: باستخدام كائن الطلب، نقوم بتعيين السمة "gurubean" التي يتم تعيين قيمة لها لـ testobj.

Code خط 35: هنا نستخدم كائن RequestDispatcher لإعادة توجيه رسالة النجاح إلى mvc_success.jsp.

TestBean.java (النموذج)

package demotest;

import java.io.Serializable;

public class TestBean implements Serializable{

	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	private String email="null";
	private String password="null";


}

شرح الكود:

طبقة النموذج:

Code السطر 7-17: يحتوي على دوال الوصول والتعيين للبريد الإلكتروني وكلمة المرور وهما عضوان في فئة TestBean.

Code السطر 19-20: يحدد هذا العنصر البريد الإلكتروني وكلمة المرور للأعضاء من نوع String في فئة الكائن.

Mvc_success.jsp (عرض النتائج)

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@page import="demotest.TestBean"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Success</title>
</head>
<body>
<%
TestBean testguru=(TestBean)request.getAttribute("gurubean");
out.print("Welcome, "+testguru.getEmail());
%>
</body>
</html>

شرح الكود:

Code خط 12: نقوم باسترداد السمة باستخدام كائن الطلب الذي تم تعيينه في طريقة doPost الخاصة بـ Servlet.

Code خط 13: نقوم بطباعة رسالة الترحيب ومعرف البريد الإلكتروني الذي تم حفظه في كائن Bean.

الناتج

عند تنفيذ الكود أعلاه، ستحصل على الناتج التالي:

عند فتح ملف mvc_example.jsp، ستظهر لك الاستمارة التي تحتوي على حقول البريد الإلكتروني وكلمة المرور وزر الإرسال.

بمجرد إدخال البريد الإلكتروني وكلمة المرور في النموذج والنقر على "إرسال":

تصميم تطبيق JSP

بعد النقر على "إرسال"، ستظهر النتيجة كما يلي:

تصميم تطبيق JSP

عند إدخال البريد الإلكتروني وكلمة المرور على الشاشة والنقر على "إرسال"، يتم حفظ البيانات في TestBean. ومن TestBean، يتم استرجاعها في الشاشة التالية لعرض رسالة النجاح. JSP يؤدي دور عرض البيانات وتوفير واجهة المستخدم، بينما يعمل السيرفلت كوحدة تحكم و Javaيُستخدم Bean كنموذج. ويحتوي هذا النموذج على منطق العمل الرئيسي.

الأسئلة الشائعة

MVC في JSP هو نمط تصميم يقسم تطبيق الويب إلى ثلاث طبقات: النموذج (البيانات ومنطق الأعمال)، والعرض (صفحات JSP التي تعرض واجهة المستخدم)، ووحدة التحكم (Servlet الذي يعالج الطلبات ويوجه الاستجابات).

ينتمي JSP بشكل أساسي إلى طبقة العرض لأنه يقوم بعرض صفحات HTML ديناميكية للمستخدم. في نمط JSP Model 2، يتولى Servlet دور المتحكم. Javaتتولى الفاصوليا دور النموذج، احتفظping JSP خالٍ من منطق الأعمال.

يضع النموذج الأول منطق الأعمال، والوصول إلى البيانات، والعرض داخل صفحات JSP مباشرةً. أما النموذج الثاني فيتبع نمط MVC: حيث يعمل Servlet كوحدة تحكم. Javaتُشكّل المكونات البرمجية النموذج، بينما تقوم ملفات JSP بعرض الواجهة. النموذج الثاني هو الأسلوب المُوصى به.

يُحسّن نمط MVC من سهولة الصيانة والاختبار وإنتاجية الفريق. تتطور كل طبقة بشكل مستقل، وتبقى منطق الأعمال خارج ملفات JSP، ويتم تركيز التنقل في Servlet، وتغطي اختبارات الوحدة النموذج دون الحاجة إلى تشغيل حاوية ويب.

يقوم المتصفح بإرسال نموذج إلى سيرفلت. يقوم السيرفلت بالتحقق من صحة المدخلات، وإنشاء أو تحديث Javaيقوم الكائن Bean بتخزينه كخاصية طلب. ثم يقوم بتحويل التحكم إلى صفحة JSP، التي تقرأ الكائن Bean وتعرض الاستجابة.

تقوم برامج الذكاء الاصطناعي المساعدة في البرمجة بتحليل ملفات Servlets وJSP القديمة، على سبيل المثالtracدمج منطق الأعمال في خدمات نظيفة، وإنشاء وحدات تحكم Spring MVC وDTOs، وإنتاج JUnit الاختبارات. هذا يُسرّع عملية الانتقال من JSP Model 2 إلى الأطر الحديثة مع تقليل إعادة الكتابة اليدوية.

أدوات الذكاء الاصطناعي تُنشئ وحدات تحكم Spring MVC، وتُولد خريطة الطلبpingيقترحون تعليقات التحقق، ويكتبون قوالب Thymeleaf، وينشئون اختبارات التكامل. كما يكتشفون المشكلات الأمنية مثل غياب حماية CSRF أو معالجة المدخلات غير الآمنة في أساليب وحدة التحكم.

تلخيص هذه التدوينة بـ: