JavaRush /Java Blogu /Random-AZ /Conquest Bahar Çəkməsi
Surplus
Səviyyə
Москва

Conquest Bahar Çəkməsi

Qrupda dərc edilmişdir
Gününüz xeyir, əziz oxucu! Təmtəraqlı ad, Spring Boot-un inkişafı ilə ilk tanışlıq haqqında təvazökar mövzuya baxmaq üçün əsas səbəb olsa da, sizinlə tanış olmaqdan məmnunam. Mən JavaRush portalında təcrübə keçmək üçün giriş tapşırığını yerinə yetirmək təcrübəmi bölüşmək, topladığı biliklərin gücünü yoxlamaq istəyən tamamilə adi bir texniki universitet tələbəsinin baxışını təqdim etmək istərdim. Conquest Spring Boot - 1Mən heç bir şəkildə əlavə edilmiş kodda və ya düşüncə metodunda kobudluğun mümkün olmasını inkar etmirəm və konstruktiv tənqidi alqışlayıram, çünki "törpülər və qançırlar" sayəsində peşəkar bir istiqamətdə inkişaf etmək mümkündür. Üstəlik, mən verilmiş şərtlərin həllində heç bir "dərman" kimi görünmürəm və proqramın ayrı-ayrı fraqmentlərini qəsdən buraxıram, nisbətən mürəkkəb bir mövzuya girməyin əsas əhəmiyyətini sinir sistemi üçün ən kiçik nəticələr olmadan tərk edirəm. Düzdür, aşkar olanı inkar etmək ehtiyatsızlıqdır: mənim üçün çətin idi və müəyyən bir ana qədər heç bir şey aydın deyildi. Tapşırıqla ilk görüşdən oxşar hisslər yaşayırsınızsa, o zaman "Xoş gəlmisiniz!" ThymeleafGələn məlumat massivini süzgəcdən keçirmək üçün şablon mühərriki və queryyerli MySQL serverinə sorğulardan istifadə edərək təcrübəyə giriş testinin sadələşdirilmiş analogiyasından istifadə edərək, Spring Boot-da veb tətbiqi yazaq . Beləliklə, başlayaq!

Yaz çəkmə. Bu hansı heyvandır və onu necə bişirmək olar?

Qısa və qısa desək, bu , tətbiqin yaradılması prosesində qiymətli vaxta qənaət etmək, üçüncü tərəflərin kitabxanalarını birbaşa bağlamaq ehtiyacını aradan qaldırmaq, təsirli xəritəçəkmə kətan və servletlər yazmaq üçün Pivotel -dən əla vasitədir . IntelliJ IDEA Ultimate Edition (Fayl - Yeni - Layihə... - Spring Initializr) ilə inteqrasiya edilmiş və ya start.spring.io veb xidmətində yerləşən , geniş çeşiddə paketləri daxil etmək üçün nəzərdə tutulmuş Spring Initializr qurucusundan istifadə etmək kifayətdir. təklif edir.
Conquest Spring Boot - 2
İrəli sürülən texniki spesifikasiyalardan sonra biz MySQL verilənlər bazasından istifadə edərək sadə veb proqram yaratmaq üçün standart olan centlmen dəstindən istifadə edəcəyik :
  • WEB, localhost:8080 standart ünvanında yerli Apache Tomcat serveri və universal Spring MVC çərçivəsi də daxil olmaqla veb proqramın hazırlanması üçün əsas komponentdir .

  • DevTools - tərtib edilmiş kod və ya şablonlarda dəyişikliklər aşkar edildikdə, isti JVM-də tətbiqi tez yenidən başlatmaq üçün istifadə olunur; Üstəlik, seçilmiş mühərrik layihəyə daxil edilərsə, Thymeleaf-ı önbelleği təmizləməkdən azad edir.

  • JPA verilənlər bazası ilə işləmək üçün tələb olunan texnologiyadır və Java obyektlərinin obyektlə əlaqəli xəritələşdirilməsini təmin edir, obyektləri idarə etmək, saxlamaq və əldə etmək üçün API (bizim vəziyyətimizdə Hibernate ) təmin edir.

  • Thymeleaf (Mustache, AngularJS, Vaadin and beyond) - tətbiqin vizuallaşdırılması üçün şablon mühərriki; Html prinsipləri ilə nisbi tanışlığım sayəsində dili dünyanın təməl daşına itələyən Thymeleaf-ı seçdim.

  • MySQL - verilənlər bazasına qarşı SQL sorğularını yerinə yetirmək üçün Java Database Connectivity sürücülərini birləşdirir.
Komponentlərin son seçimindən və yaradılmasından sonra biz əlavə doldurulmağa hazır kataloqları olan adi veb tətbiqi arxitekturasını əldə edirik. Vizual hissə ilə qarşılıqlı əlaqə üçün fraqmentlər, istər CSS qrafik üslubları, istər standart HTML səhifələri, istərsə də JavaScript funksionallığı olsun, “resurslar”da yerləşməlidir və müvafiq olaraq arxa hissə komponenti “java”da yerləşdirilməlidir. Layihə strukturunu və komponentlər arasında asılılıqları saxlayan kök diapazonunda pom.xml faylına da diqqət yetirməliyik. Əlavə paketlərlə funksionallığı daha da genişləndirmək və ya lazımsız şeyləri silmək istəyirsinizsə, <dependencies></dependencies>oxşar üsula uyğun olaraq etiketlər arasında manipulyasiyalar etməlisiniz.
Conquest Spring Boot - 3

Böyük gələcəyə ilk addımlar

Sonra olduqca maraqlı və kifayət qədər məntiqli sual yaranır: “İndi nə etməli? Bu necə işləyəcək? Proqram Model-View-Controller prinsipləri əsasında qurulub: o, əlaqəli verilənlər bazasından (Model) obyektlərin oxunmasını təşkil edir və idarəetmə elementləri ilə istifadəçi interfeysində göstərilir (View); komponentlər arasında əlaqə və ötürülən sorğulara uyğun hərəkətlərin icrası Nəzarətçi sayəsində həyata keçirilir. Davamlı inkişaf üçün istinad nöqtəsi kimi xidmət edən əsas elementlərin yaradılmasıdır. Sürüşkən enişin qarşısını almaq və iş sahəsində yoldaşlarınızın hörmətini qorumaq üçün komponentləri müvafiq qovluqlara yerləşdirməlisiniz (məsələn, Controller faylını “java” filialındakı Controllers qovluğuna yerləşdirin) və diqqətlə saxlayın. iş yerində sifariş.

Mahiyyət böyük mexanizmin kiçik bir hissəsidir

Və ya başqa sözlə, problemdə qoyulan şərtlərə uyğun olaraq Modelimiz. Müzakirə mövzusundan çıxıb giriş layihəsinə qayıdaraq, biz əminliklə iddia edə bilərik ki, tapşırıqlar arasında minimal fərqlər var və sonrakı nəzərdən keçirərkən orta konsepsiyaya riayət edək. Tutaq ki, dəftərdəki qeydlər, o cümlədən:
  • Ümumi axındakı yeri müəyyən etmək üçün identifikasiya nömrəsi;
  • Müəyyən sayda simvoldan ibarət mətn mesajı;
  • İstifadəçinin onu ümumi siyahıya əlavə etdiyi tarix;
  • “Bitti və ya edilmədi” (“Oxudu və ya oxunmadı”) təyin etmək üçün Boolean dəyişəni.
Buna görə də gəlin “entity” adlı kataloqda Note sinfi yaradaq və müvafiq sahələri əlavə edək:
@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;
   }
}
Nə baş verdiyini nəzəri mövqedən daha yaxşı başa düşmək üçün müzakirə mövzusundan başqa bir sapma. Bahardakı komponentlər arasındakı əlaqə annotasiyalarla müəyyən edilir - hər biri mexanizmdə xüsusi rol oynayan və "@" simvolu ilə başlayan obyektlərin qarşısında xüsusi göstəricilər. @Entity annotasiyası Spring Boot-a göstərir ki, sonrakı sinif verilənləri “Müəssisə”yə aiddir və @Id və @GeneratedValue, məlumat massivinin işlənməsi zamanı təkrarlayıcının avtomatik yaradılması ilə identifikator kimi seçilmiş sahəni təyin edir. Vizual formatın yığcamlığını artırmaq üçün standart Getter və Setter əlavə etməyi qəsdən buraxıram. Bundan sonra, qeydlərin saxlanması üçün verilənlər bazasından istifadəni nəzərə alaraq, proqramların hazırlanmasında növbəti addıma keçirik: mübadilə zəncirində birləşdirici element olan “repozitoriya” kataloqunda NoteRepository interfeysini yaradacağıq və ən çox miras alacağıq. daxil olmaq üçün saxlanılan obyekti və tam ədəd iteratorunu göstərən sonrakı iş üçün uyğun depo.
public interface NoteRepository extends JpaRepository<Note, Integer> {
}
Əslində, hamısı budur. Qısa və qısa. İndi Spring Boot verilənlər bazası ilə qarşılıqlı əlaqəni təşkil etmək üçün yaradılmış komponentdən istifadə edəcək. Fəaliyyət üçün müxtəlif potensiala malik olan köhnə depoların nisbətən çox növləri var. JpaRepository pilləkənin başındadır və onun altındakı CrudRepository və PageAndSortingRepository də daxil olmaqla ən çox potensiala malikdir. Biz daha da irəli getməyəcəyik və mövzudan kənara çıxmayacağıq, çünki bəzi incəlikləri texniki sənədlərdə Pivotel saytında tapa bilərsiniz. İndi, məlumat görüntüsünü tətbiq etdikdən və tətbiq tərəfində ünsiyyət üsullarını təyin etdikdən sonra, rəsmi tərtibatçıdan bir montajda masa üstü platformasında əvvəlcədən quraşdırılmış müvafiq xarici mühitdə MySQL verilənlər bazası yaratmağa diqqət yetirməlisiniz "MySQL Workbench" yerli server yaratmaq üçün əlavə paketlərlə:
Conquest Spring Boot - 4
Sonra, əsas pəncərədə cari yerli server ilə işarəni tıkladıqdan sonra mühitin təlimatlarına əməl edərək, qurumumuzun (Qeyd) sahələrinə uyğun olaraq cədvəl diaqramı yaradırıq və onu müvafiq məlumatlarla doldururuq. İstədiyiniz nəticəni uğurla əldə etmək üçün təcili diqqət tələb edən MySQL dialektinin incəliklərini ayrıca aydınlaşdırmaq lazımdır:
  • Ayrı bir Boolean növü yoxdur. İstənilən sorğunun işlənməsi hərəkətləri “doğru” və ya “yanlış”ı müvafiq olaraq “1” və ya “0” bit dəyərinə çevirəcək;
  • Tarix tamamilə Zaman möhürü tipində saxlanılır. Əsasən tanış olan Tarixdən istifadə etsəniz, özünüzü yalnız təqvimdəki mövqe ilə məhdudlaşdırmalı olacaqsınız.
Fəth edən Bahar Çəkməsi - 5
Hazırlıq addımlarını yekunlaşdırdıqdan sonra, alətlər panelindəki "ildırım" işarəsini vuraraq yerli serverə məlumat göndərmək üçün "MySQL Workbench" işarəsini göstəririk. İndi, məlumatın əlavə edilməsi düzgün şəkildə tamamlanıbsa, cari verilənlər bazası konfiqurasiyasını application.properties (adətən “resurslar” kataloqunda yerləşir) əlavə etməklə inkişafı davam etdirmək üçün inamla doğma IDE-yə qayıda bilərik:
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
Və nəhayət qeyd obyektini annotasiyalardan istifadə edərək MySQL-ə bağlamaq. @Cədvəl seçilmiş ad və sxem ilə cədvəlin istifadəsini, @Sütun isə dəyişənlərin xüsusi sahəyə aid olduğunu göstərir.
@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;
   }
}

Baxış və ya istifadəçi interfeysi

Təəssüf ki, etibarlı şəkildə aşağıdakıları deyə bilərik: "Tətbiqin vizuallaşdırılması ən kiçik nəzəri və ya praktiki bilik olmadan əsas büdrəmə olacaq." Açığını deyim ki, ön hissə komponenti ümumi işin heyrətamiz bir hissəsini tutdu və uzun müddət ərzində inamla əsəblərimi sındırdı. Ancaq Thymeleafın heyrətamiz sadəliyi sayəsində bir sıra sehrli məğlubiyyətlərdən sonra uyğun bir kompromis tapmaq mümkün oldu. Əlavə müzakirələr seçilmiş mühərrikdən istifadənin incəlikləri haqqında olacaq, baxmayaraq ki, ümumi konsepsiya oxşar mövqeyə riayət edir. Əsas texnika ən təmiz HTML-dən istifadə etmək və eyni bölmələrin bir neçə dəfə təkrarlanmasının qarşısını almaq üçün ayrı-ayrı fraqmentlərdən yekun ekranı yığmaq bacarığıdır. Fərz edək ki, UI arxitekturası idarəetmə elementləri olan naviqasiya çubuğundan (yeni giriş əlavə etmək, əsas səhifəyə qayıtmaq) və qeydin artan (ASC) ilə əlavə olunduğu vaxta görə çeşidlənmiş obyektləri göstərmək üçün dinamik cədvəldən ibarət əsas səhifədən ibarətdir. və ya azalan (DESC) istiqaməti.mənaları. Gəlin standart olaraq bütün qeydlərin artan qaydada göstərilməsini götürək. Seçilmiş şablon mühərrikinin iyerarxik siyasətinə uyğun olaraq, komponent vizual elementləri “resurslar” kataloqunun “şablonlar” bölməsində yerləşdirilməlidir. Nəticədə, komponentlərlə sonrakı manipulyasiyalar irəli sürülən şərtləri nəzərə alır. Gəlin html5 şablonunda “index” (və ya şəxsi üstünlüklərə görə hər hansı digər ad) adı ilə əsas səhifə yaradaq. Misal üçün:
<!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>
Beləliklə, son tətbiqin əsas komponentlərini parçalayaq. Thymeleaf prosedurların istifadəsini göstərmək üçün ayrıca sintaksisdən istifadə edir və "th:" açar sözü ilə başlayır, kitabxanaya keçid mütləq <html> açılış teqinə daxil edilir.
<div th:if="${not #lists.isEmpty(notes)}">
"Əgər" əməliyyatı adi iş üsullarından tamamilə fərqlənmir və gələn "qeydlər" atributunu sonrakı nümayiş üçün obyektlərin olub-olmaması üçün yoxlayır. Modelin və vizuallaşdırmanın qarşılıqlı əlaqəsini təşkil etmək üçün istifadəsini nəzərə alaraq, Nəzarətçinin istifadəsi ilə mövzunun üst-üstə düşməsini ayrıca qeyd etmək lazımdır. Gələcəkdə bir çox qeyri-müəyyən məqamlar formalaşır, istəsən geri qayıt.
<head th:replace="operations/list :: notebook"></head>
"Əvəz et" əməliyyatı "stub" və ya aktiv blokun cari və ya ayrı səhifədən seçilmiş fraqmentlə dəyişdirilməsini göstərir - sonuncu hal nümunədə aydın şəkildə müşahidə olunur. “Əməliyyatlar” kataloqunun “list.html”-dən “notebook” adlı fraqmenti “index” faylının <div></div>-ə köçürür, son təyinatdakı məzmunu tamamilə əvəz edirik. Çıxan aşağıdakı məzmuna malikdir:
<!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>
Gəlin konstruktiv icmala qayıdaq və istifadə olunan standart HTML sintaksisini və ya qrafik üslublarını buraxaraq və xüsusi olaraq şablon mühərrik mexanizmini başa düşməyə diqqət yetirərək qaydada istifadə olunan Thymeleaf funksiyalarını nəzərdən keçirək.
<div th:fragment="notebook">
“Fraqment” əməliyyatı fraqmentin adını müəyyənləşdirir və “əvəz et” əmri üçün blokun məzmunundan istifadə etməyə imkan verir. Üstəlik! Bir səhifədə birdən çox istifadə heç bir şəkildə istisna edilmir, bu da proqramlaşdırma dillərindəki prosedurlar və ya funksiyalarla bənzətməni yenidən gündəmə gətirir.
<a th:href="@{'/sort/{sortDate}' (sortDate = 'ASC')}">
@PostMapping annotasiyasına zəng Nəzarətçidə “/sort/{sortDate}” xəritələməsi ilə istifadə olunur, burada {sortDate} gedən çeşidləmə istiqaməti atributudur. Bənzər bir şey istifadəçi tərəfindən seçilmiş elementin iterasiya dövrəsindəki mövqeyindən asılı olaraq dinamik dəyişiklik əlavə edən aşağıdakı blokda görünə bilər:
<a th:href="@{'/edit/{id}'(id=${note.id})}">
<tr th:each="note : ${notes}">
Dəyərlərin sadalanması Java sintaksisindəki for blokunun tanış istifadəsinə çox bənzəyir: “qeyd” dəyişəni cari elementi ${notes} giriş atribut massivindən – obyektlər massivindən götürür və dəyərləri dəyişdirmək üçün istifadə olunur. sonra. Açığını deyim ki, biz Thymeleaf-ın geniş imkanlarını praktik tətbiq nümunələri ilə sadalamağa ayrıca məqalə həsr edə bilərik - şablon mühərriki son dərəcə sadədir və əlavə sintaksisin təsirli bir baqajını öyrənməyi tələb etmir. Yuxarıda təsvir edilən funksiyalar tərtibatçıların rəsmi saytındakı texniki sənədlərdə təsvir edilmişdir və arxa tərəflə əlaqənin təşkilində əsas rol oynayır. Beləliklə, növbəti və son hissəyə inamla keçə bilərsiniz. Əlbəttə ki, vizualizasiyanın qalan komponentlərini məqalənin sonunda bitmiş tətbiqə bir keçidə əlavə etməklə.

Nəzarətçi, kiçik bir şirkətdə administrator

"Veb tətbiqinin arxitekturasında təməl daşı" - proqramın işinin təşkilində Nəzarətçi komponentinin əhəmiyyətinin daha dəqiq təsvirini tapmaq üçün bəlkə də bir yol yoxdur: əksər əməliyyatlar dəqiq olaraq proqramlar arasındakı birləşdirici element tərəfindən həyata keçirilir. modeli və görünüşü. Spring Boot-un fəaliyyət mexanikası sayəsində ən kiçik bir problem olmadan xəritələşdirmə və GET/POST sorğu metodlarından inamla istifadə edə və məlumat anbarını avtomatik birləşdirə bilərsiniz. Gəlin NoteController sinfini "nəzarətçilər" qovluğunda ayrıca faylda yaradaq, yenidən müvafiq annotasiyanın istifadəsinə istinad edək:
@Controller
public class NoteController {

   private NoteService service;

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

   @GetMapping("/")
   public String list(Model model) {
       return "index";
   }
}
Diqqətli bir baxış, iş məntiqini verilənlər bazası idarəetmə xidməti ilə işləməkdən təcrid etmək üçün xidmətin əlavə edilməsi ilə bağlı proqram arxitekturasının dizaynında mühüm dəyişikliyi görə bilər. Hazır məhsulun çox yönlülüyünü artırmaq və verilənlər bazası ilə əlaqə üsullarında dəyişiklik etmədən istifadəçi interfeysinin funksionallığını dəyişdirmək üçün geniş imkanlar təmin etmək üçün tamamlanmış tədbirlər tələb olunur. Standart təqdimat heç bir şəkildə oxşarların izdihamından fərqlənmir: interfeys ayrıca bir kataloqda yerləşir və Spring Boot aşkarlanması üçün @Service annotasiyası olan bir sinif tərəfindən həyata keçirilir:
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();
   }
}
Nəzarətçini nəzərdən keçirməyə qayıdaq və Spring Boot metodlarından istifadə edərək işin təşkilinin incəliklərinə baxaq. @Autowired annotasiyası xidməti avtomatik olaraq müvafiq tipli müəyyən dəyişənə bağlamaq və verilənlər bazası ilə əlaqə yaratmaq ehtiyacını göstərir. Localhost:8080-ə zəng qəbul edərkən “index” adlı səhifəni qaytaran @GetMapping("/") annotasiyası ilə göstərilən görünüşün ünsiyyət üsuluna daha çox diqqət yetirilməlidir. Genişləndirilmiş təsviri @RequestMapping(value = "/", method = RequestMethod.GET) göstərərək və ya qaytarma növünü hazır ModelAndView ilə əvəz edərək fərqli yanaşmadan istifadə edə bilərsiniz. Bununla belə, praktiki tətbiqdə mövcud təcrübə vəziyyətinə görə, son nəticədə heç bir əsas fərq görmürəm və adi variantdan istifadə edirəm. Əlavə nişandan istifadə edərək yeni elementlər əlavə etməklə nəzarətçini genişləndirək. İstifadəçi naviqasiya çubuğu elementinə klik etdikdən sonra @GetMapping("/new") çağırılır və "əməliyyatlar" kataloqundan "yeni" səhifəyə yönləndirilir, düymədən istifadə edərək daxil edilmiş məlumatları təsdiq edərkən "mesaj" adlı parametr qaytarılır. və əsas bloka yönləndirmə. Daxiletmə pəncərəsində dəyişən adının ötürülən dəyərin adı ilə tam uyğunlaşdırılması ehtiyacı xüsusi qeyd etməyi tələb edir.
<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:/";
}
Bənzər bir texnika rekordu yeniləmək üçün istifadə olunur. Nəzarət üzərinə kliklədikdən sonra @GetMapping("/edit/{id}") xəritələşdirilməsi çağırılır və URL sətirindən identifikator köçürülür, "qeyd" atributu sonrakı redaktə üçün girişlə əlavə olunur. @RequestParam(dəyər = "edildi", tələb olunur = false) boolean yerinə yetirildi) xüsusi dəyərin göstərilməsi Thymeleaf şablon mühərrikindən istifadə edərkən qeyd qutusunun istifadəsində əsas rol oynayır və defolt olaraq "yanlış" olaraq təyin edilir.
@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:/";
}
Verilənlər bazasından elementləri silmək olduqca sadədir və ötürülən dəyərdən istifadə edərək müvafiq xidmət funksiyasını çağırmaqla heç bir əhəmiyyətli manipulyasiya tələb etmir:
@GetMapping("/delete/{id}")
public String delete(@PathVariable Integer id) {
   service.deleteNote(id);
   return "redirect:/";
}
İndi hazır fraqmentlərə kiçik düzəlişlər edək və Nəzarətçini bağlamazdan əvvəl sadə filtrləməni idarə etmək üçün ayrıca funksiya əlavə edərək, Spring Data JPA-da sorğu sorğularından istifadə edərək MySQL ilə maraqlı ünsiyyətə keçək.
@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;
}

Çox kiçik, lakin çox vacib Sorğu.

Etiraf etmək, dəyərləri süzmək, gözləntilərin əksinə olaraq, texniki tapşırığı yerinə yetirməkdə, səhifələşdirmə ilə müəyyən edilmiş mürəkkəblik həddini inamla aşmaqda başqa bir maneə oldu - məlumat massivinin sonrakı nümayiş üçün müəyyən ölçülü ayrı səhifələrə bölünməsi. Çox güman ki, yığılmış yorğunluq öz təsirini göstərirdi, lakin... Query sorğuları ilə tamamilə təsadüfi qarşılaşmadan sonra ilham gəldi.
public interface NoteRepository extends JpaRepository<Note, Integer> {
   List<Note> findAllByOrderByDateAsc();
   List<Note> findAllByOrderByDateDesc();
}
Spring Data JPA, məlumat qəbul edildikdən sonra çeşidləmək ehtiyacını aradan qaldıran və geniş tətbiq potensialına malik olan yüksək zərif verilənlər bazası sorğuları yaratmaq imkanı verir. Misal üçün:
List<Note> findAllByOrderByDateAsc();
Metod SQL sorğusuna çevriləcək və bütün qeydləri (findAll) tarixə (bySifarişlə) görə artan sıra ilə (Tarixə görə) göstərəcək. Üstəlik, bir tələblə bir çox sahədə mürəkkəb birləşmələr və nümunələr yarada bilərsiniz. Deyin ki, bütün (findAll) tamamlanmış (byDoneTrue) qeydləri tarix dəyərinə (byTarihə) görə azalan (Adalanlar) ardıcıllıqla (byOrder) seçin:
Page<Note> findAllByDoneTrueOrderByDateDesc(Pageable pageable);

Nəticə və ya təcrübəsiz bir proqramçının başqa bir etirafı

Hamısı! Shift+F10 kombinasiyasından istifadə edərək və ya müvafiq ikona klikləməklə veb tətbiqini təhlükəsiz işə sala bilərsiniz. Spring Boot proqramı Apache Maven üzərində quracaq və localhost:8080-də yerli Apache Tomcat serverini quraşdıracaq. İndi hər hansı bir brauzerdə linki izləmək kifayətdir.
Conquest Spring Boot - 6
Və əlbəttə ki, digər biznes tələblərini yerinə yetirmək üçün bir metodologiya hazırlayın. Tətbiqin potensialı tərtibatçının səyi, bacarıqlılığı və təxəyyülü ilə məhdudlaşır.
Conquest Spring Boot - 7
Səmimi olmaq və getdiyim yola diqqət yetirməklə, mən seçdiyim istiqamətin düzgünlüyünə dönə-dönə əmin oluram və JavaRush təhsil portalında təhsil almağın faydalarını dərk edirəm. Müxtəlif praktik tapşırıqlar sayəsində, oxşar istiqamətli bir ali təhsil müəssisəsinin köhnəlmiş və təəccüblü darıxdırıcı proqramında tamamilə sıxışdırılmış proqramlaşdırma öyrənməyə cəlbedici marağı qaytarmaq mümkün oldu. Dörd ay davam edən texnologiya yığınında materialın aktiv şəkildə öyrənilməsi bütün illərlə mühazirə və laboratoriya dərslərində iştirakla müqayisədə daha çox bilik sərf etdi. İnanın ya inanmayın. Mürəkkəb materiala daxil olmaqda çətinliklərə təslim olmamağınızı arzu edirəm, çünki maneələri dəf etməklə biz daha yaxşı oluruq, peşəkar və şəxsi inkişaf edirik. Ümid edirəm ki, bu kiçik hekayə mənə SpringBoot adlı heyrətamiz alətdən istifadə etmək üçün bəzi yeni ideyalar kəşf etməyə kömək etdi. PS Github .
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION