JavaRush /جاوا بلاگ /Random-SD /فتح بهار بوٽ
Surplus
سطح
Москва

فتح بهار بوٽ

گروپ ۾ شايع ٿيل
سٺو ڏينهن، پيارا پڙهندڙ! ۽ اهو توهان سان ملڻ سٺو آهي، جيتوڻيڪ پومپوس نالو بهار بوٽ جي ترقي سان پهرين واقفيت بابت معمولي موضوع تي غور ڪرڻ جو بنيادي سبب هو. مان JavaRush پورٽل تي هڪ انٽرنشپ لاءِ تعارفي اسائنمينٽ مڪمل ڪرڻ جو پنهنجو تجربو شيئر ڪرڻ چاهيان ٿو، هڪ مڪمل طور تي هڪ عام ٽيڪنيڪل يونيورسٽي جي شاگرد جي پاسي کان هڪ جائزو پيش ڪندي جيڪو پنهنجي جمع ڪيل علم جي طاقت کي جانچڻ چاهي ٿو. فتح اسپرنگ بوٽ - 1مان ڪنهن به طريقي سان منسلڪ ڪوڊ يا سوچ جي طريقي ۾ بي رحميءَ جي ممڪن موجودگي کان انڪار نٿو ڪريان، ۽ مان تعميري تنقيد کي ڀليڪار ڪريان ٿو، ڇاڪاڻ ته اها ”بمپس ۽ برائيز“ جي مهرباني آهي، جيڪا پروفيشنل هدايتن ۾ ترقي ڪرڻ ممڪن آهي. ان کان علاوه، مان ڏنل شرطن کي حل ڪرڻ ۾ "علاج" ٿيڻ جو هرگز بهان نه ٿو ڪريان ۽ پروگرام جي انفرادي ٽڪرن کي عمدي طور تي ڇڏي ڏيان ٿو، اعصاب سسٽم جي معمولي نتيجن کان سواء نسبتا پيچيده موضوع ۾ داخل ٿيڻ جي اهم اهميت کي ڇڏي ڏيو. اهو سچ آهي، اهو واضح طور تي انڪار ڪرڻ لاپرواهي آهي: اهو منهنجي لاءِ مشڪل هو ۽ هڪ خاص لمحي تائين بلڪل ڪجهه به واضح نه هو. ۽ جيڪڏهن توهان ڪم سان گڏ پهرين ملاقات کان ساڳيو احساس محسوس ڪيو، ته پوء "خوش آمديد!" اچو ته اسپرنگ بوٽ ۾ هڪ ويب ايپليڪيشن لکون انٽرن شپ جي داخلا ٽيسٽ جي آسان تشبيهه کي استعمال ڪندي ٽيمپليٽ انجڻ استعمال ڪندي Thymeleaf۽ queryمعلومات جي ايندڙ صف کي فلٽر ڪرڻ لاءِ مقامي MySQL سرور ڏانهن سوال. سو اچو ته شروع ڪريون!

بهار جو بوٽ. اهو ڪهڙي قسم جو جانور آهي ۽ ان کي ڪيئن پچائڻ؟

مختصر ۽ مختصر طور تي، اهو Pivotel کان هڪ بهترين اوزار آهي هڪ ايپليڪيشن ٺاهڻ جي عمل ۾ قيمتي وقت بچائڻ لاء، ٽئين پارٽي جي لائبريرين کي سڌو سنئون ڳنڍڻ جي ضرورت کي ختم ڪرڻ، هڪ متاثر کن نقشي جي ڪئنوس ۽ سروليٽ لکڻ. اهو استعمال ڪرڻ ڪافي آهي Spring Initializr بلڊر ، IntelliJ IDEA الٽيميٽ ايڊيشن ۾ ضم ٿيل (فائل - نئون - پروجيڪٽ... - بهار جي شروعات) يا start.spring.io ويب سروس تي واقع آهي ، پيڪيجز جي وضاحت ڪندي شامل ڪرڻ لاءِ وسيع رينج مان آڇون.
فتح اسپرنگ بوٽ - 2
پيش ڪيل ٽيڪنيڪل وضاحتن تي عمل ڪندي، اسان استعمال ڪنداسين gentleman's set، معياري ويب ايپليڪيشن ٺاهڻ لاءِ MySQL ڊيٽابيس استعمال ڪندي :
  • WEB هڪ ويب ايپليڪيشن ٺاهڻ لاءِ بنيادي جزو آهي، جنهن ۾ هڪ مقامي Apache Tomcat سرور شامل آهي معياري ايڊريس localhost:8080 ۽ آفاقي اسپرنگ MVC فريم ورڪ.

  • DevTools - هڪ گرم JVM ۾ ايپليڪيشن کي جلدي ٻيهر شروع ڪرڻ لاءِ استعمال ڪيو ويو جڏهن مرتب ڪيل ڪوڊ يا ٽيمپليٽس ۾ تبديليون معلوم ٿين ٿيون؛ ان کان علاوه، اهو Thymeleaf کي ڪيش صاف ڪرڻ کان آزاد ڪري ٿو جيڪڏهن منتخب ٿيل انجڻ منصوبي ۾ شامل آهي.

  • JPA هڪ ٽيڪنالاجي آهي جيڪا ڊيٽابيس سان ڪم ڪرڻ لاءِ گهربل آهي ۽ جاوا آبجیکٹ جي آبجیکٹ-لڳاپي واري ميپنگ مهيا ڪري ٿي، هڪ API مهيا ڪري ٿي ( اسان جي صورت ۾ Hibernate ) ادارن کي منظم ڪرڻ، بچائڻ ۽ ٻيهر حاصل ڪرڻ لاءِ.

  • Thymeleaf (Mustache, AngularJS, Vaadin and beyond) - ايپليڪيشن بصري لاءِ ٽيمپليٽ انجڻ؛ html جي اصولن سان منهنجي لاڳاپي واقفيت جي مهرباني، مون Thymeleaf کي چونڊيو، جنهن ٻوليءَ کي دنيا جي ڪنڊ ڪڙڇ تائين پهچايو.

  • MySQL - ڊيٽابيس جي خلاف SQL سوالن کي انجام ڏيڻ لاءِ جاوا ڊيٽابيس ڪنيڪشن ڊرائيورن کي ڳنڍي ٿو.
اجزاء ۽ تخليق جي حتمي چونڊ کان پوءِ، اسان حاصل ڪندا آهيون هڪ عام ويب ايپليڪيشن آرڪيٽيڪچر جنهن سان گڏ ڊائريڪٽريون وڌيڪ ڀرڻ لاءِ تيار آهن. بصري حصي سان رابطي لاءِ ٽڪرا، سي ايس ايس گرافڪ اسلوب، معياري HTML صفحا يا جاوا اسڪرپٽ ڪارڪردگي، "وسيلا" ۾ واقع هجڻ گهرجي، ۽ پٺتي جي آخر ۾ جزو، ان جي مطابق، "جاوا" ۾ رکڻ جو مطلب آهي. اسان کي روٽ رينج ۾ pom.xml فائل تي پڻ ڌيان ڏيڻ گهرجي، جيڪو پروجيڪٽ جي جوڙجڪ ۽ اجزاء جي وچ ۾ انحصار کي محفوظ ڪري ٿو. جيڪڏهن توهان اضافي پيڪيجز سان ڪارڪردگي کي وڌائڻ چاهيو ٿا يا غير ضروري شين کي هٽائڻ چاهيو ٿا، توهان کي ٽيگ جي وچ ۾ <dependencies></dependencies>هڪجهڙائي واري طريقي سان عمل ڪرڻ گهرجي.
فتح اسپرنگ بوٽ - 3

هڪ عظيم مستقبل ۾ پهريون قدم

اڳيون، هڪ بلڪه دلچسپ ۽ ڪافي منطقي سوال پيدا ٿئي ٿو: "هاڻي ڇا ڪجي؟ اهو ڪم ڪيئن ٿيندو؟ پروگرام ماڊل-ويو-ڪنٽرولر جي اصولن تي ٺهيل آهي: اهو ڳنڍيل ڊيٽابيس (ماڊل) مان ادارن جي پڙهڻ کي منظم ڪري ٿو ۽ ڪنٽرول سان صارف انٽرفيس ۾ ڏيکاري ٿو (ڏسو)؛ اجزاء جي وچ ۾ رابطي ۽ عملن جي عمل کي منتقل ٿيل درخواستن جي مطابق ڪيو ويندو آهي ڪنٽرولر جي مهرباني. اهو اهم عنصرن جي پيدائش آهي جيڪا مسلسل ترقي لاءِ حوالن جي طور تي ڪم ڪري ٿي. ڪم جي ميدان ۾ ٻڏڻ کان بچڻ ۽ پنهنجي ساٿين جي عزت کي برقرار رکڻ لاءِ، توهان کي اجزاء کي مناسب ڊائريڪٽري ۾ رکڻ گهرجي (مثال طور، ڪنٽرولر فائل کي ڪنٽرولر فولڊر ۾ "جاوا" برانچ ۾ رکو) ۽ احتياط سان رکو. ڪم جي جڳهه ۾ حڪم.

جوهر هڪ وڏي ميکانيزم ۾ هڪ ننڍڙو حصو آهي

يا ٻين لفظن ۾، اسان جو ماڊل مسئلو ۾ مقرر ڪيل شرطن جي مطابق. بحث جي موضوع کان ٻاهر نڪرڻ ۽ تعارفي منصوبي ڏانهن موٽڻ، اسان يقين سان چئي سگهون ٿا ته ڪمن جي وچ ۾ گهٽ ۾ گهٽ اختلاف آهن ۽ وڌيڪ جائزو ۾ اوسط تصور تي عمل ڪريو. اچو ته چوندا آهن، هڪ نوٽ بڪ ۾ نوٽس، جنهن ۾ شامل آهن:
  • عام وهڪري ۾ هنڌ جو تعين ڪرڻ لاءِ سڃاڻپ جو نمبر؛
  • اکرن جي هڪ مخصوص تعداد جو هڪ متن پيغام؛
  • تاريخ جيڪا صارف ان کي عام لسٽ ۾ شامل ڪيو؛
  • هڪ Boolean variable جو تعين ڪرڻ لاءِ ”مڪمل يا نه ڪيو ويو“ (“پڙهو يا نه پڙهو”).
تنهن ڪري، اچو ته هڪ ڊاريڪٽري ۾ هڪ نوٽ ڪلاس ٺاهيو جنهن کي "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;
   }
}
هڪ نظرياتي پوزيشن کان ڇا ٿي رهيو آهي جي وڌيڪ سمجھڻ لاء بحث جي موضوع کان هڪ ٻيو انحراف. بهار ۾ اجزاء جي وچ ۾ ڪنيڪشن تشريح ذريعي بيان ڪيو ويو آهي - خاص اشارن جي سامهون، جن مان هر هڪ ميڪانيزم ۾ هڪ خاص ڪردار ادا ڪري ٿو ۽ "@" علامت سان شروع ٿئي ٿو. @Entity تشريح اسپرنگ بوٽ ڏانهن اشارو ڪري ٿي ته بعد ۾ ڪلاس ڊيٽا جو تعلق “Entity” سان آهي، ۽ @Id ۽ @GeneratedValue چونڊيل فيلڊ کي هڪ سڃاڻپ ڪندڙ جي طور تي بيان ڪري ٿو هڪ آئٽميٽر جي خودڪار نسل سان جڏهن معلومات جي هڪ صف کي پروسيس ڪندي. مان عمدي طور شامل ڪريان ٿو معياري گيٽر ۽ سيٽر شامل ڪرڻ لاءِ بصري شڪل جي مطابقت کي وڌائڻ لاءِ. اڳيون، رڪارڊ رکڻ لاءِ ڊيٽابيس جي استعمال کي مدنظر رکندي، اسان اڳتي وڌون ٿا ايپليڪيشن ڊولپمينٽ ۾ ايندڙ قدم: اسان ٺاهينداسين NoteRepository انٽرفيس “Repository” ڊاريڪٽري ۾، مٽاسٽا جي زنجير ۾ هڪ ڳنڍيندڙ عنصر، ۽ ورثي ۾ سڀ کان وڌيڪ. وڌيڪ ڪم لاءِ موزون مخزن، ذخيرو ٿيل ادارو ۽ انٽيجر آئٽرٽر تائين رسائي جي نشاندهي ڪري ٿو.
public interface NoteRepository extends JpaRepository<Note, Integer> {
}
دراصل، اهو سڀ ڪجهه آهي. مختصر ۽ اختصار. ھاڻي اسپرنگ بوٽ ڊيٽابيس سان رابطي کي منظم ڪرڻ لاءِ ٺاھيل جزو استعمال ڪندو. اتي نسبتاً ڪيترائي قسم جا ميراثي ذخيرا آھن جن سان عمل لاءِ مختلف صلاحيتون آھن. JpaRepository ڏاڪڻ جي چوٽي تي آهي ۽ تمام گهڻي صلاحيت رکي ٿي، بشمول CrudRepository ۽ PageAndSortingRepository ان جي هيٺان. اسان اڳتي نه وينداسين ۽ موضوع کان انحراف نه ڪنداسين، ڇاڪاڻ ته ڪجهه تفصيل ڳولي سگهجن ٿا Pivotel ويب سائيٽ تي ٽيڪنيڪل دستاويزن ۾. هاڻي، ڊيٽا جي تصوير کي لاڳو ڪرڻ ۽ ايپليڪيشن جي پاسي تي رابطي جي طريقن کي بيان ڪرڻ کان پوء، توهان کي مناسب خارجي ماحول ۾ MySQL ڊيٽابيس ٺاهڻ تي ڌيان ڏيڻ جي ضرورت آهي "MySQL Workbench"، ڊيسڪ ٽاپ پليٽ فارم تي اڳ ۾ نصب ٿيل هڪ اسيمبلي ۾ سرڪاري ڊولپر کان. مقامي سرور ٺاهڻ لاءِ اضافي پيڪيجز سان:
فتح اسپرنگ بوٽ - 4
اڳيون، ماحول جي هدايتن تي عمل ڪرڻ کان پوءِ مين ونڊو ۾ موجوده لوڪل سرور سان گڏ آئڪن تي ڪلڪ ڪري، اسان پنھنجي اداري (نوٽ) جي شعبن جي مطابق ٽيبل ڊاگرام ٺاھيون ٿا ۽ ان کي مناسب ڊيٽا سان ڀريون ٿا. اهو ضروري آهي ته الڳ الڳ MySQL ٻولي جي ذيلي ذخيري کي واضح ڪيو وڃي، جنهن کي فوري طور تي ڌيان ڏيڻ جي ضرورت آهي ڪاميابيء سان گهربل نتيجو حاصل ڪرڻ لاء:
  • ڪو به الڳ Boolean قسم نه آهي جيئن. ڪا به درخواست پروسيسنگ ڪارناما "سچو" يا "غلط" کي بٽ ويل "1" يا "0" ۾ تبديل ڪندا، ترتيب سان؛
  • تاريخ مڪمل طور تي ٽائم اسٽيمپ قسم ۾ محفوظ ٿيل آهي. جيڪڏهن توهان تاريخ استعمال ڪريو ٿا، جيڪا بنيادي کان واقف آهي، توهان کي پنهنجو پاڻ کي صرف ڪئلينڊر ۾ پوزيشن تائين محدود ڪرڻو پوندو.
فتح اسپرنگ بوٽ - 5
تياري جي مرحلن جي آخري مڪمل ٿيڻ کان پوء، اسان ٽول بار تي "لائيٽنگ" آئڪن تي ڪلڪ ڪندي مقامي سرور ڏانهن ڊيٽا موڪلڻ لاء "MySQL Workbench" کي اشارو ڪيو. هاڻي، جيڪڏهن معلومات شامل ڪرڻ صحيح طريقي سان مڪمل ڪئي وئي هئي، اسان يقين سان پنهنجي اصلي IDE ڏانهن واپس ڪري سگهون ٿا ترقي جاري رکڻ لاءِ موجوده ڊيٽابيس جي ترتيب کي application.properties ۾ شامل ڪندي (عام طور تي "وسيلا" ڊاريڪٽري ۾ واقع آهي):
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
۽ آخر ۾ نوٽيفڪيشن استعمال ڪندي 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) or decrementing (DESC) سمت. اچو ته معياري پوزيشن طور وٺون سڀني رڪارڊن جي ڊسپلي کي چڙهندڙ ترتيب ۾. منتخب ٿيل ٽيمپليٽ انجڻ جي درجه بندي واري پاليسي جي مطابق، اجزاء جي بصري عناصر کي "وسيلا" ڊاريڪٽري ۾ "ٽيمپليٽ" شاخ تي واقع ٿيڻ گهرجي. نتيجي طور، اجزاء سان وڌيڪ ڦيرڦار کي اڳتي وڌڻ جي شرطن کي نظر ۾ رکندي. اچو ته 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)}">
"جيڪڏهن" آپريشن مڪمل طور تي ڪم ڪرڻ جي معمولي طريقي کان مختلف ناهي ۽ ايندڙ "نوٽس" خاصيت کي چيڪ ڪري ٿو وڌيڪ ڊسپلي لاءِ شين جي موجودگي لاءِ. اهو الڳ الڳ ذڪر ڪرڻ جي قابل آهي ته موضوع جي اوورليپ ڪنٽرولر جي استعمال سان، ان جي استعمال کي مدنظر رکندي ماڊل جي رابطي کي منظم ڪرڻ ۽ ڏسڻ لاء. ڪيترائي مبہم لمحات مستقبل ۾ شڪل وٺندا آهن، بس واپس وڃو جيڪڏهن توهان چاهيو.
<head th:replace="operations/list :: notebook"></head>
"بدليو" آپريشن اشارو ڪري ٿو "اسٽب" جي متبادل يا فعال بلاڪ کي موجوده يا الڳ صفحي مان چونڊيل ٽڪرا سان - آخري صورت مثال ۾ واضح طور تي ڏٺو ويو آهي. اسان "نوٽ بڪ" نالي ٽڪڙي کي ڪاپي ڪريون ٿا "list.html" مان "operations" ڊاريڪٽري جي <div></div> ۾ "انڊيڪس" فائل جي، مڪمل طور تي مواد کي آخري منزل ۾ تبديل ڪري. ٻاھر نڪرندڙ ھيٺ ڏنل مواد آھي:
<!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">
"ٽڪرا" آپريشن ٽڪرا جو نالو بيان ڪري ٿو ۽ "تبديل" حڪم لاء بلاڪ جي مواد کي استعمال ڪرڻ ممڪن بڻائي ٿو. ان کان علاوه! ھڪڙي صفحي جي اندر گھڻن استعمالن کي ڪنھن به طرح خارج نه ڪيو ويو آھي، وري پروگرامنگ ٻولين ۾ طريقيڪار يا افعال سان تشريح کي اڳتي آڻيندي.
<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 جي سڃاتل استعمال سان تمام ملندڙ جلندڙ قدرن کي ڳڻيو وڃي ٿو: متغير ”نوٽ“ موجوده عنصر کي ان پٽ انتساب جي صف کان وٺي ٿو ${notes}- ادارن جو هڪ صف- ۽ قدرن کي تبديل ڪرڻ لاءِ استعمال ڪيو ويندو آهي. بعد ۾ واضح طور تي، اسان هڪ الڳ مضمون وقف ڪري سگھون ٿا Thymeleaf صلاحيتن جي وسيع رينج کي لسٽ ڪرڻ لاءِ عملي ايپليڪيشن جي مثالن سان - ٽيمپليٽ انجڻ انتهائي سادو آهي ۽ اضافي نحو جي تمام شاندار سامان تي سکڻ جي ضرورت ناهي. مٿي بيان ڪيل ڪم ڊولپرز جي سرڪاري ويب سائيٽ تي ٽيڪنيڪل دستاويزن ۾ بيان ڪيا ويا آهن ۽ پٺتي پيل سان رابطي کي منظم ڪرڻ ۾ اهم اهميت رکن ٿا. تنهن ڪري، توهان اعتماد سان ايندڙ ۽ آخري حصو ڏانهن منتقل ڪري سگهو ٿا. يقينن، آرٽيڪل جي آخر ۾ مڪمل ٿيل ايپليڪيشن جي لنڪ ۾ بصري جي باقي حصن کي ڳنڍڻ سان.

هڪ ننڍڙي ڪمپني ۾ ڪنٽرولر، منتظم

"ويب ايپليڪيشن جي فن تعمير ۾ بنيادي پٿر" - شايد پروگرام جي ڪم کي منظم ڪرڻ ۾ ڪنٽرولر جزو جي اهميت جي وڌيڪ صحيح وضاحت ڳولڻ جو ڪو طريقو ناهي: اڪثر عملن جي وچ ۾ ڳنڍيندڙ عنصر طرفان صحيح طور تي ڪيا ويندا آهن. ماڊل ۽ ڏيک. اسپرنگ بوٽ جي ايڪشن ميڪينڪس جي مهرباني، توهان اعتماد سان ميپنگ ۽ GET/POST درخواست جا طريقا استعمال ڪري سگهو ٿا بغير ڪنهن معمولي مسئلي جي، ۽ خودڪار طريقي سان ڊيٽا جي ذخيري کي ڳنڍي سگهو ٿا. اچو ته "ڪنٽرولرز" ڊاريڪٽري ۾ هڪ الڳ فائل ۾ NoteController ڪلاس ٺاهي، ٻيهر مناسب تشريح جي استعمال ڏانهن اشارو ڪندي:
@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 تشريح سان اسپرنگ بوٽ ڳولڻ لاءِ:
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();
   }
}
اچو ته ڪنٽرولر جو جائزو وٺڻ تي واپس وڃو ۽ اسپرنگ بوٽ طريقن کي استعمال ڪندي ڪم کي منظم ڪرڻ جي پيچيدگين کي ڏسو. @Autowired تشريح خود بخود هڪ خدمت کي مناسب قسم جي مخصوص متغير سان پابند ڪرڻ ۽ ڊيٽابيس سان ڪنيڪشن قائم ڪرڻ جي ضرورت کي ظاهر ڪري ٿو. وڌيڪ ڌيان ڏيڻ گهرجي انهي طريقي سان ڏسڻ جي ڳالهه ٻولهه، @GetMapping("/") تشريح پاران اشارو ڪيو ويو آهي، جيڪو "انڊيڪس" نالي هڪ صفحي کي واپس ڪري ٿو جڏهن لوڪل هسٽ: 8080 تي ڪال وصول ڪري ٿي. توھان ھڪڙو مختلف طريقو استعمال ڪري سگھو ٿا، وڌايل تفصيل بيان ڪندي @RequestMapping(value = "/"، method = RequestMethod.GET) يا موٽڻ واري قسم کي ھڪڙي تيار ٿيل ModelAndView سان تبديل ڪري سگھو ٿا. بهرحال، عملي اپليڪشن ۾ تجربي جي موجوده حالت موجب، مان حتمي نتيجي ۾ ڪو به بنيادي اختلاف محسوس نٿو ڪريان ۽ معمولي آپشن استعمال ڪريان ٿو. اچو ته ڪنٽرولر کي وڌايو نئين عناصر شامل ڪندي اضافي ٽيب استعمال ڪندي. صارف جي نيويگيشن بار جي عنصر تي ڪلڪ ڪرڻ کان پوء، @GetMapping("/new") کي سڏيو ويندو آهي ۽ "آپريشنز" ڊاريڪٽري مان "نئين" صفحي ڏانهن ريڊائريڪٽ ڪيو ويندو آهي، "ميسيج" نالي هڪ پيٽرولر واپس آڻيندي جڏهن بٽڻ استعمال ڪندي داخل ٿيل ڊيٽا جي تصديق ڪندي. ۽ مکيه بلاڪ ڏانهن منتقل ڪيو وڃي. ان پٽ ونڊو ۾ variable نالي جي مڪمل ميلاپ جي ضرورت آھي منتقل ڪيل قدر جي نالي سان خاص ذڪر جي.
<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 اسٽرنگ مان سڃاڻپ ڪندڙ کي منتقل ڪيو ويندو آهي، "نوٽ" وصف شامل ڪيو ويندو آهي داخل ٿيڻ سان وڌيڪ ترميم لاءِ. @RequestParam(value = "done", required = false) boolean done) مخصوص قدر جي وضاحت ڪرڻ چيڪ بڪس جي استعمال ۾ اهم ڪردار ادا ڪري ٿو جڏهن Thymeleaf ٽيمپليٽ انجڻ استعمال ڪيو وڃي ٿو ۽ ڊفالٽ طور تي "false" تي مقرر ٿيل آهي.
@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:/";
}
ھاڻي اچو ته تيار ٿيل ٽڪرن ۾ ننڍيون ترميمون ڪيون ۽ اڳتي وڌون MySQL سان دلچسپ ڪميونيڪيشن کي استعمال ڪندي اسپرنگ ڊيٽا JPA ۾ سوالن جا سوال استعمال ڪندي، ڪنٽرولر کي بند ڪرڻ کان اڳ سادي فلٽرنگ کي منظم ڪرڻ لاءِ الڳ الڳ فنڪشن شامل ڪريو.
@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;
}

تمام ننڍڙو، پر تمام ضروري سوال.

اهو تسليم ڪرڻ شرمناڪ آهي، قدرن کي فلٽر ڪرڻ، اميدن جي برعڪس، ٽيڪنيڪل ڪم کي پورو ڪرڻ ۾ هڪ ٻيو رڪاوٽ ثابت ٿيو، صفحو جي ترتيب سان قائم ڪيل پيچيدگي جي حد تي اعتماد سان قابو پائڻ - وڌيڪ ڊسپلي لاءِ هڪ خاص سائيز جي الڳ صفحن ۾ ڊيٽا جي صف کي ٽوڙڻ. گهڻو ڪري، جمع ٿيل ٿڪ پنهنجي ٽولي وٺي رهيو هو، پر ... حيرت انگيز سوالن سان مڪمل طور تي حادثاتي ملاقات کان پوء آئي.
public interface NoteRepository extends JpaRepository<Note, Integer> {
   List<Note> findAllByOrderByDateAsc();
   List<Note> findAllByOrderByDateDesc();
}
اسپرنگ ڊيٽا JPA انتهائي گرينولر ڊيٽابيس سوالن کي پيدا ڪرڻ جي صلاحيت فراهم ڪري ٿي جيڪا معلومات کي ترتيب ڏيڻ جي ضرورت کي ختم ڪري ٿي هڪ ڀيرو اها حاصل ٿئي ٿي ۽ درخواست جي صلاحيت جو وسيع سلسلو آهي. مثال طور:
List<Note> findAllByOrderByDateAsc();
طريقي کي SQL سوال ۾ تبديل ڪيو ويندو ۽ سڀ رڪارڊ ڏيکاريو (FindAll) ترتيب ڏنل (by Order) تاريخ (byDate) جي ترتيب سان (Asc). ان کان علاوه، توھان ٺاھي سگھوٿا پيچيده مجموعا ۽ نمونا ڪيترن ئي شعبن ۾ ھڪڙي ضرورت سان. چئو، سڀ (FindAll) مڪمل ٿيل (byDoneTrue) رڪارڊز کي ترتيب ڏيو (by Order) گھٽائي (Decs) تاريخ جي قيمت (byDate):
Page<Note> findAllByDoneTrueOrderByDateDesc(Pageable pageable);

نتيجو يا هڪ نئين پروگرامر جو ٻيو اعتراف

سڀ! توھان محفوظ طور تي ويب ايپليڪيشن لانچ ڪري سگھو ٿا Shift+F10 ميلاپ استعمال ڪندي يا لاڳاپيل آئڪن تي ڪلڪ ڪري. اسپرنگ بوٽ پروگرام ٺاهيندو Apache Maven تي ۽ انسٽال ڪندو مقامي Apache Tomcat سرور localhost:8080. هاڻي توهان کي ڪنهن به برائوزر ۾ لنڪ جي پيروي ڪرڻ جي ضرورت آهي.
فتح اسپرنگ بوٽ - 6
۽، يقينا، ٻين ڪاروباري گهرجن کي پورو ڪرڻ لاء هڪ طريقو ٺاهيو. ايپليڪيشن جي صلاحيت ڊولپر جي ڪوشش، وسيلن، ۽ تخيل تائين محدود آهي.
فتح اسپرنگ بوٽ - 7
واضح هجڻ ۽ سفر ڪيل رستي تي ڌيان ڏيڻ، مان چونڊيل هدايت جي درستي جو بار بار قائل آهيان ۽ محسوس ڪريان ٿو جاوا رش تعليمي پورٽل تي پڙهائي جا فائدا. مختلف قسم جي عملي ڪمن جي مهرباني، پروگرامنگ سکڻ ۾ دلچسپ دلچسپي کي واپس ڪرڻ ممڪن هو، جيڪو مڪمل طور تي دٻايو ويو هو هڪ ئي هدايت جي اعلي تعليمي اداري جي پراڻي ۽ حيرت انگيز بورنگ پروگرام ۾. چئن مهينن جي فعال طور تي مطالعي واري مواد جي پسمانده ٽيڪنالاجي اسٽيڪ ۾ تمام گهڻو علم خرچ ڪيو ويو ليڪچرز ۽ ليبارٽري ڪلاس ۾ شرڪت ڪرڻ جي سڀني سالن جي مقابلي ۾. انهي تي يقين ڪر يا نہ. مان چاهيان ٿو ته توهان پيچيده مواد ۾ داخل ٿيڻ جي مشڪلاتن ۾ نه ڏيو، ڇو ته اهو رڪاوٽون ختم ڪرڻ جي ذريعي آهي ته اسان بهتر ٿي سگهون ٿا ۽ پيشه ورانه ۽ ذاتي طور تي ترقي ڪريون ٿا. مون کي اميد آهي ته هن ننڍڙي ڪهاڻي مون کي اسپرنگ بوٽ نالي شاندار اوزار استعمال ڪرڻ لاء ڪجهه نوان خيال ڳولڻ ۾ مدد ڪئي آهي. پي ايس گٿب .
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION