JavaRush /Java blogi /Random-UZ /Conquest Spring Boot
Surplus
Daraja
Москва

Conquest Spring Boot

Guruhda nashr etilgan
Xayrli kun, aziz o'quvchi! Va siz bilan tanishganimdan xursandman, garchi dabdabali ism Spring Bootning rivojlanishi bilan birinchi tanishuv haqida kamtarona mavzuni ko'rib chiqish uchun asosiy sabab bo'lgan bo'lsa ham. Men JavaRush portalida amaliyot o'tash uchun kirish topshirig'ini bajarish bo'yicha o'z tajribam bilan o'rtoqlashmoqchiman, o'z to'plangan bilimlarining kuchini sinab ko'rmoqchi bo'lgan mutlaqo oddiy texnik universitet talabasining umumiy ko'rinishini taqdim etmoqchiman. Fath bahor etik - 1Hech qanday holatda men biriktirilgan kod yoki fikrlash usulida qo'pollik mavjudligini inkor etmayman va konstruktiv tanqidni mamnuniyat bilan qabul qilaman, chunki "ko'karishlar va ko'karishlar" tufayli professional yo'nalishda rivojlanish mumkin. Bundan tashqari, men berilgan shartlarni hal qilishda o'zimni "davolovchi vosita" sifatida ko'rsatmayman va asab tizimi uchun eng kichik oqibatlarsiz nisbatan murakkab mavzuga kirishning asosiy ahamiyatini qoldirib, dasturning alohida qismlarini ataylab qoldirmayman. To'g'ri, aniq narsani inkor etish beparvolikdir: bu men uchun qiyin edi va ma'lum bir lahzaga qadar mutlaqo hech narsa aniq emas edi. Va agar siz topshiriq bilan birinchi uchrashuvdanoq shunga o'xshash his-tuyg'ularni boshdan kechirsangiz, "Xush kelibsiz!" ThymeleafKeling, Spring Boot da veb-ilovani shablon dvigateli va querymahalliy MySQL serveriga so'rovlar yordamida stajirovkaga kirish testining soddalashtirilgan analogiyasidan foydalanib, kiruvchi ma'lumotlar majmuasini filtrlash uchun yozaylik . Shunday ekan, boshlaylik!

Bahorgi etik. Bu qanday hayvon va uni qanday pishirish kerak?

Muxtasar qilib aytganda, bu Pivotel- dan dastur yaratish jarayonida qimmatli vaqtni tejash, uchinchi tomon kutubxonalarini to'g'ridan-to'g'ri ulash zaruratini yo'q qilish, ta'sirchan xaritalash tuvallari va servletlarni yozish uchun ajoyib vositadir. IntelliJ IDEA Ultimate Edition (Fayl - Yangi - Loyiha... - Spring Initializr) bilan integratsiyalangan yoki start.spring.io veb-xizmatida joylashgan , keng assortimentdan qo'shiladigan paketlarni ko'rsatuvchi Spring Initializr quruvchisidan foydalanish kifoya. taklif qiladi.
Fath bahor etik - 2
Oldinga qo'yilgan texnik xususiyatlardan so'ng, biz MySQL ma'lumotlar bazasidan foydalangan holda oddiy veb-ilovani yaratish uchun janoblar to'plamidan foydalanamiz :
  • WEB veb-ilovani ishlab chiqish uchun asosiy komponent hisoblanadi, jumladan, localhost:8080 standart manzilidagi mahalliy Apache Tomcat serveri va universal Spring MVC ramkasi.

  • DevTools - kompilyatsiya qilingan kod yoki shablonlarda o'zgarishlar aniqlanganda, issiq JVMda dasturni tezda qayta ishga tushirish uchun ishlatiladi; Bundan tashqari, agar tanlangan dvigatel loyihaga kiritilgan bo'lsa, Thymeleaf-ni keshni tozalashdan ozod qiladi.

  • JPA ma'lumotlar bazalari bilan ishlash uchun zarur bo'lgan texnologiya bo'lib, Java ob'ektlarini ob'ektga bog'liq xaritalashni ta'minlaydi, ob'ektlarni boshqarish, saqlash va olish uchun API (bizning holatlarimizda Hibernate ) taqdim etadi.

  • Thymeleaf (Mo'ylov, AngularJS, Vaadin va undan tashqari) - ilovalarni vizualizatsiya qilish uchun shablon mexanizmi; Html tamoyillari bilan nisbiy tanishligim tufayli men tilni dunyoning tamal toshiga surib qo'ygan Thymeleafni tanladim.

  • MySQL - ma'lumotlar bazasiga nisbatan SQL so'rovlarini bajarish uchun Java ma'lumotlar bazasi ulanish drayverlarini ulaydi.
Komponentlarning yakuniy tanlovi va yaratilishidan so'ng, biz keyingi to'ldirishga tayyor kataloglari bo'lgan oddiy veb-ilova arxitekturasini olamiz. Vizual qism bilan o'zaro ishlash uchun fragmentlar, xoh u CSS grafik uslublari, standart HTML sahifalari yoki JavaScript funksionalligi bo'lsin, "resurslar"da joylashgan bo'lishi kerak va orqa tomon komponenti, mos ravishda, "java" da joylashtirilishi kerak. Loyiha tuzilishi va komponentlar orasidagi bog'liqliklarni saqlaydigan ildiz diapazonidagi pom.xml fayliga ham e'tibor qaratishimiz kerak. <dependencies></dependencies>Agar siz qo'shimcha paketlar bilan funksionallikni yanada kengaytirmoqchi bo'lsangiz yoki keraksiz narsalarni olib tashlamoqchi bo'lsangiz, shunga o'xshash usul bo'yicha teglar o'rtasida manipulyatsiya qilishingiz kerak .
Fath bahor etik - 3

Buyuk kelajak sari ilk qadamlar

Keyin juda qiziq va mantiqiy savol tug'iladi: “Endi nima qilish kerak? Bu qanday ishlaydi? Dastur Model-View-Controller tamoyillari asosida qurilgan: u bog'langan ma'lumotlar bazasidan (Model) ob'ektlarni o'qishni tashkil qiladi va boshqaruv elementlari bilan foydalanuvchi interfeysida ko'rsatiladi (View); komponentlar o'rtasidagi aloqa va yuborilgan so'rovlar bo'yicha harakatlarning bajarilishi Controller tufayli amalga oshiriladi. Bu doimiy rivojlanish uchun mos yozuvlar nuqtasi bo'lib xizmat qiladigan asosiy elementlarning yaratilishidir. Sirpanchiqning oldini olish va ish joyidagi o'rtoqlaringizning hurmatini saqlab qolish uchun siz komponentlarni tegishli kataloglarga joylashtirishingiz kerak (masalan, Controller faylini "java" filialidagi Controllers papkasiga joylashtiring) va ehtiyotkorlik bilan saqlang. ish joyida buyurtma berish.

Mohiyat katta mexanizmning kichik qismidir

Yoki boshqacha qilib aytganda, bizning Modelimiz muammoda belgilangan shartlarga muvofiq. Muhokama mavzusidan chiqib, kirish loyihasiga qaytsak, biz ishonch bilan aytishimiz mumkinki, vazifalar o'rtasida minimal farqlar mavjud va keyingi ko'rib chiqishda o'rtacha kontseptsiyaga rioya qilish kerak. Aytaylik, daftardagi eslatmalar, jumladan:
  • Umumiy oqimdagi joyni aniqlash uchun identifikatsiya raqami;
  • Muayyan belgilar sonidan iborat matnli xabar;
  • Foydalanuvchi uni umumiy ro'yxatga qo'shgan sanasi;
  • "Bajarildi yoki bajarilmadi" ("O'qilgan yoki o'qilmagan") aniqlash uchun mantiqiy o'zgaruvchi.
Shuning uchun, keling, "ob'ekt" deb nomlangan katalogda Eslatma sinfini yaratamiz va tegishli maydonlarni qo'shamiz:
@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;
   }
}
Nazariy pozitsiyadan nima sodir bo'layotganini yaxshiroq tushunish uchun muhokama mavzusidan yana bir og'ish. Bahordagi komponentlar o'rtasidagi bog'liqlik izohlar bilan belgilanadi - ob'ektlar oldidagi maxsus ko'rsatkichlar, ularning har biri mexanizmda o'ziga xos rol o'ynaydi va "@" belgisi bilan boshlanadi. @Entity izohi Spring Boot-ga keyingi sinf ma'lumotlari "Entity" ga tegishli ekanligini bildiradi va @Id va @GeneratedValue ma'lumotlar massivini qayta ishlashda iteratorni avtomatik yaratish bilan identifikator sifatida tanlangan maydonni belgilaydi. Vizual formatning ixchamligini oshirish uchun standart Getter va Setter-ni qo'shishni ataylab o'tkazib yuboraman. Keyinchalik, yozuvlarni saqlash uchun ma'lumotlar bazasidan foydalanishni hisobga olgan holda, biz ilovalarni ishlab chiqishning keyingi bosqichiga o'tamiz: biz "ombor" katalogida NoteRepository interfeysini yaratamiz, almashish zanjirining bog'lovchi elementi va eng ko'p meros qilib olinadi. kirish uchun saqlangan ob'ekt va butun son iteratorini ko'rsatadigan keyingi ish uchun mos ombor.
public interface NoteRepository extends JpaRepository<Note, Integer> {
}
Aslida, hammasi shu. Qisqa va ixcham. Endi Spring Boot yaratilgan komponentdan ma'lumotlar bazasi bilan o'zaro aloqalarni tashkil qilish uchun foydalanadi. Harakat qilish uchun har xil potentsialga ega bo'lgan eski omborlarning nisbatan ko'p turlari mavjud. JpaRepository zinapoyaning yuqori qismida joylashgan va eng ko'p potentsialga ega, jumladan CrudRepository va uning ostidagi PageAndSortingRepository. Biz boshqa bormaymiz va mavzudan chetga chiqmaymiz, chunki ba'zi nozikliklar Pivotel veb-saytida texnik hujjatlarda mavjud. Endi, ma'lumotlar tasvirini amalga oshirgandan va dastur tomonida aloqa usullarini ko'rsatgandan so'ng, siz rasmiy ishlab chiqaruvchidan yig'ilishda ish stoli platformasida oldindan o'rnatilgan "MySQL Workbench" mos tashqi muhitida MySQL ma'lumotlar bazasini yaratishga e'tibor berishingiz kerak. mahalliy server yaratish uchun qo'shimcha paketlar bilan:
Fath bahor etik - 4
Keyinchalik, asosiy oynada joriy mahalliy server bilan belgini bosgandan so'ng, atrof-muhit ko'rsatmalariga amal qilib, biz ob'ektimiz (Eslatma) maydonlariga muvofiq jadval diagrammasini yaratamiz va uni tegishli ma'lumotlar bilan to'ldiramiz. Istalgan natijaga erishish uchun zudlik bilan e'tiborni talab qiladigan MySQL lahjasining nozik tomonlarini alohida aniqlash kerak:
  • Bu kabi alohida Boolean turi mavjud emas. Har qanday so'rovni qayta ishlash harakatlari "to'g'ri" yoki "noto'g'ri" ni mos ravishda "1" yoki "0" bit qiymatiga aylantiradi;
  • Sana to'liq vaqt tamg'asi turida saqlanadi. Agar siz yadroga tanish bo'lgan "Sana" dan foydalansangiz, o'zingizni faqat taqvimdagi pozitsiya bilan cheklashingiz kerak bo'ladi.
Conquest Spring Boot - 5
Tayyorgarlik bosqichlari yakuniy tugagandan so'ng, asboblar panelidagi "chaqmoq" belgisini bosish orqali ma'lumotlarni mahalliy serverga yuborish uchun "MySQL Workbench" ni ko'rsatamiz. Endi, agar ma'lumot to'g'ri qo'shilgan bo'lsa, biz joriy ma'lumotlar bazasi konfiguratsiyasini application.properties ga (odatda "resurslar" katalogida joylashgan) qo'shish orqali rivojlanishni davom ettirish uchun mahalliy IDE-ga ishonch bilan qaytishimiz mumkin:
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
Va nihoyat, izohlar yordamida Eslatma ob'ektini MySQL bilan bog'lash. @Table tanlangan nom va sxema bilan jadvaldan foydalanishni bildiradi va @Column o'zgaruvchilar ma'lum bir maydonga tegishli ekanligini bildiradi.
@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;
   }
}

Ko'rish yoki foydalanuvchi interfeysi

Afsuski, biz ishonch bilan aytishimiz mumkin: "Ilovaning vizualizatsiyasi eng kichik nazariy yoki amaliy bilimlarsiz asosiy to'siq bo'ladi." Ochig'ini aytsam, front-end komponenti umumiy ish hajmining hayratlanarli qismini egalladi va uzoq vaqt davomida ishonch bilan asablarimni buzdi. Ammo Thymeleafning hayratlanarli soddaligi tufayli bir qator sehrli mag'lubiyatlardan keyin munosib murosa topish mumkin edi. Keyinchalik muhokama tanlangan dvigateldan foydalanishning nozik tomonlari haqida bo'ladi, garchi umumiy tushuncha shunga o'xshash pozitsiyaga amal qiladi. Asosiy texnika - eng sof HTML-dan foydalanish va bir xil bo'limlarning bir necha marta takrorlanishiga yo'l qo'ymaslik uchun yakuniy displeyni alohida qismlardan yig'ish qobiliyati. Faraz qilaylik, UI arxitekturasi boshqaruv elementlari bo'lgan navigatsiya panelidan (yangi yozuv qo'shish, asosiy sahifaga qaytish) va eslatma ko'tarilgan (ASC) qo'shilgan vaqt bo'yicha tartiblangan ob'ektlarni ko'rsatish uchun dinamik jadvaldan iborat asosiy sahifadan iborat. yoki kamaytiruvchi (DESC) yoʻnalishi.maʼnolari. Keling, standart pozitsiya sifatida barcha yozuvlarning o'sish tartibida ko'rinishini olaylik. Tanlangan shablon mexanizmining ierarxik siyosatiga ko'ra, komponentni vizualizatsiya qilish elementlari "resurslar" katalogidagi "shablonlar" bo'limida joylashgan bo'lishi kerak. Shunday qilib, komponentlar bilan keyingi manipulyatsiyalar ilgari surilgan shartlarni hisobga oladi. Keling, html5 shablonida "indeks" (yoki shaxsiy xohishingizga ko'ra boshqa nom) nomi bilan bosh sahifa yarataylik. Masalan:
<!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>
Shunday qilib, keling, yakuniy dasturning asosiy tarkibiy qismlarini ajratamiz. Thymeleaf protseduralardan foydalanishni ko'rsatish uchun alohida sintaksisdan foydalanadi va "th:" kalit so'zi bilan boshlanadi, kutubxonaga havola, albatta, ochilish tegiga kiritilgan.
<div th:if="${not #lists.isEmpty(notes)}">
"Agar" operatsiyasi odatdagi ishlarni bajarish usulidan mutlaqo farq qilmaydi va kiruvchi "eslatmalar" atributini keyingi ko'rsatish uchun ob'ektlar mavjudligini tekshiradi. Model va vizualizatsiyaning o'zaro ta'sirini tashkil qilish uchun foydalanishni hisobga olgan holda, mavzuning Controllerdan foydalanish bilan o'xshashligini alohida ta'kidlash kerak. Ko'p noaniq daqiqalar kelajakda shakllanadi, agar xohlasangiz, orqaga qayting.
<head th:replace="operations/list :: notebook"></head>
"Almashtirish" operatsiyasi "stub" yoki faol blokni joriy yoki alohida sahifadan tanlangan parcha bilan almashtirishni ko'rsatadi - ikkinchi holat misolda aniq ko'rsatilgan. "Operatsiyalar" katalogining "list.html" dan "notebook" deb nomlangan fragmentni "indeks" faylining <div></div>ga ko'chirib, yakuniy manzildagi tarkibni to'liq almashtiramiz. Chiquvchi quyidagi tarkibga ega:
<!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>
Keling, konstruktiv sharhga qaytaylik va standart HTML sintaksisini yoki ishlatiladigan grafik uslublarini qoldirib, qo'llanilgan Thymeleaf funktsiyalarini tartibda ko'rib chiqaylik va shablon mexanizmi mexanizmini tushunishga alohida e'tibor qarataylik.
<div th:fragment="notebook">
"Fragment" operatsiyasi fragment nomini belgilaydi va "almashtirish" buyrug'i uchun blok tarkibidan foydalanishga imkon beradi. Bundan tashqari! Bitta sahifada bir nechta foydalanishni istisno qilib bo'lmaydi, bu yana dasturlash tillaridagi protseduralar yoki funktsiyalar bilan o'xshashlikni keltirib chiqaradi.
<a th:href="@{'/sort/{sortDate}' (sortDate = 'ASC')}">
@PostMapping izohiga qo'ng'iroq Controllerda “/sort/{sortDate}” xaritalash bilan ishlatiladi, bunda {sortDate} chiquvchi saralash yo'nalishi atributidir. Shunga o'xshash narsani quyidagi blokda ko'rish mumkin, bu foydalanuvchi tanlagan elementning iteratsiya tsiklidagi holatiga qarab dinamik o'zgarishlarni qo'shadi:
<a th:href="@{'/edit/{id}'(id=${note.id})}">
<tr th:each="note : ${notes}">
Qiymatlarni sanab o'tish Java sintaksisidagi for blokining tanish qo'llanilishiga juda o'xshaydi: "eslatma" o'zgaruvchisi joriy elementni kirish atributlari massividan ${notes} - ob'ektlar massividan oladi va qiymatlarni o'zgartirish uchun ishlatiladi. keyinroq. Rostini aytsam, biz Thymeleaf-ning keng imkoniyatlarini amaliy qo'llash misollari bilan ro'yxatga olish uchun alohida maqola bag'ishlashimiz mumkin - shablon mexanizmi juda oddiy va qo'shimcha sintaksisning ta'sirchan yukini o'rganishni talab qilmaydi. Yuqorida tavsiflangan funktsiyalar ishlab chiquvchilarning rasmiy veb-saytidagi texnik hujjatlarda ko'rsatilgan va orqa tomon bilan aloqani tashkil qilishda asosiy rol o'ynaydi. Shuning uchun, keyingi va yakuniy qismga ishonch bilan o'tishingiz mumkin. Albatta, vizualizatsiyaning qolgan qismlarini maqolaning oxirida tugallangan dasturga havolada biriktirish orqali.

Nazoratchi, kichik kompaniyada ma'mur

"Veb-ilova arxitekturasining poydevori" - dastur ishini tashkil qilishda Controller komponentining ahamiyatini aniqroq tavsiflashning iloji yo'q: ko'pgina operatsiyalar aniq birlashtiruvchi element tomonidan amalga oshiriladi. model va ko'rinish. Spring Boot-ning harakat mexanikasi tufayli siz xaritalash va GET/POST so'rov usullaridan eng kichik muammosiz ishonch bilan foydalanishingiz va ma'lumotlar omborini avtomatik ravishda ulashingiz mumkin. Tegishli izohdan foydalanishga yana bir bor murojaat qilib, NoteController sinfini "controllerlar" katalogidagi alohida faylda yarataylik:
@Controller
public class NoteController {

   private NoteService service;

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

   @GetMapping("/")
   public String list(Model model) {
       return "index";
   }
}
Ehtiyotkorlik bilan qaraydigan bo'lsak, ma'lumotlar bazasini boshqarish xizmati bilan ishlashdan biznes mantig'ini ajratish uchun xizmat qo'shilishi bilan bog'liq bo'lgan dastur arxitekturasi dizaynidagi muhim o'zgarishlarni sezishi mumkin. Tugallangan harakatlar tayyor mahsulotning ko'p qirraliligini oshirish va ma'lumotlar bazasi bilan aloqa qilish usullarini o'zgartirmasdan foydalanuvchi interfeysining funksionalligini o'zgartirish uchun keng imkoniyatlarni ta'minlash uchun talab qilinadi. Standart taqdimot hech qanday tarzda shunga o'xshash olomondan ajralib turmaydi: interfeys alohida katalogda joylashgan va Spring Boot aniqlash uchun @Service izohli sinf tomonidan amalga oshiriladi:
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();
   }
}
Keling, tekshirgichni ko'rib chiqishga qaytaylik va Spring Boot usullaridan foydalangan holda ishni tashkil qilishning nozik tomonlarini ko'rib chiqaylik. @Autowired izohi xizmatni tegishli turdagi belgilangan o'zgaruvchiga avtomatik ravishda ulash va ma'lumotlar bazasi bilan aloqa o'rnatish zarurligini bildiradi. Lokalhost:8080 ga qo'ng'iroqni qabul qilishda "indeks" deb nomlangan sahifani qaytaradigan @GetMapping("/") izohi bilan ko'rsatilgan ko'rinishning aloqa qilish usuliga ko'proq e'tibor qaratish lozim. Kengaytirilgan tavsifni @RequestMapping(value = "/", method = RequestMethod.GET) belgilash yoki qaytarish turini tayyor ModelAndView bilan almashtirish orqali boshqa yondashuvdan foydalanishingiz mumkin. Biroq, amaliy qo'llash tajribasining hozirgi holatiga ko'ra, men yakuniy natijada hech qanday fundamental farqlarni sezmayapman va odatiy variantdan foydalanaman. Qo'shimcha yorliq yordamida yangi elementlarni qo'shish orqali kontrollerni kengaytiramiz. Foydalanuvchi navigatsiya paneli elementini bosgandan so'ng, @GetMapping("/new") chaqiriladi va "operatsiyalar" katalogidan "yangi" sahifaga yo'naltiriladi, tugma yordamida kiritilgan ma'lumotlarni tasdiqlashda "xabar" nomli parametrni qaytaradi. va asosiy blokga yo'naltirish. Kirish oynasidagi o'zgaruvchi nomining uzatilgan qiymat nomi bilan to'liq mos kelishi zarurligi uchun alohida eslatma talab qilinadi.
<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:/";
}
Shunga o'xshash usul rekordni yangilash uchun ishlatiladi. Tekshirish tugmachasini bosgandan so'ng, @GetMapping("/edit/{id}") xaritasi chaqiriladi va URL qatoridagi identifikator uzatiladi, "eslatma" atributi keyingi tahrirlash uchun yozuv bilan qo'shiladi. @RequestParam(qiymat = "bajarildi", zarur = noto'g'ri) mantiqiy bajarildi) ma'lum bir qiymatni belgilash Thymeleaf shablon mexanizmidan foydalanganda belgilash katakchasidan foydalanishda asosiy rol o'ynaydi va sukut bo'yicha "noto'g'ri" ga o'rnatiladi.
@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:/";
}
Ma'lumotlar bazasidan elementlarni o'chirish juda oddiy va o'tkazilgan qiymatdan foydalanib tegishli xizmat funktsiyasini chaqirish orqali hech qanday muhim manipulyatsiyani talab qilmaydi:
@GetMapping("/delete/{id}")
public String delete(@PathVariable Integer id) {
   service.deleteNote(id);
   return "redirect:/";
}
Keling, tugallangan qismlarga kichik tuzatishlar kiritamiz va Spring Data JPA-dagi so'rovlar yordamida MySQL bilan qiziqarli aloqaga o'tamiz, bunda Controllerni yopishdan oldin oddiy filtrlashni boshqarish funktsiyasini alohida qo'shamiz.
@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;
}

Juda kichik, lekin juda muhim so'rov.

Tan olish, qiymatlarni filtrlash, kutilganidan farqli o'laroq, texnik topshiriqni bajarishda, sahifalash orqali o'rnatilgan murakkablik chegarasini ishonchli tarzda engib o'tishda yana bir to'siq bo'lib chiqdi - keyingi ko'rsatish uchun ma'lumotlar massivini ma'lum o'lchamdagi alohida sahifalarga bo'lish. Katta ehtimol bilan, to'plangan charchoq o'z ta'sirini o'tkazdi, lekin ... ilhom Query so'rovlari bilan mutlaqo tasodifiy uchrashuvdan keyin keldi.
public interface NoteRepository extends JpaRepository<Note, Integer> {
   List<Note> findAllByOrderByDateAsc();
   List<Note> findAllByOrderByDateDesc();
}
Spring Data JPA ma'lumotlar qabul qilingandan so'ng saralash zaruratini bartaraf etadigan va keng ko'lamli dastur potentsialiga ega bo'lgan yuqori darajadagi ma'lumotlar bazasi so'rovlarini yaratish imkoniyatini beradi. Masalan:
List<Note> findAllByOrderByDateAsc();
Usul SQL so'roviga aylantiriladi va sana (bySana) bo'yicha saralangan (byOrder) barcha yozuvlarni (findAll) o'sish tartibida (Asc) ko'rsatadi. Bundan tashqari, siz murakkab kombinatsiyalar yaratishingiz va bitta talab bilan ko'plab sohalarda namuna olishingiz mumkin. Aytaylik, barcha (findAll) tugallangan (byDoneTrue) yozuvlarni sana qiymati (byDate) bo‘yicha (byOrder) kamayishi (Kemiruvchi) tartibida tanlang:
Page<Note> findAllByDoneTrueOrderByDateDesc(Pageable pageable);

Ajam dasturchining xulosasi yoki boshqa e'tirofi

Hammasi! Shift+F10 kombinatsiyasidan foydalanib yoki tegishli belgini bosish orqali veb-ilovani xavfsiz ishga tushirishingiz mumkin. Spring Boot dasturni Apache Maven-da quradi va localhost:8080 da mahalliy Apache Tomcat serverini o'rnatadi. Endi siz istalgan brauzerda havolaga amal qilishingiz kerak.
Fath bahor etik - 6
Va, albatta, boshqa biznes talablarini bajarish uchun metodologiyani ishlab chiqing. Ilovaning imkoniyatlari ishlab chiquvchining sa'y-harakatlari, topqirligi va tasavvurlari bilan cheklangan.
Fath bahor etik - 7
Ochig'ini aytsam va bosib o'tgan yo'lga e'tibor qaratgan holda, men tanlagan yo'nalishning to'g'riligiga qayta-qayta amin bo'ldim va JavaRush ta'lim portalida o'qishning afzalliklarini tushunaman. Turli xil amaliy topshiriqlar tufayli shunga o'xshash yo'nalishdagi oliy o'quv yurtining eskirgan va hayratlanarli darajada zerikarli dasturida butunlay bostirilgan dasturlashni o'rganishga bo'lgan jozibali qiziqishni qaytarish mumkin edi. To'rt oylik faol o'rganilgan material ma'ruza va laboratoriya mashg'ulotlariga qatnashgan yillarga qaraganda ancha ko'p bilimga sarmoya kiritdi. Ishoning yoki ishonmang. Murakkab materialga kirishdagi qiyinchiliklarga berilmasligingizni tilayman, chunki to'siqlarni engib o'tish orqali biz yaxshilanib, professional va shaxsan rivojlanamiz. Umid qilamanki, bu kichik hikoya menga SpringBoot deb nomlangan ajoyib vositadan foydalanish bo'yicha yangi g'oyalarni topishga yordam berdi. PS Github .
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION