JavaRush /وبلاگ جاوا /Random-FA /چکمه بهار Conquest
Surplus
مرحله
Москва

چکمه بهار Conquest

در گروه منتشر شد
روز بخیر، خواننده عزیز! و از آشنایی با شما خوشحالم، حتی اگر نام پر زرق و برق دلیل اصلی بررسی موضوع ساده در مورد اولین آشنایی با توسعه Spring Boot باشد. من می خواهم تجربه خود را از تکمیل تکلیف مقدماتی برای کارآموزی در پورتال JavaRush با ارائه یک نمای کلی از سمت یک دانشجوی دانشگاه فنی کاملاً معمولی که می خواهد قدرت دانش انباشته خود را آزمایش کند به اشتراک بگذارم. چکمه بهار فتح - 1من به هیچ وجه منکر وجود بی ادبی در کد یا روش فکری پیوست نمی شوم و از انتقاد سازنده استقبال می کنم، زیرا به لطف "برآمدگی ها و کبودی ها" است که می توان در جهت حرفه ای توسعه داد. علاوه بر این، من به هیچ وجه تظاهر نمی کنم که در حل شرایط داده شده "نوش جان" هستم و عمداً بخش های جداگانه برنامه را حذف می کنم و اهمیت کلیدی ورود به یک موضوع نسبتاً پیچیده را بدون کوچکترین پیامد برای سیستم عصبی باقی می گذارم. درست است، انکار بدیهیات بی پروا است: برای من سخت بود و مطلقاً تا لحظه ای مشخص هیچ چیز مشخص نبود. و اگر از اولین ملاقات با این کار احساسات مشابهی را تجربه کردید، "خوش آمدید!" بیایید یک برنامه وب در Spring Boot با استفاده از یک قیاس ساده از آزمون ورودی کارآموزی با استفاده از موتور قالب Thymeleafو queryپرس و جو به سرور محلی MySQL بنویسیم تا آرایه اطلاعات ورودی را فیلتر کند. پس بیایید شروع کنیم!

چکمه بهاره. چه نوع حیوانی است و چگونه آن را بپزیم؟

به طور خلاصه و مختصر، این یک ابزار عالی از Pivotel برای صرفه جویی در زمان با ارزش در فرآیند ایجاد یک برنامه، حذف نیاز به اتصال مستقیم کتابخانه های شخص ثالث، نوشتن یک بوم نقشه برداری چشمگیر و servlets است. کافی است از سازنده Spring Initializr استفاده کنید که در IntelliJ IDEA Ultimate Edition (فایل - جدید - پروژه... - Spring Initializr) ادغام شده است یا در وب سرویس start.spring.io قرار دارد و بسته هایی را برای گنجاندن از طیف گسترده ای از موارد مشخص می کند. ارائه می دهد.
چکمه بهار فتح - 2
با توجه به مشخصات فنی ارائه شده، ما از مجموعه جنتلمن استاندارد برای ایجاد یک برنامه وب ساده با استفاده از پایگاه داده MySQL استفاده خواهیم کرد :
  • WEB جزء اصلی برای توسعه یک برنامه وب است، از جمله یک سرور محلی آپاچی تامکت در آدرس استاندارد localhost:8080 و چارچوب جهانی Spring MVC.

  • DevTools - برای راه اندازی مجدد سریع برنامه در یک JVM داغ هنگامی که تغییرات در کد یا قالب های کامپایل شده شناسایی می شود استفاده می شود. علاوه بر این، اگر موتور انتخاب شده در پروژه گنجانده شود، Thymeleaf را از پاک کردن کش آزاد می کند.

  • JPA یک فناوری مورد نیاز برای کار با پایگاه‌های داده است و نگاشت شی رابطه‌ای از اشیاء جاوا را فراهم می‌کند، یک API ( در مورد ما Hibernate ) برای مدیریت، ذخیره و بازیابی موجودیت‌ها ارائه می‌دهد.

  • Thymeleaf (سبیل، AngularJS، Vaadin و فراتر از آن) - موتور قالب برای تجسم برنامه؛ به لطف آشنایی نسبی من با اصول html، Thymeleaf را انتخاب کردم که زبان را به سنگ بنای دنیا رساند.

  • MySQL - درایورهای اتصال به پایگاه داده جاوا را برای اجرای پرس و جوهای SQL در برابر پایگاه داده متصل می کند.
پس از انتخاب نهایی کامپوننت ها و ایجاد، یک معماری نرم افزار وب معمولی با دایرکتوری های آماده برای پر کردن بیشتر دریافت می کنیم. قطعات برای تعامل با بخش بصری، اعم از سبک های گرافیکی CSS، صفحات استاندارد HTML یا عملکرد جاوا اسکریپت، باید در "منابع" قرار گیرند، و بر این اساس، جزء back-end در "جاوا" قرار می گیرد. همچنین باید به فایل pom.xml در محدوده ریشه توجه کنیم که ساختار پروژه و وابستگی های بین اجزا را ذخیره می کند. اگر می خواهید عملکرد را با بسته های اضافی گسترش دهید یا چیزهای غیر ضروری را حذف کنید، باید دستکاری بین برچسب ها را <dependencies></dependencies>طبق روش مشابه انجام دهید.
چکمه بهار فتح - 3

اولین قدم ها به سوی آینده ای عالی

بعد، یک سوال نسبتاً جالب و کاملاً منطقی مطرح می شود: "حالا چه باید کرد؟ این چگونه کار خواهد کرد؟ این برنامه بر اساس اصول Model-View-Controller ساخته شده است: خواندن موجودیت ها را از پایگاه داده متصل (Model) سازماندهی می کند و در رابط کاربری با کنترل ها (View) نمایش داده می شود. ارتباط بین اجزا و اجرای اقدامات بر اساس درخواست های ارسالی به لطف کنترلر انجام می شود. این ایجاد عناصر کلیدی است که به عنوان نقطه مرجع برای توسعه مداوم عمل می کند. به منظور جلوگیری از لغزندگی و حفظ احترام رفقای خود در زمینه کاری، باید اجزاء را در دایرکتوری های مناسب قرار دهید (مثلاً فایل Controller را در پوشه کنترلرها در شاخه جاوا قرار دهید) و با دقت نگهداری کنید. در محل کار سفارش دهید

ذات بخش کوچکی از یک مکانیسم بزرگ است

یا به عبارتی مدل ما با توجه به شرایط تعیین شده در مسئله. با خروج از موضوع بحث و بازگشت به پروژه مقدماتی، می‌توانیم با اطمینان ادعا کنیم که تفاوت‌های حداقلی بین وظایف وجود دارد و در بررسی بیشتر به مفهوم متوسط ​​پایبند باشیم. بیایید بگوییم، یادداشت هایی در یک دفترچه یادداشت، از جمله:
  • شماره شناسایی برای تعیین مکان در جریان عمومی.
  • یک پیام متنی از تعداد معینی از کاراکترها؛
  • تاریخی که کاربر آن را به لیست کلی اضافه کرده است.
  • یک متغیر بولی برای تعیین «انجام یا انجام نشد» («خوانده یا خوانده نشده»).
بنابراین، بیایید یک کلاس Note در دایرکتوری به نام "entity" ایجاد کنیم و فیلدهای مناسب را اضافه کنیم:
@Entity
public class Note {

   @Id
   @GeneratedValue
   private int id;
   private String message;
   private Date date;
   private boolean done;

   public Note() {
   }

   public Note(String message) {
       this.message = message;
       this.date = new Date();
       this.done = false;
   }
}
یک انحراف دیگر از موضوع بحث برای درک بیشتر آنچه در حال وقوع است از موضع نظری. ارتباط بین مؤلفه ها در Spring با حاشیه نویسی مشخص می شود - نشانگرهای ویژه در جلوی اشیا، که هر کدام نقش خاصی را در مکانیسم ایفا می کنند و با نماد "@" شروع می شوند. حاشیه نویسی @Entity به Spring Boot نشان می دهد که داده های کلاس بعدی متعلق به "Entity" است، و @Id و @GeneratedValue فیلد انتخابی را به عنوان شناسه با تولید خودکار یک تکرار کننده هنگام پردازش آرایه ای از اطلاعات مشخص می کنند. من عمداً اضافه کردن Getter و Setter استاندارد را برای افزایش فشرده‌سازی فرمت بصری حذف می‌کنم. در مرحله بعد، با در نظر گرفتن استفاده از پایگاه داده برای ذخیره رکوردها، به مرحله بعدی در توسعه برنامه می رویم: رابط NoteRepository را در فهرست "repository" ایجاد می کنیم، یک عنصر اتصال در زنجیره تبادل، و بیشترین ارث را به ارث می بریم. مخزن مناسب برای کار بیشتر، که نشان دهنده موجودیت ذخیره شده و تکرار کننده عدد صحیح برای دسترسی است.
public interface NoteRepository extends JpaRepository<Note, Integer> {
}
در واقع، این همه است. مختصر و مختصر. اکنون Spring Boot از مؤلفه ایجاد شده برای سازماندهی تعاملات با پایگاه داده استفاده می کند. انواع نسبتا زیادی از مخازن قدیمی با پتانسیل متفاوت برای عمل وجود دارد. JpaRepository در بالای نردبان قرار دارد و بیشترین پتانسیل را دارد، از جمله CrudRepository و PageAndSortingRepository زیر آن. ما بیشتر از این نمی رویم و از موضوع منحرف نمی شویم، زیرا برخی از ظرافت ها را می توان در وب سایت Pivotel در اسناد فنی یافت. حال، پس از پیاده‌سازی تصویر داده‌ها و مشخص کردن روش‌های ارتباطی در سمت برنامه، باید به ایجاد پایگاه داده MySQL در محیط خارجی مناسب «MySQL Workbench» از پیش نصب شده روی پلت فرم دسکتاپ در یک اسمبلی از توسعه‌دهنده رسمی توجه کنید. با بسته های اضافی برای ایجاد یک سرور محلی:
چکمه بهار فتح - 4
در مرحله بعد، با پیروی از دستورالعمل های محیط پس از کلیک بر روی نماد با سرور محلی فعلی در پنجره اصلی، نمودار جدولی را مطابق فیلدهای موجودیت خود (Note) ایجاد می کنیم و آن را با داده های مناسب پر می کنیم. لازم است به طور جداگانه ظرافت های گویش MySQL را روشن کنیم که برای رسیدن به نتیجه مطلوب نیاز فوری به توجه دارد:
  • هیچ نوع Boolean جداگانه ای وجود ندارد. هر اقدام پردازش درخواست به ترتیب "درست" یا "نادرست" را به مقدار بیت "1" یا "0" تبدیل می کند.
  • تاریخ به طور کامل در نوع Timestamp ذخیره می شود. اگر از Date استفاده می کنید، که در اصل آشناست، باید خود را فقط به موقعیت در تقویم محدود کنید.
چکمه بهار فتح - 5
پس از تکمیل نهایی مراحل مقدماتی، ما "MySQL Workbench" را برای ارسال داده ها به سرور محلی با کلیک بر روی نماد "رعد و برق" در نوار ابزار نشان می دهیم. اکنون، اگر افزودن اطلاعات به درستی تکمیل شده باشد، می‌توانیم با اطمینان به IDE اصلی خود بازگردیم تا با افزودن پیکربندی پایگاه داده فعلی به application.properties (معمولاً در دایرکتوری Resources) به توسعه ادامه دهیم:
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
و در نهایت با استفاده از حاشیه نویسی، موجودیت Note را به MySQL متصل کنید. @Table نشان دهنده استفاده از جدول با نام و طرح انتخابی است و @Column نشان می دهد که متغیرها به یک فیلد خاص تعلق دارند.
@Entity
@Table(name = "test", schema = "test", catalog = "")
public class Note {

   @Id
   @GeneratedValue
   private int id;
   @Column(name = "message")
   private String message;
   @Column(name = "date")
   private Date date;
   @Column(name = "done")
   private boolean done;

   public Note() {
   }

   public Note(String message) {
       this.message = message;
       this.date = new Date();
       this.done = false;
   }
}

مشاهده یا رابط کاربری

افسوس، می توانیم با خیال راحت این موارد را بگوییم: "تجسم برنامه بدون کوچکترین دانش نظری یا عملی به سنگ مانع اصلی تبدیل خواهد شد." صادقانه بگویم، بخش جلویی مقدار شگفت انگیزی از کل کار را به خود اختصاص داد و با اطمینان اعصاب من را در مدت زمان طولانی خرد کرد. اما به لطف سادگی شگفت انگیز Thymeleaf، پس از یک سری شکست های مسحور کننده، می توان یک سازش مناسب را پیدا کرد. بحث بیشتر در مورد پیچیدگی های استفاده از موتور انتخاب شده خواهد بود، اگرچه مفهوم کلی به یک موقعیت مشابه پایبند است. تکنیک اصلی، توانایی استفاده از خالص ترین HTML و مونتاژ نمایش نهایی از تک تک قطعات برای جلوگیری از تکرار چندین بخش یکسان است. بیایید فرض کنیم معماری UI شامل یک صفحه اصلی متشکل از یک نوار پیمایش با کنترل‌ها (افزودن ورودی جدید، بازگشت به صفحه اصلی) و یک جدول پویا برای نمایش موجودیت‌های مرتب‌شده بر اساس زمان اضافه شدن یادداشت در صعودی (ASC) است. یا جهت کاهش (DESC) معانی. اجازه دهید نمایش تمام رکوردها به ترتیب صعودی را به عنوان موقعیت استاندارد در نظر بگیریم. با توجه به خط مشی سلسله مراتبی موتور قالب انتخاب شده، عناصر تجسم مولفه باید در شاخه "قالب ها" در فهرست "منابع" قرار گیرند. در نتیجه، دستکاری های بیشتر با اجزاء، شرایط ارائه شده را در نظر می گیرند. بیایید یک صفحه اصلی با نام "index" (یا هر نام دیگری با توجه به ترجیح شخصی) در قالب html5 ایجاد کنیم. مثلا:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/head :: head"></head>
<body>
<div class="container">
   <div th:replace="fragments/header :: header"></div>
   <div th:if="${not #lists.isEmpty(notes)}">
       <div th:replace="operations/list :: notebook"></div>
   </div>
   <div th:replace="fragments/footer :: footer"></div>
</div>
</body>
</html>
و بنابراین، اجازه دهید اجزای کلیدی برنامه نهایی را تجزیه کنیم. Thymeleaf از یک نحو جداگانه برای نشان دادن استفاده از رویه‌ها استفاده می‌کند و با کلمه کلیدی "th:" شروع می‌شود، پیوند کتابخانه که لزوماً در تگ باز <html> موجود است.
<div th:if="${not #lists.isEmpty(notes)}">
عملیات «اگر» کاملاً با روش معمول انجام کارها تفاوتی ندارد و ویژگی «یادداشت‌های» ورودی را برای وجود اشیا برای نمایش بیشتر بررسی می‌کند. شایان ذکر است که همپوشانی موضوع با استفاده از Controller با در نظر گرفتن استفاده از آن برای سازماندهی تعامل مدل و تجسم به طور جداگانه ذکر شود. بسیاری از لحظات مبهم در آینده شکل می گیرند، فقط اگر می خواهید به عقب برگردید.
<head th:replace="operations/list :: notebook"></head>
عملیات "تعویض" نشان دهنده جایگزینی یک "خرد" یا یک بلوک فعال با یک قطعه انتخاب شده از صفحه فعلی یا جداگانه است - مورد دوم به وضوح در مثال مشاهده می شود. قطعه ای به نام "notebook" را از "list.html" دایرکتوری "operations" در <div></div> فایل "index" کپی می کنیم و کاملاً جایگزین محتوا در مقصد نهایی می شویم. خروجی دارای محتوای زیر است:
<!DOCTYPE html>
<!--suppress ALL -->
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:th="http://www.thymeleaf.org">

<div th:fragment="notebook">
   <table class="table table-bordered table-hover horizontal-align">
       <thead>
       <tr>
           <th style="width: 5%">#</th>
           <th style="width: 60%">Message</th>
           <th class="dropdown" style="width: 20%">Date
               <a th:href="@{'/sort/{sortDate}' (sortDate = 'ASC')}"><i class="fa fa-chevron-circle-up"></i></a>
               <a th:href="@{'/sort/{sortDate}' (sortDate = 'DESC')}"><i class="fa fa-chevron-circle-down"></i></a>
           </th>
           <th style="width: 5%">Done</th>
           <th style="width: 5%">Edit</th>
           <th style="width: 5%">Delete</th>
       </tr>
       </thead>
       <tbody>
       <tr th:each="note : ${notes}">
           <td th:text="${note.id}" style="text-align: center">#</td>
           <td th:text="${note.message}">Message</td>
           <td th:text="${#dates.format(note.date, 'EEE, d MMM yyyy HH:mm')}" style="text-align: center">Date</td>
           <td style="text-align: center">
               <i th:if="${note.done} == true" class="fa fa-plus-square-o" style="font-size:20px;color:#337ab7"></i>
               <i th:if="${note.done} == false" class="fa fa-minus-square-o" style="font-size:20px;color:#337ab7"></i>
           </td>
           <td style="text-align: center"><a th:href="@{'/edit/{id}'(id=${note.id})}"><i class="fa fa-edit" style="font-size:20px"></i></a></td>
           <td style="text-align: center"><a th:href="@{'/delete/{id}'(id=${note.id})}"><i class="fa fa-trash" style="font-size:20px"></i></a></td>
       </tr>
       </tbody>
   </table>
</div>
</html>
بیایید به نمای کلی سازنده بازگردیم و توابع Thymeleaf مورد استفاده را به ترتیب مرور کنیم، نحو استاندارد HTML یا سبک های گرافیکی استفاده شده را حذف کنیم، و به طور خاص بر روی درک مکانیسم موتور قالب تمرکز کنیم.
<div th:fragment="notebook">
عملیات "fragment" نام قطعه را مشخص می کند و امکان استفاده از محتویات بلوک را برای دستور "replace" فراهم می کند. علاوه بر این! استفاده های متعدد در یک صفحه به هیچ وجه مستثنی نیستند، و دوباره قیاس با رویه ها یا توابع در زبان های برنامه نویسی را به ارمغان می آورند.
<a th:href="@{'/sort/{sortDate}' (sortDate = 'ASC')}">
فراخوانی به حاشیه‌نویسی @PostMapping در کنترلر با نگاشت «/sort/{sortDate}» استفاده می‌شود، جایی که {sortDate} ویژگی جهت مرتب‌سازی خروجی است. چیزی مشابه را می توان در بلوک زیر مشاهده کرد، که بسته به موقعیت عنصر انتخاب شده توسط کاربر در حلقه تکرار، یک تغییر پویا اضافه می کند:
<a th:href="@{'/edit/{id}'(id=${note.id})}">
<tr th:each="note : ${notes}">
شمارش مقادیر بسیار شبیه به استفاده آشنا از a for block در نحو جاوا است: متغیر "note" عنصر فعلی را از آرایه ویژگی ورودی ${notes} - آرایه ای از موجودیت ها - می گیرد و برای تغییر مقادیر استفاده می شود. بعدا صادقانه بگوییم، می‌توانیم مقاله جداگانه‌ای را به فهرست کردن طیف گسترده‌ای از قابلیت‌های Thymeleaf با نمونه‌هایی از کاربرد عملی اختصاص دهیم - موتور قالب بسیار ساده است و به هیچ وجه نیازی به یادگیری یک چمدان چشمگیر از نحو اضافی ندارد. توابع شرح داده شده در بالا در اسناد فنی در وب سایت رسمی توسعه دهندگان مشخص شده است و در سازماندهی ارتباط با back-end از اهمیت اساسی برخوردار است. بنابراین، می توانید با اطمینان به قسمت بعدی و پایانی بروید. البته، با پیوست کردن اجزای باقی مانده از تجسم در یک لینک به برنامه تمام شده در انتهای مقاله.

کنترل کننده، مدیر در یک شرکت کوچک

"سنگ بنا در معماری یک برنامه وب" - شاید هیچ راهی برای یافتن توصیف دقیق تری از اهمیت جزء Controller در سازماندهی کار برنامه وجود نداشته باشد: بیشتر عملیات دقیقاً توسط عنصر اتصال بین مدل و نما به لطف مکانیک های اکشن Spring Boot، می توانید با اطمینان از روش های نقشه برداری و درخواست GET/POST بدون کوچکترین مشکلی استفاده کنید و به طور خودکار مخزن داده ها را متصل کنید. بیایید کلاس NoteController را در یک فایل جداگانه در دایرکتوری "controllers" ایجاد کنیم و دوباره به استفاده از حاشیه نویسی مناسب اشاره کنیم:
@Controller
public class NoteController {

   private NoteService service;

   @Autowired
   public void setNoteService(NoteService service) {
       this.service = service;
   }

   @GetMapping("/")
   public String list(Model model) {
       return "index";
   }
}
یک چشم دقیق ممکن است متوجه یک تغییر مهم در طراحی معماری برنامه شود که با افزودن یک سرویس برای جدا کردن منطق تجاری از کار با سرویس مدیریت پایگاه داده همراه است. اقدامات تکمیل شده برای افزایش تطبیق پذیری محصول نهایی و ارائه دامنه گسترده ای برای تغییر عملکرد رابط کاربری بدون نیاز به تغییر در روش های ارتباط با پایگاه داده مورد نیاز است. نمایش استاندارد به هیچ وجه از انبوه موارد مشابه متمایز نیست: رابط در یک دایرکتوری جداگانه قرار دارد و توسط یک کلاس با حاشیه نویسی @Service برای تشخیص Spring Boot پیاده سازی می شود:
public interface NoteService {
   Note getNoteById(Integer id);
   void saveNote(Note note);
   void updateNote(Integer id, String message, boolean done);
   void deleteNote(Integer id);
   List<Note> findAll();
}

@Service
public class NoteServiceImpl implements NoteService{

   private NoteRepository repository;

   @Autowired
   public void setProductRepository(NoteRepository repository) {
       this.repository = repository;
   }

   @Override
   public Note getNoteById(Integer id) {
       return repository.findOne(id);
   }

   @Override
   public void saveNote(Note note) {
       repository.save(note);
   }

   @Override
   public void updateNote(Integer id, String message, boolean done) {
       Note updated = repository.findOne(id);
       updated.setDone(done);
       updated.setMessage(message);
       repository.save(updated);
   }

   @Override
   public void deleteNote(Integer id) {
       repository.delete(id);
   }

   @Override
   public List<Note> findAll() {
       return repository.findAll();
   }
}
بیایید به بررسی کنترلر برگردیم و به پیچیدگی های سازماندهی کار با استفاده از روش های Spring Boot نگاه کنیم. حاشیه نویسی @Autowired نیاز به اتصال خودکار یک سرویس به یک متغیر مشخص از نوع مناسب و ایجاد ارتباط با پایگاه داده را نشان می دهد. باید به نحوه ارتباط نما توجه بیشتری کرد، که با حاشیه نویسی @GetMapping("/") نشان داده شده است، که صفحه ای به نام "index" را هنگام دریافت تماس با localhost:8080 برمی گرداند. می‌توانید از یک رویکرد متفاوت استفاده کنید، توصیف توسعه‌یافته @RequestMapping (مقدار = "/، روش = RequestMethod.GET) یا جایگزینی نوع بازگشتی با یک ModelAndView آماده. با این حال، با توجه به تجربه فعلی در کاربرد عملی، هیچ تفاوت اساسی در نتیجه نهایی مشاهده نمی کنم و از گزینه معمول استفاده می کنم. اجازه دهید کنترلر را با افزودن عناصر جدید با استفاده از یک برگه اضافی گسترش دهیم. پس از کلیک کاربر بر روی عنصر نوار ناوبری، @GetMapping("/new") فراخوانی می شود و به صفحه "جدید" از دایرکتوری "عملیات" هدایت می شود و هنگام تایید داده های وارد شده با استفاده از دکمه، پارامتری به نام "پیام" را برمی گرداند. و تغییر مسیر به بلوک اصلی. نیاز به تطابق کامل نام متغیر در پنجره ورودی با نام مقدار منتقل شده نیاز به ذکر ویژه دارد.
<input type="text" class="form-control" id="message" th:name="message" placeholder="Enter your note." maxlength="100"/>
@GetMapping("/new")
public String newNote() {
   return "operations/new";
}

@PostMapping("/save")
public String updateNote(@RequestParam String message) {
   service.saveNote(new Note(message));
   return "redirect:/";
}
یک تکنیک مشابه برای به روز رسانی یک رکورد استفاده می شود. پس از کلیک بر روی کنترل، نگاشت @GetMapping("/edit/{id}") فراخوانی می شود و شناسه از رشته URL منتقل می شود، ویژگی "note" با ورودی برای ویرایش بیشتر اضافه می شود. @RequestParam (مقدار = "انجام شد"، الزامی = نادرست) بولی انجام شد) تعیین یک مقدار خاص نقش کلیدی در استفاده از کادر انتخاب هنگام استفاده از موتور قالب Thymeleaf دارد و به طور پیش فرض روی "نادرست" تنظیم شده است.
@GetMapping("/edit/{id}")
public String edit(@PathVariable Integer id, Model model) {
   Note note = service.getNoteById(id);
   model.addAttribute("note", note);
   return "operations/edit";
}

@PostMapping("/update")
public String saveNote(@RequestParam Integer id, @RequestParam String message,
                      @RequestParam(value = "done", required = false) boolean done) {
   service.updateNote(id, message, done);
   return "redirect:/";
}
حذف موارد از پایگاه داده بسیار ساده است و نیازی به دستکاری قابل توجهی با فراخوانی تابع سرویس مناسب با استفاده از مقدار ارسال شده ندارد:
@GetMapping("/delete/{id}")
public String delete(@PathVariable Integer id) {
   service.deleteNote(id);
   return "redirect:/";
}
اکنون اجازه دهید تنظیمات کوچکی را در قطعات تکمیل شده انجام دهیم و با استفاده از پرس و جو در Spring Data JPA به ارتباط هیجان انگیز با MySQL برویم، و به طور جداگانه یک تابع برای مدیریت فیلتر ساده قبل از بستن کنترلر اضافه کنیم.
@Controller
public class NoteController {

   private String sortDateMethod = "ASC";

   @GetMapping("/")
   public String list(Model model) {
       List<Note> notebook = filterAndSort();
       model.addAttribute("notes", notebook);
       model.addAttribute("sort", sortDateMethod);
       return "index";
   }

private List<Note> filterAndSort() {
   List<Note> notebook = null;
   switch (sortDateMethod) {
       case "ASC":
           notebook = service.findAllByOrderByDateAsc();
           break;
       case "DESC":
           notebook = service.findAllByOrderByDateDesc();
           break;
   }
   return notebook;
}

Query بسیار کوچک، اما بسیار مهم.

شرم آور است که اعتراف کنیم، فیلتر کردن مقادیر، برخلاف انتظارات، مانع دیگری در انجام وظیفه فنی شد، غلبه بر آستانه پیچیدگی ایجاد شده توسط صفحه بندی - شکستن آرایه داده ها به صفحات جداگانه با اندازه معین برای نمایش بیشتر. به احتمال زیاد، خستگی انباشته تاثیر خود را می‌گرفت، اما... الهام‌بخش پس از یک برخورد کاملاً تصادفی با کوئری‌های Query بود.
public interface NoteRepository extends JpaRepository<Note, Integer> {
   List<Note> findAllByOrderByDateAsc();
   List<Note> findAllByOrderByDateDesc();
}
Spring Data JPA توانایی ایجاد پرس و جوهای پایگاه داده بسیار ریز را فراهم می کند که نیاز به مرتب سازی اطلاعات پس از دریافت را از بین می برد و دارای طیف گسترده ای از پتانسیل کاربردی است. مثلا:
List<Note> findAllByOrderByDateAsc();
این متد به یک پرس و جوی SQL تبدیل می شود و همه رکوردها (findAll) مرتب شده (byOrder) بر اساس تاریخ (byDate) به ترتیب صعودی (Asc) نمایش داده می شود. علاوه بر این، می‌توانید ترکیب‌های پیچیده ایجاد کنید و در بسیاری از زمینه‌ها با یک نیاز واحد نمونه‌گیری کنید. بگویید، تمام رکوردهای تکمیل شده (findAll) (byDoneTrue) را به ترتیب (byOrder) کاهش (Decs) بر اساس مقدار تاریخ (byDate) انتخاب کنید:
Page<Note> findAllByDoneTrueOrderByDateDesc(Pageable pageable);

نتیجه گیری یا اعتراف دیگری از یک برنامه نویس تازه کار

همه! می‌توانید با استفاده از ترکیب Shift+F10 یا با کلیک کردن روی نماد مربوطه، برنامه وب را با خیال راحت اجرا کنید. Spring Boot برنامه را بر روی Apache Maven می سازد و سرور محلی Apache Tomcat را در localhost:8080 نصب می کند. اکنون فقط باید پیوند را در هر مرورگری دنبال کنید.
چکمه بهار فتح - 6
و البته، روشی را برای برآوردن سایر الزامات تجاری ایجاد کنید. پتانسیل برنامه با تلاش، تدبیر و تخیل توسعه دهنده محدود می شود.
چکمه بهار فتح - 7
با رک بودن و توجه به مسیر طی شده، بارها و بارها به درستی مسیر انتخابی متقاعد می شوم و به مزایای مطالعه در پورتال آموزشی JavaRush پی می برم. به لطف انواع وظایف عملی، امکان بازگرداندن علاقه فریبنده به یادگیری برنامه نویسی وجود داشت که در برنامه قدیمی و به طرز شگفت انگیزی خسته کننده یک موسسه آموزش عالی در جهت مشابه کاملاً سرکوب شده بود. چهار ماه مطالعه فعال مواد در پشته فناوری پشتیبان، دانش بسیار بیشتری را در مقایسه با سال‌ها حضور در سخنرانی‌ها و کلاس‌های آزمایشگاهی سرمایه‌گذاری کرد. باور کنی یا نه. آرزو می کنم که تسلیم سختی های ورود مطالب پیچیده نشوید، زیرا از طریق غلبه بر موانع است که ما بهتر می شویم و از نظر حرفه ای و شخصی پیشرفت می کنیم. امیدوارم این داستان کوچک به من کمک کرده باشد تا ایده های جدیدی را برای استفاده از ابزار شگفت انگیز به نام SpringBoot کشف کنم. PS Github .
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION