JavaRush /Blog Java /Random-MS /Kasut Musim Bunga Penaklukan
Surplus
Tahap
Москва

Kasut Musim Bunga Penaklukan

Diterbitkan dalam kumpulan
Selamat hari, pembaca yang dikasihi! Dan gembira dapat bertemu dengan anda, walaupun nama yang megah adalah sebab utama untuk melihat topik sederhana tentang kenalan pertama dengan pembangunan Spring Boot. Saya ingin berkongsi pengalaman saya menyelesaikan tugasan pengenalan untuk latihan di portal JavaRush, menyampaikan gambaran keseluruhan dari sisi seorang pelajar universiti teknikal biasa yang ingin menguji kekuatan pengetahuan terkumpulnya. Conquest Spring Boot - 1Saya sama sekali tidak menafikan kemungkinan adanya kekasaran dalam kod atau kaedah pemikiran yang dilampirkan, dan saya mengalu-alukan kritikan yang membina, kerana ia adalah mungkin untuk berkembang ke arah profesional kerana "benjolan dan lebam". Lebih-lebih lagi, saya sama sekali tidak berpura-pura menjadi "penawar" dalam menyelesaikan syarat-syarat yang diberikan dan dengan sengaja meninggalkan serpihan individu program, meninggalkan kepentingan utama untuk memasuki topik yang agak kompleks tanpa akibat sedikit pun untuk sistem saraf. Memang benar, adalah melulu untuk menafikan perkara yang jelas: ia adalah sukar bagi saya dan sama sekali tidak ada yang jelas sehingga saat tertentu. Dan jika anda mengalami perasaan yang sama dari pertemuan pertama dengan tugas itu, maka "Selamat Datang!" Mari kita tulis aplikasi web dalam Spring Boot menggunakan analogi ringkas ujian kemasukan latihan menggunakan enjin templat Thymeleafdan querypertanyaan kepada pelayan MySQL tempatan untuk menapis tatasusunan maklumat yang masuk. Jadi mari kita mulakan!

Kasut Musim Bunga. Apakah jenis haiwan itu dan cara memasaknya?

Secara ringkas dan padat, ia adalah alat yang sangat baik daripada Pivotel untuk menjimatkan masa yang berharga dalam proses mencipta aplikasi, menghapuskan keperluan untuk menyambung terus perpustakaan pihak ketiga, menulis kanvas pemetaan dan servlet yang mengagumkan. Ia cukup untuk menggunakan pembina Spring Initializr , disepadukan ke dalam IntelliJ IDEA Ultimate Edition (Fail - Baharu - Projek... - Spring Initializr) atau terletak pada perkhidmatan web start.spring.io , menetapkan pakej untuk disertakan daripada pelbagai tawaran.
Conquest Spring Boot - 2
Mengikut spesifikasi teknikal yang dikemukakan, kami akan menggunakan set gentleman, standard untuk mencipta aplikasi web mudah menggunakan pangkalan data MySQL :
  • WEB ialah komponen utama untuk membangunkan aplikasi web, termasuk pelayan Apache Tomcat tempatan pada alamat standard localhost:8080 dan rangka kerja Spring MVC universal.

  • DevTools - digunakan untuk memulakan semula aplikasi dengan cepat dalam JVM panas apabila perubahan dikesan dalam kod atau templat yang disusun; Selain itu, ia membebaskan Thymeleaf daripada mengosongkan cache jika enjin yang dipilih disertakan dalam projek.

  • JPA ialah teknologi yang diperlukan untuk bekerja dengan pangkalan data dan menyediakan pemetaan objek-hubungan objek Java, menyediakan API ( Hibernate dalam kes kami) untuk mengurus, menyimpan dan mendapatkan semula entiti.

  • Thymeleaf (Mustache, AngularJS, Vaadin dan seterusnya) - enjin templat untuk visualisasi aplikasi; Terima kasih kepada kebiasaan relatif saya dengan prinsip html, saya memilih Thymeleaf, yang mendorong bahasa itu ke asas dunia.

  • MySQL - menghubungkan pemacu Kesambungan Pangkalan Data Java untuk melaksanakan pertanyaan SQL terhadap pangkalan data.
Selepas pemilihan akhir komponen dan penciptaan, kami mendapat seni bina aplikasi web biasa dengan direktori sedia untuk diisi selanjutnya. Serpihan untuk berinteraksi dengan bahagian visual, sama ada gaya grafik CSS, halaman HTML standard atau kefungsian JavaScript, harus diletakkan dalam "sumber", dan komponen bahagian belakang, sewajarnya, dimaksudkan untuk diletakkan dalam "java". Kita juga harus memberi perhatian kepada fail pom.xml dalam julat akar, yang menyimpan struktur projek dan kebergantungan antara komponen. Jika anda ingin mengembangkan lagi fungsi dengan pakej tambahan atau mengalih keluar perkara yang tidak perlu, anda harus melakukan manipulasi antara teg <dependencies></dependencies>mengikut kaedah yang serupa.
Conquest Spring Boot - 3

Langkah pertama menuju masa depan yang hebat

Seterusnya, persoalan yang agak menarik dan agak logik timbul: "Apa yang perlu dilakukan sekarang? Bagaimana ini akan berfungsi? Program ini dibina berdasarkan prinsip Model-View-Controller: ia mengatur bacaan entiti daripada pangkalan data yang disambungkan (Model) dan dipaparkan dalam antara muka pengguna dengan kawalan (View); komunikasi antara komponen dan pelaksanaan tindakan mengikut permintaan yang dihantar dilakukan terima kasih kepada Pengawal. Ia adalah penciptaan elemen utama yang berfungsi sebagai titik rujukan untuk pembangunan berterusan. Untuk mengelakkan cerun yang licin dan mengekalkan rasa hormat rakan-rakan anda dalam bidang kerja, anda harus meletakkan komponen dalam direktori yang sesuai (contohnya, letakkan fail Pengawal dalam folder pengawal dalam cawangan "java") dan simpan dengan teliti pesanan di tempat kerja.

Intipati adalah bahagian kecil dalam mekanisme yang besar

Atau dengan kata lain, Model kami mengikut syarat yang ditetapkan dalam masalah. Bertolak dari topik perbincangan dan kembali ke projek pengenalan, kami dengan yakin boleh menegaskan bahawa terdapat perbezaan minimum antara tugas dan mematuhi konsep purata dalam semakan lanjut. Katakan, nota dalam buku nota, termasuk:
  • Nombor pengenalan untuk menentukan lokasi dalam aliran umum;
  • Mesej teks bilangan aksara tertentu;
  • Tarikh pengguna menambahkannya ke senarai umum;
  • Pembolehubah Boolean untuk menentukan "Selesai atau belum selesai" ("Baca atau tidak baca").
Oleh itu, mari buat kelas Nota dalam direktori yang dipanggil "entiti" dan tambah medan yang sesuai:
@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;
   }
}
Satu lagi penyimpangan dari topik perbincangan untuk pemahaman yang lebih besar tentang apa yang berlaku dari kedudukan teori. Sambungan antara komponen dalam Spring ditentukan oleh anotasi - penunjuk khas di hadapan objek, setiap satunya memainkan peranan khusus dalam mekanisme dan bermula dengan simbol "@". Anotasi @Entity menunjukkan kepada Spring Boot bahawa data kelas berikutnya adalah milik "Entity", dan @Id dan @GeneratedValue menentukan medan yang dipilih sebagai pengecam dengan penjanaan automatik lelaran apabila memproses tatasusunan maklumat. Saya sengaja meninggalkan penambahan Getter dan Setter standard untuk meningkatkan kekompakan format visual. Seterusnya, dengan mengambil kira penggunaan pangkalan data untuk menyimpan rekod, kami meneruskan ke langkah seterusnya dalam pembangunan aplikasi: kami akan mencipta antara muka NoteRepository dalam direktori "repositori", elemen penyambung dalam rantaian pertukaran, dan mewarisi yang paling banyak. repositori yang sesuai untuk kerja selanjutnya, menunjukkan entiti yang disimpan dan iterator integer untuk diakses.
public interface NoteRepository extends JpaRepository<Note, Integer> {
}
Sebenarnya, itu sahaja. Ringkas dan padat. Sekarang Spring Boot akan menggunakan komponen yang dicipta untuk mengatur interaksi dengan pangkalan data. Terdapat banyak jenis repositori warisan dengan potensi tindakan yang berbeza-beza. JpaRepository berada di bahagian atas tangga dan mempunyai potensi yang paling tinggi, termasuk CrudRepository dan PageAndSortingRepository di bawah. Kami tidak akan pergi lebih jauh dan menyimpang daripada topik, kerana beberapa kehalusan boleh didapati di tapak web Pivotel dalam dokumentasi teknikal. Sekarang, selepas melaksanakan imej data dan menentukan kaedah komunikasi di sisi aplikasi, anda perlu memberi perhatian untuk mencipta pangkalan data MySQL dalam persekitaran luaran yang sesuai "MySQL Workbench", yang telah dipasang pada platform desktop dalam perhimpunan dari pemaju rasmi dengan pakej tambahan untuk mencipta pelayan tempatan:
Kasut Musim Bunga Penaklukan - 4
Seterusnya, mengikut arahan persekitaran selepas mengklik pada ikon dengan pelayan tempatan semasa dalam tetingkap utama, kami membuat gambar rajah jadual mengikut medan entiti kami (Nota) dan mengisinya dengan data yang sesuai. Ia adalah perlu untuk menjelaskan secara berasingan kehalusan dialek MySQL, yang memerlukan perhatian segera untuk berjaya mencapai hasil yang diinginkan:
  • Tiada jenis Boolean yang berasingan seperti itu. Sebarang tindakan pemprosesan permintaan akan menukar "benar" atau "salah" kepada nilai bit "1" atau "0", masing-masing;
  • Tarikh disimpan sepenuhnya dalam jenis Cap Waktu. Jika anda menggunakan Tarikh, yang biasa kepada inti, anda perlu mengehadkan diri anda kepada kedudukan dalam kalendar sahaja.
Kasut Musim Bunga Penaklukan - 5
Selepas selesai langkah persediaan, kami menunjukkan "MySQL Workbench" untuk menghantar data ke pelayan tempatan dengan mengklik ikon "kilat" pada bar alat. Sekarang, jika penambahan maklumat telah dilengkapkan dengan betul, kami dengan yakin boleh kembali ke IDE asli kami untuk meneruskan pembangunan dengan menambahkan konfigurasi pangkalan data semasa pada application.properties (biasanya terletak dalam direktori "sumber"):
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
Dan akhirnya mengikat entiti Nota ke MySQL menggunakan anotasi. @Table menunjukkan penggunaan jadual dengan nama dan skema yang dipilih, dan @Column menunjukkan bahawa pembolehubah tergolong dalam medan tertentu.
@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;
   }
}

Lihat atau antara muka pengguna

Malangnya, kita boleh mengatakan perkara berikut dengan selamat: "Visualisasi aplikasi akan menjadi batu penghalang utama tanpa pengetahuan teori atau praktikal sedikit pun." Sejujurnya, komponen bahagian hadapan mengambil jumlah yang menakjubkan daripada jumlah kerja dan dengan yakin meruncingkan saraf saya dalam jangka masa yang panjang. Tetapi terima kasih kepada kesederhanaan menakjubkan Thymeleaf, adalah mungkin untuk mencari kompromi yang sesuai selepas beberapa siri kekalahan yang mempesonakan. Perbincangan selanjutnya adalah mengenai selok-belok menggunakan enjin yang dipilih, walaupun konsep umum mematuhi kedudukan yang sama. Teknik utama ialah keupayaan untuk menggunakan HTML yang paling tulen dan memasang paparan akhir daripada serpihan individu untuk mengelakkan pengulangan berbilang bahagian yang sama. Katakan seni bina UI terdiri daripada halaman utama yang terdiri daripada bar navigasi dengan kawalan (tambah entri baharu, kembali ke halaman utama) dan jadual dinamik untuk memaparkan entiti yang diisih mengikut masa nota ditambahkan sama ada menaik (ASC) atau menurun ( DESC) arah.maksud. Mari kita ambil sebagai kedudukan standard paparan semua rekod dalam susunan menaik. Menurut dasar hierarki enjin templat yang dipilih, elemen visualisasi komponen harus terletak pada cawangan "templat" dalam direktori "sumber". Akibatnya, manipulasi lanjut dengan komponen mengambil kira syarat yang dikemukakan. Mari buat halaman utama dengan nama "indeks" (atau mana-mana nama lain mengikut keutamaan peribadi) pada templat html5. Sebagai contoh:
<!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>
Oleh itu, mari kita pecahkan komponen utama aplikasi akhir. Thymeleaf menggunakan sintaks yang berasingan untuk menunjukkan penggunaan prosedur dan bermula dengan kata kunci "th:", pautan ke perpustakaan yang semestinya disertakan dalam teg <html> pembukaan.
<div th:if="${not #lists.isEmpty(notes)}">
Operasi "jika" sama sekali tidak berbeza daripada cara biasa melakukan sesuatu dan menyemak atribut "nota" masuk untuk kehadiran objek untuk paparan selanjutnya. Perlu dinyatakan secara berasingan pertindihan topik dengan penggunaan Pengawal, dengan mengambil kira penggunaannya untuk mengatur interaksi model dan visualisasi. Banyak momen yang samar-samar terbentuk pada masa hadapan, balik sahaja jika anda mahu.
<head th:replace="operations/list :: notebook"></head>
Operasi "ganti" menunjukkan penggantian "stub" atau blok aktif dengan serpihan yang dipilih dari halaman semasa atau berasingan - kes kedua jelas diperhatikan dalam contoh. Kami menyalin serpihan yang dipanggil "buku nota" daripada "list.html" direktori "operasi" ke dalam <div></div> fail "indeks", menggantikan sepenuhnya kandungan di destinasi akhir. Yang keluar mempunyai kandungan berikut:
<!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>
Mari kembali kepada gambaran keseluruhan yang membina dan semak fungsi Thymeleaf yang digunakan mengikut tertib, mengetepikan sintaks HTML standard atau gaya grafik yang digunakan, dan memfokuskan secara khusus untuk memahami mekanisme enjin templat.
<div th:fragment="notebook">
Operasi "serpihan" menentukan nama serpihan dan memungkinkan untuk menggunakan kandungan blok untuk arahan "ganti". Lebih-lebih lagi! Berbilang kegunaan dalam satu halaman sama sekali tidak dikecualikan, sekali lagi mengemukakan analogi dengan prosedur atau fungsi dalam bahasa pengaturcaraan.
<a th:href="@{'/sort/{sortDate}' (sortDate = 'ASC')}">
Panggilan ke anotasi @PostMapping digunakan dalam Pengawal dengan pemetaan "/sort/{sortDate}", dengan {sortDate} ialah atribut arah isihan keluar. Sesuatu yang serupa boleh dilihat dalam blok berikut, yang menambah perubahan dinamik bergantung pada kedudukan elemen yang dipilih pengguna dalam gelung lelaran:
<a th:href="@{'/edit/{id}'(id=${note.id})}">
<tr th:each="note : ${notes}">
Menghitung nilai sangat serupa dengan penggunaan biasa bagi blok dalam sintaks Java: pembolehubah "nota" mengambil elemen semasa daripada tatasusunan atribut input ${notes}—susunan entiti—dan digunakan untuk menukar nilai nanti. Sejujurnya, kami boleh mendedikasikan artikel berasingan untuk menyenaraikan rangkaian luas keupayaan Thymeleaf dengan contoh aplikasi praktikal - enjin templat sangat mudah dan tidak memerlukan pembelajaran sama sekali dengan sintaks tambahan yang mengagumkan. Fungsi yang diterangkan di atas digariskan dalam dokumentasi teknikal di tapak web rasmi pembangun dan merupakan kepentingan utama dalam mengatur komunikasi dengan bahagian belakang. Oleh itu, anda dengan yakin boleh meneruskan ke bahagian seterusnya dan terakhir. Sudah tentu, dengan melampirkan baki komponen visualisasi dalam pautan ke aplikasi siap pada akhir artikel.

Pengawal, pentadbir di sebuah syarikat kecil

"Batu asas dalam seni bina aplikasi web" - mungkin tidak ada cara untuk mencari penerangan yang lebih tepat tentang kepentingan komponen Pengawal dalam mengatur kerja program: kebanyakan operasi dijalankan dengan tepat oleh elemen penghubung antara model dan pandangan. Terima kasih kepada mekanik tindakan Spring Boot, anda dengan yakin boleh menggunakan kaedah permintaan pemetaan dan GET/POST tanpa masalah sedikit pun, dan menyambungkan repositori data secara automatik. Mari buat kelas NoteController dalam fail berasingan dalam direktori "pengawal", sekali lagi merujuk kepada penggunaan anotasi yang sesuai:
@Controller
public class NoteController {

   private NoteService service;

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

   @GetMapping("/")
   public String list(Model model) {
       return "index";
   }
}
Mata yang teliti mungkin melihat perubahan penting dalam reka bentuk seni bina aplikasi yang dikaitkan dengan penambahan perkhidmatan untuk mengasingkan logik perniagaan daripada bekerja dengan perkhidmatan pengurusan pangkalan data. Tindakan yang telah selesai diperlukan untuk meningkatkan fleksibiliti produk siap dan menyediakan skop yang luas untuk menukar kefungsian antara muka pengguna tanpa memerlukan perubahan dalam kaedah komunikasi dengan pangkalan data. Perwakilan standard sama sekali tidak menonjol daripada orang ramai yang serupa: antara muka terletak dalam direktori yang berasingan dan dilaksanakan oleh kelas dengan anotasi @Service untuk pengesanan 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();
   }
}
Mari kita kembali menyemak pengawal dan lihat selok-belok mengatur kerja menggunakan kaedah Spring Boot. Anotasi @Autowired menunjukkan keperluan untuk mengikat perkhidmatan secara automatik kepada pembolehubah tertentu daripada jenis yang sesuai dan mewujudkan sambungan dengan pangkalan data. Perhatian yang lebih harus diberikan kepada cara paparan berkomunikasi, ditunjukkan oleh anotasi @GetMapping("/"), yang mengembalikan halaman bernama "index" apabila menerima panggilan ke localhost:8080. Anda boleh menggunakan pendekatan yang berbeza, dengan menyatakan huraian lanjutan @RequestMapping(value = "/", method = RequestMethod.GET) atau menggantikan jenis return dengan ModelAndView siap sedia. Walau bagaimanapun, mengikut keadaan semasa pengalaman dalam aplikasi praktikal, saya tidak melihat sebarang perbezaan asas dalam hasil akhir dan menggunakan pilihan biasa. Mari kembangkan pengawal dengan menambah elemen baharu menggunakan tab tambahan. Selepas pengguna mengklik pada elemen bar navigasi, @GetMapping("/new") dipanggil dan diubah hala ke halaman "baharu" daripada direktori "operasi", mengembalikan parameter bernama "mesej" apabila mengesahkan data yang dimasukkan menggunakan butang dan mengubah hala ke blok utama. Keperluan untuk padanan lengkap nama pembolehubah dalam tetingkap input dengan nama nilai yang dipindahkan memerlukan sebutan khusus.
<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:/";
}
Teknik yang sama digunakan untuk mengemas kini rekod. Selepas mengklik pada kawalan, pemetaan @GetMapping("/edit/{id}") dipanggil dan pengecam daripada rentetan URL dipindahkan, atribut "nota" ditambah dengan entri untuk pengeditan selanjutnya. @RequestParam(value = "done", required = false) boolean done) menyatakan nilai tertentu memainkan peranan penting dalam penggunaan kotak semak apabila menggunakan enjin templat Thymeleaf dan ditetapkan kepada "false" secara lalai.
@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:/";
}
Mengalih keluar item daripada pangkalan data adalah sangat mudah dan tidak memerlukan sebarang manipulasi penting dengan memanggil fungsi perkhidmatan yang sesuai menggunakan nilai yang diluluskan:
@GetMapping("/delete/{id}")
public String delete(@PathVariable Integer id) {
   service.deleteNote(id);
   return "redirect:/";
}
Sekarang mari kita buat pelarasan kecil pada serpihan yang telah siap dan teruskan kepada komunikasi yang menarik dengan MySQL menggunakan pertanyaan pertanyaan dalam Spring Data JPA, secara berasingan menambah fungsi untuk menguruskan penapisan mudah sebelum menutup Pengawal.
@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;
}

Soal kecil, tetapi sangat penting.

Sungguh memalukan untuk mengakui, menapis nilai, bertentangan dengan jangkaan, ternyata menjadi satu lagi batu penghalang dalam memenuhi tugas teknikal, dengan yakin mengatasi ambang kerumitan yang ditetapkan oleh penomboran - memecahkan tatasusunan data ke dalam halaman berasingan dengan saiz tertentu untuk paparan selanjutnya. Kemungkinan besar, keletihan yang terkumpul telah mengambil kesan, tetapi... inspirasi datang selepas pertemuan dengan pertanyaan Pertanyaan secara tidak sengaja.
public interface NoteRepository extends JpaRepository<Note, Integer> {
   List<Note> findAllByOrderByDateAsc();
   List<Note> findAllByOrderByDateDesc();
}
Spring Data JPA menyediakan keupayaan untuk mencipta pertanyaan pangkalan data yang sangat berbutir yang menghapuskan keperluan untuk mengisih maklumat setelah ia diterima dan mempunyai pelbagai potensi aplikasi. Sebagai contoh:
List<Note> findAllByOrderByDateAsc();
Kaedah ini akan ditukar kepada pertanyaan SQL dan memaparkan semua rekod (findAll) diisih (mengikut Pesanan) mengikut tarikh (mengikutTarikh) dalam susunan menaik (Asc). Selain itu, anda boleh membuat kombinasi dan sampel yang kompleks merentas banyak medan dengan satu keperluan. Katakan, pilih semua (cariSemua) rekod yang telah siap (olehDoneTrue) mengikut susunan (mengikut Perintah) menurun (Dis) mengikut nilai tarikh (mengikutTarikh):
Page<Note> findAllByDoneTrueOrderByDateDesc(Pageable pageable);

Kesimpulan atau pengakuan lain dari pengaturcara baru

Semua! Anda boleh melancarkan aplikasi web dengan selamat menggunakan kombinasi Shift+F10 atau dengan mengklik pada ikon yang sepadan. Spring Boot akan membina program pada Apache Maven dan memasang pelayan Apache Tomcat tempatan di localhost:8080. Kini anda hanya perlu mengikuti pautan dalam mana-mana pelayar.
Kasut Musim Bunga Penaklukan - 6
Dan, sudah tentu, bangunkan metodologi untuk memenuhi keperluan perniagaan lain. Potensi aplikasi dihadkan oleh usaha, kepintaran dan imaginasi pembangun.
Kasut Musim Bunga Penaklukan - 7
Berterus terang dan memberi perhatian kepada laluan yang dilalui, saya sekali lagi yakin dengan ketepatan arah yang dipilih dan menyedari faedah belajar di portal pendidikan JavaRush. Terima kasih kepada pelbagai tugas praktikal, adalah mungkin untuk mengembalikan minat memikat dalam pembelajaran pengaturcaraan, yang telah ditindas sepenuhnya dalam program lapuk dan menghairankan membosankan institusi pendidikan tinggi dengan arah yang sama. Empat bulan mempelajari bahan secara aktif dalam timbunan teknologi bahagian belakang melaburkan lebih banyak pengetahuan berbanding sepanjang tahun menghadiri kuliah dan kelas makmal. Percaya atau tidak. Saya berharap anda tidak menyerah kepada kesukaran memasuki bahan yang kompleks, kerana melalui mengatasi halangan-halangan kita menjadi lebih baik dan berkembang secara profesional dan peribadi. Saya harap cerita kecil ini telah membantu saya menemui beberapa idea baharu untuk menggunakan alat hebat yang dipanggil SpringBoot. PS Github .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION