From c7491904e4c88c685b9062a5aaf7bdce1950088e Mon Sep 17 00:00:00 2001 From: mohammadmahdihn <79263995+mohammadmahdihn@users.noreply.github.com> Date: Sun, 2 Feb 2025 20:36:03 +0330 Subject: [PATCH 1/4] Create README.md [Spring Mvc] [Author] Add README.md --- Spring Mvc/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Spring Mvc/README.md diff --git a/Spring Mvc/README.md b/Spring Mvc/README.md new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Spring Mvc/README.md @@ -0,0 +1 @@ + From e07e5969ebee07c8fec9dc40ce4936a6fb2b9a50 Mon Sep 17 00:00:00 2001 From: mohammadmahdihn <79263995+mohammadmahdihn@users.noreply.github.com> Date: Sun, 2 Feb 2025 20:38:09 +0330 Subject: [PATCH 2/4] [Spring Mvc] [Author] Update README.md --- Spring Mvc/README.md | 122 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) diff --git a/Spring Mvc/README.md b/Spring Mvc/README.md index 8b137891..efca6585 100644 --- a/Spring Mvc/README.md +++ b/Spring Mvc/README.md @@ -1 +1,123 @@ +
+ +## Spring MVC + +## مقدمه +در دنیای توسعه وب، نیاز به فریمورکی وجود دارد که توسعه نرم‌افزارهای تحت وب را ساده، ماژولار و قابل نگهداری کند. فریمورک **Spring MVC** یک راهکار جامع برای ایجاد برنامه‌های کاربردی تحت وب در زبان جاوا ارائه می‌دهد. این فریمورک به توسعه‌دهندگان کمک می‌کند تا برنامه‌هایی با قابلیت جداسازی وظایف، سهولت در تست و مدیریت بهتر کد ایجاد کنند. + +## مشکلاتی که Spring MVC حل می‌کند: +- پیچیدگی در مدیریت درخواست‌ها و پاسخ‌ها در برنامه‌های بزرگ +- نیاز به معماری منعطف و مقیاس‌پذیر برای برنامه‌های تحت وب +- دشواری در تست و نگهداری کدهای مرتبط با توسعه وب +- عدم امکان جداسازی مناسب بین منطق تجاری و لایه نمایشی + +## معرفی Spring MVC +**Spring MVC** یکی از ماژول‌های اصلی فریمورک Spring است که برای توسعه برنامه‌های وب مبتنی بر معماری **Model-View-Controller (MVC)** طراحی شده است. این فریمورک امکاناتی همچون مدیریت درخواست‌ها، پیاده‌سازی کنترلرها، مدل داده، قالب‌بندی پاسخ‌ها و قابلیت یکپارچه‌سازی با سایر تکنولوژی‌های تحت وب را ارائه می‌دهد. + +### معماری MVC در Spring +![img_2.png](img_2.png) +- **Model (مدل):** داده‌های برنامه را مدیریت می‌کند و تعامل بین داده‌ها و منطق تجاری را تسهیل می‌کند. +- **View (نما):** اطلاعات را به کاربر نمایش می‌دهد و می‌تواند از قالب‌هایی مانند **Thymeleaf، JSP** یا **FreeMarker** استفاده کند. +- **Controller (کنترلر):** درخواست‌ها را پردازش کرده و بین مدل و نما واسطه می‌شود، و ارتباط بین بخش‌های مختلف برنامه را مدیریت می‌کند. +- **Front Controller:** در **Spring Web MVC**، کلاس `DispatcherServlet` به عنوان کنترل‌کننده اصلی عمل می‌کند که مسئول مدیریت جریان برنامه است. + +## Dispatcher Servlet + + +Dispatcher Servlet کنترل‌کننده اصلی است که فرآیند کامل پردازش درخواست‌ها و پاسخ‌ها را مدیریت می‌کند. حالا سوال این است که کنترل‌کننده اصلی (Front Controller) چیست؟ + +این بسیار ساده است، همان‌طور که از نامش پیداست، +زمانی که هر درخواستی به وب ارسال می‌شود، درخواست‌ها ابتدا به کنترل‌کننده اصلی که همان Dispatcher Servlet است می‌رسند. کنترل‌کننده اصلی اولین نقطه‌ای است که درخواست‌ها به آن می‌رسند، به همین دلیل نامش چنین است. پس از دریافت درخواست‌ها، Dispatcher Servlet درخواست‌ها را دریافت کرده و تصمیم می‌گیرد که کدام کنترل‌کننده مناسب برای پردازش این درخواست‌ها است. سپس آن‌ها را به کنترل‌کننده مناسب ارسال می‌کند. + +`DispatcherServlet` اولین نقطه دریافت درخواست‌های HTTP در Spring MVC است. این کنترل‌کننده اصلی: +1. درخواست‌ها را دریافت کرده و بررسی می‌کند. +2. کنترل‌کننده مناسب را برای پردازش درخواست پیدا می‌کند. +3. پاسخ مناسب را از `View Resolver` دریافت کرده و نمایش می‌دهد. + +![img_4.png](img_4.png) +## مزایا و معایب Spring MVC +### مزایا +- **این فریمورک از یک سرویس سبک برای توسعه و استقرار برنامه‌ها استفاده می‌کند** +- **امکان توسعه سریع و موازی را فراهم می‌کند** +- **توسعه برنامه سریع‌تر می‌شود.** +- **همکاری میان توسعه‌دهندگان مختلف آسان‌تر است.** +- **به‌روزرسانی برنامه ساده‌تر است.** +- **اشکال‌زدایی راحت‌تر است زیرا چندین سطح در برنامه وجود دارد.** + +### معایب +- **پیچیدگی بالا:** یادگیری و پیاده‌سازی نیاز به تجربه بیشتری دارد. +- **نامناسب برای برنامه‌های کوچک:** ممکن است باعث افزایش پیچیدگی در پروژه‌های ساده شود. + +## ویژگی‌های کلیدی Spring MVC + +- **جداسازی در:** Spring MVC با پیروی از الگوی MVC، جداسازی منطق تجاری، داده و نمایش را تسهیل می‌کند. +- **استفاده از Annotation:** برای کاهش پیچیدگی در پیکربندی برنامه، از Annotation‌هایی مانند `@Controller`، `@RequestMapping` و `@RestController` استفاده می‌شود. +- **پشتیبانی از RESTful APIs:** امکان پیاده‌سازی آسان APIهای RESTful را فراهم می‌کند. +- **یکپارچگی با سایر ماژول‌های Spring:** مانند Spring Security، Spring Data و Spring Boot. +- **پشتیبانی از قالب‌های مختلف نمایش:** مانند JSON، XML، و HTML. + +## مثال استفاده از Spring MVC +یک مثال ساده برای نمایش پیام "Hello World": +
+ +```java +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +@Controller +public class HelloController { + @GetMapping("/hello") + @ResponseBody + public String sayHello() { + return "Hello World"; + } +} +``` +
+ +### پیکربندی Spring Boot +برای اجرای این پروژه، از **Spring Boot** استفاده می‌کنیم. در **pom.xml** برای پروژه‌های **Maven**، وابستگی زیر را اضافه کنید: +
+ +```xml + + org.springframework.boot + spring-boot-starter-web + +``` +
+ +### اجرای پروژه +پس از راه‌اندازی سرور، کاربر می‌تواند با مراجعه به `http://localhost:8080/hello` پیام **Hello World** را مشاهده کند. + +## نتیجه‌گیری +Spring MVC یکی از محبوب‌ترین فریمورک‌های توسعه وب در دنیای جاوا است که به توسعه‌دهندگان امکان می‌دهد **برنامه‌های تحت وب ماژولار، خوانا و قابل نگهداری** ایجاد کنند. با استفاده از این فریمورک، پیاده‌سازی **الگوی MVC** ساده‌تر شده و فرآیند توسعه و نگهداری نرم‌افزارهای تحت وب بهبود می‌یابد. + +## منابع +
+ +1. [Spring Framework Documentation](https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html) +2. [Baeldung - Spring MVC Tutorial](https://www.baeldung.com/spring-mvc-tutorial) +3. [JavaTpoint - Spring MVC](https://www.javatpoint.com/spring-mvc-tutorial) +4. [GeeksforGeeks - Spring MVC](https://www.geeksforgeeks.org/spring-mvc-framework/) + + +
+ +##نویسندگان: +1. دنیا روشن ضمیر + +2. علیرضا فرودنیا + +3. محمد مهدی حیدری نسب +
+ +
+ +##لینک ویدیو آموزش +
+ +https://drive.google.com/file/d/1rdWIPE0jTJ5_F8g2ZeqdA9Y_Sbnj1t7z/view?usp=sharing + From b2368b4bac43a51df92da67fd86eba9303d57873 Mon Sep 17 00:00:00 2001 From: mohammadmahdihn <79263995+mohammadmahdihn@users.noreply.github.com> Date: Sun, 2 Feb 2025 20:40:15 +0330 Subject: [PATCH 3/4] [Spring Mvc] [Author] Add images --- Spring Mvc/img_2.jpeg | Bin 0 -> 26289 bytes Spring Mvc/img_4.jpeg | Bin 0 -> 26644 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Spring Mvc/img_2.jpeg create mode 100644 Spring Mvc/img_4.jpeg diff --git a/Spring Mvc/img_2.jpeg b/Spring Mvc/img_2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..083d6d8818a89261bea6542399e1b9ca7e7b548a GIT binary patch literal 26289 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 literal 0 HcmV?d00001 From 800ec46af302a6820e10bb3927f8e50f3f96237a Mon Sep 17 00:00:00 2001 From: mohammadmahdihn <79263995+mohammadmahdihn@users.noreply.github.com> Date: Sun, 2 Feb 2025 20:41:03 +0330 Subject: [PATCH 4/4] [Spring Mvc] [Author] Update README.md --- Spring Mvc/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Spring Mvc/README.md b/Spring Mvc/README.md index efca6585..4898d5cd 100644 --- a/Spring Mvc/README.md +++ b/Spring Mvc/README.md @@ -16,7 +16,7 @@ **Spring MVC** یکی از ماژول‌های اصلی فریمورک Spring است که برای توسعه برنامه‌های وب مبتنی بر معماری **Model-View-Controller (MVC)** طراحی شده است. این فریمورک امکاناتی همچون مدیریت درخواست‌ها، پیاده‌سازی کنترلرها، مدل داده، قالب‌بندی پاسخ‌ها و قابلیت یکپارچه‌سازی با سایر تکنولوژی‌های تحت وب را ارائه می‌دهد. ### معماری MVC در Spring -![img_2.png](img_2.png) +![img_2.png](img_2.jpeg) - **Model (مدل):** داده‌های برنامه را مدیریت می‌کند و تعامل بین داده‌ها و منطق تجاری را تسهیل می‌کند. - **View (نما):** اطلاعات را به کاربر نمایش می‌دهد و می‌تواند از قالب‌هایی مانند **Thymeleaf، JSP** یا **FreeMarker** استفاده کند. - **Controller (کنترلر):** درخواست‌ها را پردازش کرده و بین مدل و نما واسطه می‌شود، و ارتباط بین بخش‌های مختلف برنامه را مدیریت می‌کند. @@ -35,7 +35,7 @@ Dispatcher Servlet کنترل‌کننده اصلی است که فرآیند ک 2. کنترل‌کننده مناسب را برای پردازش درخواست پیدا می‌کند. 3. پاسخ مناسب را از `View Resolver` دریافت کرده و نمایش می‌دهد. -![img_4.png](img_4.png) +![img_4.png](img_4.jpeg) ## مزایا و معایب Spring MVC ### مزایا - **این فریمورک از یک سرویس سبک برای توسعه و استقرار برنامه‌ها استفاده می‌کند**