JavaRush/Java Π±Π»ΠΎΠ³/Random/Π—Π°Π²ΠΎΠ΅Π²Π°Π½ΠΈΠ΅ Spring Boot
Surplus
37 ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ

Π—Π°Π²ΠΎΠ΅Π²Π°Π½ΠΈΠ΅ Spring Boot

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ Random
участников
Π”ΠΎΠ±Ρ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ суток, ΡƒΠ²Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΉ Π§ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ! И приятно ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ, Π΄Π°ΠΆΠ΅ Ссли основной ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² ΡΠΊΡ€ΠΎΠΌΠ½ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌ знакомствС с Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π½Π° Spring Boot послуТило ΠΏΠΎΠΌΠΏΠ΅Π·Π½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅. Π₯ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ выполнСния Π²ΡΡ‚ΡƒΠΏΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ задания для стаТировки Π½Π° ΠΏΠΎΡ€Ρ‚Π°Π»Π΅ JavaRush, излагая ΠΎΠ±ΠΎΠ·Ρ€Π΅Π½ΠΈΠ΅ со стороны Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠ±Ρ‹ΠΊΠ½ΠΎΠ²Π΅Π½Π½ΠΎΠ³ΠΎ студСнта тСхничСского унивСрситСта, ΠΆΠ΅Π»Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½Ρ‹Π΅ знания. Π—Π°Π²ΠΎΠ΅Π²Π°Π½ΠΈΠ΅ Spring Boot - 1Никоим ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ ΠΎΡ‚Ρ€ΠΈΡ†Π°ΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ грубости Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ΅ ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΡ, ΠΈ ΠΏΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ΠΊΡ€ΠΈΡ‚ΠΈΠΊΡƒ, вСдь ΠΈΠΌΠ΅Π½Π½ΠΎ благодаря β€œΡˆΠΈΡˆΠΊΠ°ΠΌ ΠΈ ссадинам” удаСтся Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ ΠΏΡ€Π΅Ρ‚Π΅Π½Π΄ΡƒΡŽ Π½Π° Π·Π²Π°Π½ΠΈΠ΅ β€œΠΏΠ°Π½Π°Ρ†Π΅ΠΈβ€ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ поставлСнных условий ΠΈ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ ΡƒΠΏΡƒΡΠΊΠ°ΡŽ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, оставляя ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ Π±Π΅Π· ΠΌΠ°Π»Π΅ΠΉΡˆΠΈΡ… послСдствий для Π½Π΅Ρ€Π²Π½ΠΎΠΉ систСмы. Π’Π΅Ρ€Π½ΠΎ, ΠΎΠΏΡ€ΠΎΠΌΠ΅Ρ‚Ρ‡ΠΈΠ²ΠΎ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ΅: ΠΌΠ½Π΅ Π±Ρ‹Π»ΠΎ тяТСло ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ понятно Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°. И Ссли Π’Ρ‹ испытываСтС схоТиС ощущСния ΠΎΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠΉ встрСчи с Π·Π°Π΄Π°Π½ΠΈΠ΅ΠΌ, Ρ‚ΠΎ β€œΠ”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ!”. НапишСм web-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Spring Boot ΠΏΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠΉ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ Π²ΡΡ‚ΡƒΠΏΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ тСста Π½Π° стаТировку с использованиСм двигатСля шаблонов Thymeleaf ΠΈ query-запросами Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр MySQL для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ входящСго массива ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ‡Π½Π΅ΠΌ ΠΆΠ΅!

Spring Boot. Π§Ρ‚ΠΎ Π·Π° Π·Π²Π΅Ρ€ΡŒ ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ?

Если ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎ, β€” Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½Ρ‹ΠΉ инструмСнт ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Pivotel для сохранСния Π΄Ρ€Π°Π³ΠΎΡ†Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² процСссС создания прилоТСния, ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ прямого ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, написания Π²Π½ΡƒΡˆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΠΎΡ‚Π½Π° мапирования ΠΈ сСрвлСтов. Достаточно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ сборщиком Spring Initializr, ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π² IntelliJ IDEA Ultimate Edition (File - New - Project... - Spring Initializr) ΠΈΠ»ΠΈ располоТСнном Π½Π° web-сСрвисС start.spring.io, указывая ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ· ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ пСрСчня ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
Π—Π°Π²ΠΎΠ΅Π²Π°Π½ΠΈΠ΅ Spring Boot - 2
БлСдуя Π²Ρ‹Π΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠΌΡƒ тСхничСскому заданию, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π΄ΠΆΠ΅Π½Ρ‚Π»ΡŒΠΌΠ΅Π½ΡΠΊΠΈΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ, стандартным для создания простого web-прилоТСния с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ использования Π±Π°Π·Ρ‹ MySQL:
  • WEB β€” основной ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ web-прилоТСния, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр Apache Tomcat ΠΏΠΎ стандартному адрСсу localhost:8080 ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Spring MVC.

  • DevTools β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для быстрого пСрСзапуска прилоТСния Π² горячСй JVM ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² скомпилированном ΠΊΠΎΠ΄Π΅ ΠΈΠ»ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ…; Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ освобоТдаСт ΠΎΡ‚ очистки cache Ρƒ Thymeleaf, Ссли Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

  • JPA β€” тСхнология трСбуСтся для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ обСспСчиваСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-рСляционноС ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Java ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², прСдоставляСт API (Hibernate Π² нашСм случаС) для управлСния, сохранСния ΠΈ получСния сущностСй.

  • Thymeleaf (Mustache, AngularJS, Vaadin ΠΈ Π΄Π°Π»Π΅Π΅) β€” Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ шаблонов для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ прилоТСния; благодаря ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ знакомству с ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ html остановил Π²Ρ‹Π±ΠΎΡ€ Π½Π° Thymeleaf, Π²Ρ‹Π΄Π²ΠΈΠ½ΡƒΠ²ΡˆΠ΅ΠΌΡƒ язык Π½Π° ΠΊΡ€Π°Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ столп ΠΌΠΈΡ€Π°.

  • MySQL β€” ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° Java Database Connectivity для выполнСния SQL-запросов ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….
ПослС ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π±ΠΎΡ€Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈ создания ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠ±Ρ‹ΠΊΠ½ΠΎΠ²Π΅Π½Π½ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ web-прилоТСния с Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ для дальнСйшСго наполнСния дирСкториями. Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ для взаимодСйствия с Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ, Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ графичСскиС стили CSS, стандартныС страницы HTML ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» JavaScript, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π² β€œresources”, Π° back-end ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ, соотвСтствСнно, подразумСваСтся для размСщСния Π² β€œjava”. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ„Π°ΠΉΠ» pom.xml Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅, хранящий структуру ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ. Если трСбуСтся Π² дальнСйшСм Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ лишнСС, Ρ‚ΠΎ слСдуСт провСсти манипуляции ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π΅Π³ΠΎΠ² <dependencies></dependencies> согласно схоТСго ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.
Π—Π°Π²ΠΎΠ΅Π²Π°Π½ΠΈΠ΅ Spring Boot - 3

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ шаги Π² большоС Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅

Π”Π°Π»Π΅Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ довольно интСрСсный ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ обоснованный вопрос: β€œΠ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ? Как это Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ?”. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° строится Π½Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… Model-View-Controller: ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅Ρ‚ считываниС сущностСй ΠΈΠ· ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… (Model) ΠΈ отобраТаСтся Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ интСрфСйсС с элСмСнтами управлСния (View); связь ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ дСйствий согласно ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… запросов выполняСтся благодаря Controller. ИмСнно созданиС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… элСмСнтов слуТит ΠΎΠΏΠΎΡ€Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ для продолТСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π”Π°Π±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ скользкой Π΄ΠΎΡ€ΠΎΠΆΠΊΠΈ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΡƒΠ²Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ²Π°Ρ€ΠΈΡ‰Π΅ΠΉ Π½Π° Ρ‚Ρ€ΡƒΠ΄ΠΎΠ²ΠΎΠΌ ΠΏΠΎΠΏΡ€ΠΈΡ‰Π΅, слСдуСт Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… дирСкториях (скаТСм, ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» Controller Π² ΠΏΠ°ΠΏΠΊΡƒ controllers Π² Π²Π΅Ρ‚ΠΊΡƒ β€œjava”) ΠΈ Π±Π΅Ρ€Π΅ΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ порядок Π½Π° Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ мСстС.

Π‘ΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ β€” малСнькая Π΄Π΅Ρ‚Π°Π»ΡŒ Π² большом ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ΅

Или ΠΈΠ½Π°Ρ‡Π΅ β€” наша МодСль согласно поставлСнных Π² Π·Π°Π΄Π°Ρ‡Π΅ условий. ΠžΡ‚ΡΡ‚ΡƒΠΏΠ°Ρ ΠΎΡ‚ Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ обсуТдСния ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ Π²ΡΡ‚ΡƒΠΏΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… различиях ΠΌΠ΅ΠΆΠ΄Ρƒ заданиями ΠΈ ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² дальнСйшСм ΠΎΠ±ΠΎΠ·Ρ€Π΅Π½ΠΈΠΈ усрСднСнной ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ. Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, Π·Π°ΠΌΠ΅Ρ‚ΠΎΠΊ Π² записной ΠΊΠ½ΠΈΠΆΠΊΠ΅, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ…:
  • Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ для опрСдСлСния располоТСния Π² ΠΎΠ±Ρ‰Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅;
  • ВСкстовоС сообщСниС ΠΈΠ· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ количСства символов;
  • Π”Π°Ρ‚Ρƒ добавлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π² ΠΎΠ±Ρ‰Π΅ΠΉ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ;
  • Π›ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ для опрСдСлСния β€œΠ‘Π΄Π΅Π»Π°Π½ΠΎ ΠΈΠ»ΠΈ Π½Π΅ сдСлано” (β€œΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ ΠΈΠ»ΠΈ Π½Π΅ прочитано”).
Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, создадим класс Note Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ β€œentity” ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ поля:
@Entity
public class Note {

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

   public Note() {
   }

   public Note(String message) {
       this.message = message;
       this.date = new Date();
       this.done = false;
   }
}
ΠžΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ΅ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Ρ‚Π΅ΠΌΡ‹ обсуТдСния для большСго понимания происходящСго с тСорСтичСской ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Бвязь ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ Π² Spring задаСтся аннотациями, - ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ указатСлями ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… выполняСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ΅ ΠΈ начинаСтся символом β€œ@”. Аннотация @Entity ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Spring Boot Π½Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… класса ΠΊ β€œΠ‘ΡƒΡ‰Π½ΠΎΡΡ‚ΠΈβ€, Π° @Id ΠΈ @GeneratedValue Π·Π°Π΄Π°ΡŽΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ с автоматичСской Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ массива ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΡƒΠΏΡƒΡΠΊΠ°ΡŽ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ стандартных Getter and Setter для увСличСния компактности Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°. Π”Π°Π»Π΅Π΅, принимая Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ использованиС Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… для хранСния записСй, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΡΡ‚ΡƒΠΏΠ΅Π½ΡŒ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ прилоТСния: создадим Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ β€œrepository” интСрфСйс NoteRepository, - ΡΠ²ΡΠ·ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΎΠ±ΠΌΠ΅Π½Π°, - ΠΈ унаслСдуСм Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ подходящий для дальнСйшСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ сущности ΠΈ цСлочислСнного ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° для обращСния.
public interface NoteRepository extends JpaRepository<Note, Integer> {
}
БобствСнно, всё. ΠšΡ€Π°Ρ‚ΠΊΠΎ ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Spring Boot Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ созданный ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ взаимодСйствий с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠΎΠ² наслСдуСмых Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΠΎΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ дСйствия. JpaRepository находится Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ лСстницы ΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ самым большим ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΠΎΠΌ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ниТСстоящиС CrudRepository ΠΈ PageAndSortingRepository. Π‘ΠΎΠ»Π΅Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΠ³Π»ΡƒΠ±Π»ΡΡ‚ΡŒΡΡ ΠΈ ΠΎΡ‚Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ Ρ‚Π΅ΠΌΡ‹, вСдь ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ тонкости ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π½Π° сайтС Pivotel Π² тСхничСской Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, послС воплощСния ΠΎΠ±Ρ€Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ указания способов связи Π½Π° сторонС прилоТСния, трСбуСтся ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° созданиС Π±Π°Π·Ρ‹ MySQL Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ внСшнСй срСдС β€œMySQL Workbench”, Π·Π°Ρ€Π°Π½Π΅Π΅ установлСнной Π½Π° Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ Π² сборкС ΠΎΡ‚ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ для создания локального сСрвСра:
Π—Π°Π²ΠΎΠ΅Π²Π°Π½ΠΈΠ΅ Spring Boot - 4
Π”Π°Π»Π΅Π΅, слСдуя Π·Π° указаниями срСды послС наТатия Π½Π° ΠΈΠΊΠΎΠ½ΠΊΡƒ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ сСрвСром Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΎΠΊΠ½Π΅, создаСм схСму Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ согласно ΠΏΠΎΠ»Π΅ΠΉ нашСй сущности (Note) ΠΈ заполняСм Π΅Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ тонкости Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚Π° MySQL, настойчиво Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ внимания для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ достиТСния ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°:
  • ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΡƒΠ»Π΅Π²Π° Ρ‚ΠΈΠΏΠ° ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Π½Π΅ сущСствуСт. Π›ΡŽΠ±Ρ‹Π΅ дСйствия с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ запросов ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ β€œtrue” ΠΈΠ»ΠΈ β€œfalse” Π² Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€œ1” ΠΈΠ»ΠΈ β€œ0” соотвСтствСнно;
  • Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Ρ‚Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ происходит Π² Ρ‚ΠΈΠΏΠ΅ Timestamp. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΉ Π΄ΠΎ ΠΌΠΎΠ·Π³Π° костСй Date, Ρ‚ΠΎ придСтся ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒΡΡ лишь ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² ΠΊΠ°Π»Π΅Π½Π΄Π°Ρ€Π΅.
Π—Π°Π²ΠΎΠ΅Π²Π°Π½ΠΈΠ΅ Spring Boot - 5
ПослС ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выполнСния ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… дСйствий, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ β€œMySQL Workbench” Π½Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ Π½Π° Π·Π½Π°Ρ‡ΠΎΠΊ с β€œΠΌΠΎΠ»Π½ΠΈΠ΅ΠΉβ€ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ инструмСнтов. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π² Ρ€ΠΎΠ΄Π½ΡƒΡŽ IDE для дальнСйшСго продолТСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, добавляя ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π±Π°Π·Ρ‹ Π² application.properties (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, располагаСтся Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ β€œresources”):
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
И ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ привязывая ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ Note ΠΊ MySQL с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ. @Table ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° использованиС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ с Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ схСмой, Π° @Column - ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ полю.
@Entity
@Table(name = "test", schema = "test", catalog = "")
public class Note {

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

   public Note() {
   }

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

Π’ΠΈΠ΄ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс

Π£Π²Ρ‹, ΠΌΠΎΠΆΠ½ΠΎ смСло ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: β€œΠ’ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ прилоТСния станСт основным ΠΊΠ°ΠΌΠ½Π΅ΠΌ прСткновСния Π±Π΅Π· наличия ΠΌΠ°Π»Π΅ΠΉΡˆΠΈΡ… тСорСтичСских ΠΈΠ»ΠΈ практичСских знаний”. Π‘ΡƒΠ΄ΡƒΡ‡ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠ²Π΅Π½Π½Ρ‹ΠΌ, front-end ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ заняла ΠΏΠΎΡ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ объСм ΠΎΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ количСства Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ Ρ‚Ρ€Π΅ΠΏΠ°Π»Π° Π½Π΅Ρ€Π²Ρ‹ Π½Π° протяТСниС Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π°. Но благодаря ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ простотС Thymeleaf ΡƒΠ΄Π°Π»ΠΎΡΡŒ обрСсти подходящий компромисс послС Ρ‡Π΅Ρ€Π΅Π΄Ρ‹ фССричСских ΠΏΠΎΡ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π”Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅Π΅ обсуТдСниС Π±ΡƒΠ΄Π΅Ρ‚ Π²Π΅ΡΡ‚ΠΈΡΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎ тонкостях использования Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ°, хотя общая концСпция придСрТиваСтся схоТСго полоТСния. Основная ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² возмоТности использовании Ρ‡ΠΈΡΡ‚Π΅ΠΉΡˆΠ΅Π³ΠΎ HTML ΠΈ сборкС ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ отобраТСния ΠΈΠ· ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² для ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ мноТСствСнного повторСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Ρ… участков. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса состоит ΠΈΠ· Π³Π»Π°Π²Π½ΠΎΠΉ страницы, состоящСй ΠΈΠ· Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ с элСмСнтами управлСния (Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ записи, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π½Π° Π³Π»Π°Π²Π½ΡƒΡŽ страницу) ΠΈ динамичСской Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ для отобраТСния сущностСй с сортировкой ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ добавлСния Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ Π² Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ увСличСния (ASC) ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ (DESC) значСния. ΠŸΡ€ΠΈΠΌΠ΅ΠΌ Π·Π° стандартноС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ всСх записСй ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ. Богласно иСрархичСской ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ΅ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ° шаблонов, составныС элСмСнты Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ располоТСны Π½Π° Π²Π΅Ρ‚Π²ΠΈ β€œtemplates” Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ β€œresources”. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, дальнСйшиС манипуляции с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π²Ρ‹Π΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ условия. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π³Π»Π°Π²Π½ΡƒΡŽ страницу с ΠΈΠΌΠ΅Π½Π΅ΠΌ β€œindex” (ΠΈΠ»ΠΈ Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ согласно Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΉ) Π½Π° шаблонС html5. НапримСр:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/head :: head"></head>
<body>
<div class="container">
   <div th:replace="fragments/header :: header"></div>
   <div th:if="${not #lists.isEmpty(notes)}">
       <div th:replace="operations/list :: notebook"></div>
   </div>
   <div th:replace="fragments/footer :: footer"></div>
</div>
</body>
</html>
И Ρ‚Π°ΠΊ, Ρ€Π°Π·Π»ΠΎΠΆΠΈΠΌ ΠΏΠΎ ΠΏΠΎΠ»ΠΎΡ‡ΠΊΠ°ΠΌ ΠΊΠ»ΡŽΡ‡Π΅Π²ΡƒΡŽ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ прилоТСния. Thymeleaf ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ синтаксис для указания примСнСния ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈ начинаСтся с ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова β€œth:”, ссылка Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ подсоСдиняСтся Π² ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ порядкС Π² ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ тэгС <html>.
<div th:if="${not #lists.isEmpty(notes)}">
ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ β€œif” ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ отличаСтся ΠΎΡ‚ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° дСйствий ΠΈ провСряСт входящий Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ β€œnotes” Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для дальнСйшСго отобраТСния. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ ΠΎ пСрСхлСстывании Ρ‚Π΅ΠΌΡ‹ с использованиСм Controller, принимая Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ½ΠΎΠ³ΠΎ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ взаимодСйствия ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. МногиС Ρ‚ΡƒΠΌΠ°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠ±Ρ€Π΅Ρ‚Π°ΡŽΡ‚ очСртания Π² дальнСйшСм, просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ Π½Π°Π·Π°Π΄ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ТСлания.
<head th:replace="operations/list :: notebook"></head>
ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ β€œreplace” ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π·Π°ΠΌΠ΅Π½Ρƒ β€œΠ·Π°Π³Π»ΡƒΡˆΠΊΠΈβ€ ΠΈΠ»ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠ° Π½Π° Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΈΠ»ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ страницы - послСдний случай наглядно Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. ΠœΡ‹ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ β€œnotebook” ΠΈΠ· β€œlist.html” Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ β€œoperations” Π² <div></div> Ρ„Π°ΠΉΠ»Π° β€œindex”, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ замСняя содСрТимоС Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π΅ назначСния. Π˜ΡΡ…ΠΎΠ΄ΡΡ‰ΠΈΠΉ ΠΆΠ΅ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТаниСм:
<!DOCTYPE html>
<!--suppress ALL -->
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:th="http://www.thymeleaf.org">

<div th:fragment="notebook">
   <table class="table table-bordered table-hover horizontal-align">
       <thead>
       <tr>
           <th style="width: 5%">#</th>
           <th style="width: 60%">Message</th>
           <th class="dropdown" style="width: 20%">Date
               <a th:href="@{'/sort/{sortDate}' (sortDate = 'ASC')}"><i class="fa fa-chevron-circle-up"></i></a>
               <a th:href="@{'/sort/{sortDate}' (sortDate = 'DESC')}"><i class="fa fa-chevron-circle-down"></i></a>
           </th>
           <th style="width: 5%">Done</th>
           <th style="width: 5%">Edit</th>
           <th style="width: 5%">Delete</th>
       </tr>
       </thead>
       <tbody>
       <tr th:each="note : ${notes}">
           <td th:text="${note.id}" style="text-align: center">#</td>
           <td th:text="${note.message}">Message</td>
           <td th:text="${#dates.format(note.date, 'EEE, d MMM yyyy HH:mm')}" style="text-align: center">Date</td>
           <td style="text-align: center">
               <i th:if="${note.done} == true" class="fa fa-plus-square-o" style="font-size:20px;color:#337ab7"></i>
               <i th:if="${note.done} == false" class="fa fa-minus-square-o" style="font-size:20px;color:#337ab7"></i>
           </td>
           <td style="text-align: center"><a th:href="@{'/edit/{id}'(id=${note.id})}"><i class="fa fa-edit" style="font-size:20px"></i></a></td>
           <td style="text-align: center"><a th:href="@{'/delete/{id}'(id=${note.id})}"><i class="fa fa-trash" style="font-size:20px"></i></a></td>
       </tr>
       </tbody>
   </table>
</div>
</html>
Π’Π½ΠΎΠ²ΡŒ обратимся ΠΊ конструктивному ΠΎΠ±ΠΎΠ·Ρ€Π΅Π½ΠΈΡŽ ΠΈ ΠΏΡ€ΠΎΠΉΠ΄Π΅ΠΌ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ функциям Thymeleaf Π² порядкС слСдования, опуская стандартный синтаксис HTML ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ графичСскиС стили, ΠΈ направляя Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π΄Π²ΠΈΠΆΠΊΠ° шаблонов.
<div th:fragment="notebook">
ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ β€œfragment” Π·Π°Π΄Π°Π΅Ρ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования содСрТимого Π±Π»ΠΎΠΊΠ° для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ β€œreplace”. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ! Никоим ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ мноТСствСнноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠΉ страницы, вновь выдвигая аналогию с ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ ΠΈΠ»ΠΈ функциями Π² языках программирования.
<a th:href="@{'/sort/{sortDate}' (sortDate = 'ASC')}">
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Ρ‹Π·ΠΎΠ² Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @PostMapping Π² Controller с ΠΌΠ°ΠΏΠΏΠΈΠ½Π³ΠΎΠΌ β€œ/sort/{sortDate}”, Π³Π΄Π΅ {sortDate}, - исходящий Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ направлСния сортировки. НСчто схоТСС ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π±Π»ΠΎΠΊΠ΅, Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‰Π΅ΠΌ динамичСскоС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² зависимости ΠΎΡ‚ полоТСния Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ элСмСнта Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ:
<a th:href="@{'/edit/{id}'(id=${note.id})}">
<tr th:each="note : ${notes}">
ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΡ‡Π΅Π½ΡŒ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠ΅ использованиС Π±Π»ΠΎΠΊΠ° for Π² синтаксисС Java: пСрСмСнная β€œnote” ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ элСмСнт ΠΈΠ· массива входящСго Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ${notes} β€” массива с сущностями, β€” ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² дальнСйшСм для измСнСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π‘ΡƒΠ΄ΡƒΡ‡ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠ²Π΅Π½Π½Ρ‹ΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ для пСрСчислСния ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ спСктра возмоТностСй Thymeleaf с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² практичСского примСнСния - Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΡŒ шаблонов ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ прост ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ изучСния Π²Π½ΡƒΡˆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±Π°Π³Π°ΠΆΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ синтаксиса. ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Ρ‹ Π² тСхничСской Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ сайтС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ связи с back-end. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΉ части. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠ² ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ссылкС Π½Π° Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ.

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, администратор Π² малСнькой ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ

β€œΠšΡ€Π°Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ камСнь Π² Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ web-прилоТСния”, - ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, Π½ΠΈΠΊΠΎΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ удастся ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ описаниС значимости ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Controller Π² ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ проводится ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ²ΡΠ·ΡƒΡŽΡ‰ΠΈΠΌ элСмСнтом ΠΌΠ΅ΠΆΠ΄Ρƒ модСлью ΠΈ Π²ΠΈΠ΄ΠΎΠΌ. Благодаря ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠ΅ дСйствия Spring Boot, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°ΠΏΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ запроса GET/POST Π±Π΅Π· ΠΌΠ°Π»Π΅ΠΉΡˆΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, автоматичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ класс NoteController Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ β€œcontrollers”, вновь ΠΎΠ±Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ:
@Controller
public class NoteController {

   private NoteService service;

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

   @GetMapping("/")
   public String list(Model model) {
       return "index";
   }
}
Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ взгляд ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°Ρ… построСния Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ прилоТСния, связанноС с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ сСрвиса для изолирования бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со слуТбой управлСния Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ дСйствия Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ для увСличСния ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ простор для измСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса Π±Π΅Π· потрСбности ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… связи с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΠΎΠ΅ прСдставлСниС Π½ΠΈΠΊΠΎΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ выдСляСтся ΠΈΠ· ΠΎΠ±Ρ‰Π΅ΠΉ массы схоТих: интСрфСйс располоТСн Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΈ имплСмСнтируСтся классом с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Service для обнаруТСния Spring Boot:
public interface NoteService {
   Note getNoteById(Integer id);
   void saveNote(Note note);
   void updateNote(Integer id, String message, boolean done);
   void deleteNote(Integer id);
   List<Note> findAll();
}

@Service
public class NoteServiceImpl implements NoteService{

   private NoteRepository repository;

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

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

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

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

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

   @Override
   public List<Note> findAll() {
       return repository.findAll();
   }
}
Возвратимся ΠΊ ΠΎΠ±ΠΎΠ·Ρ€Π΅Π½ΠΈΡŽ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° ΠΈ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ тонкости ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Spring Boot. Аннотация @Autowired сообщаСт ΠΎ потрСбности автоматичСской привязки сСрвиса ΠΊ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ устанавливаСт связь с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ большС внимания Π½Π° способ общСния с Π²ΠΈΠ΄ΠΎΠΌ, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @GetMapping("/") ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ страницу с ΠΈΠΌΠ΅Π½Π΅ΠΌ β€œindex” ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²Π° localhost:8080. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, конкрСтизируя Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ΅ описаниС @RequestMapping(value = "/", method = RequestMethod.GET) ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ Π½Π° Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ ModelAndView. Однако, согласно Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ полоТСния ΠΎΠΏΡ‹Ρ‚Π° практичСского примСнСния, ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‡Π°ΡŽ ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. Π Π°ΡΡˆΠΈΡ€ΠΈΠΌ ΠΊΠΎΡ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ добавлСния Π½ΠΎΠ²Ρ‹Ρ… элСмСнтов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ. ПослС наТатия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° элСмСнт Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ происходит Π²Ρ‹Π·ΠΎΠ² @GetMapping("/new") ΠΈ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° страницу β€œnew” ΠΈΠ· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ β€œoperations”, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с ΠΈΠΌΠ΅Π½Π΅ΠΌ β€œmessage” ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠΈ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… использованиСм ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π°Π΄Ρ€Π΅ΡΠ°Ρ†ΠΈΡŽ Π½Π° Π³Π»Π°Π²Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ упоминания Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ совпадСния наимСнования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΠΎΠΊΠ½Π΅ Π²Π²ΠΎΠ΄Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ значСния.
<input type="text" class="form-control" id="message" th:name="message" placeholder="Enter your note." maxlength="100"/>
@GetMapping("/new")
public String newNote() {
   return "operations/new";
}

@PostMapping("/save")
public String updateNote(@RequestParam String message) {
   service.saveNote(new Note(message));
   return "redirect:/";
}
БхоТая ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обновлСния записи. ПослС наТатия Π½Π° элСмСнт управлСния происходит Π²Ρ‹Π·ΠΎΠ² мапирования @GetMapping("/edit/{id}") ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΈΠ· url-строки, добавляСтся Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ β€œnote” с записью для дальнСйшСго рСдактирования. @RequestParam(value = "done", required = false) boolean done) ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ значСния ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² использовании checkbox ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄Π²ΠΈΠΆΠΊΠ° шаблонов 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 ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ query-запросов Π² Spring Data JPA, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ добавляя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ управлСния простой Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ Controller.
@Controller
public class NoteController {

   private String sortDateMethod = "ASC";

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

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

Π’Π°ΠΊΠΎΠΉ малСнький, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Π²Π°ΠΆΠ½Ρ‹ΠΉ Query.

НСловко ΠΏΡ€ΠΈΠ·Π½Π°Π²Π°Ρ‚ΡŒΡΡ, Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²ΠΎΠΏΡ€Π΅ΠΊΠΈ оТиданиям оказалась ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½Ρ‹ΠΌ ΠΊΠ°ΠΌΠ½Π΅ΠΌ прСткновСния Π² Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ тСхничСского задания, ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ прСодолСвая установлСнный ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ - Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ΠΌ массива Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ страницы ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ размСрности для дальнСйшСго отобраТСния, - ΠΏΠΎΡ€ΠΎΠ³ слоТности. Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, ΡΠΊΠ°Π·Ρ‹Π²Π°Π»Π°ΡΡŒ накопившаяся ΡƒΡΡ‚Π°Π»ΠΎΡΡ‚ΡŒ, но… ΠΎΠ·Π°Ρ€Π΅Π½ΠΈΠ΅ снизошло послС ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ случайного столкновСния с Query-запросами.
public interface NoteRepository extends JpaRepository<Note, Integer> {
   List<Note> findAllByOrderByDateAsc();
   List<Note> findAllByOrderByDateDesc();
}
Spring Data JPA прСдоставляСт возмоТности для создания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… запросов Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΠ·Π±Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΎΡ‚ потрСбности ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ послС получСния ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‰ΠΈΡ… ΡˆΠΈΡ€ΠΎΠΊΠΈΠΌ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΠΎΠΌ для примСнСния. НапримСр:
List<Note> findAllByOrderByDateAsc();
ΠœΠ΅Ρ‚ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ Π² SQL запрос ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ всС записи (findAll) с сортировкой (byOrder) ΠΏΠΎ Π΄Π°Ρ‚Π΅ (byDate) Π² порядкС возрастания (Asc). Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ слоТныС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ ΠΏΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ полям Π·Π° СдинствСнноС Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅. Π‘ΠΊΠ°ΠΆΠ΅ΠΌ, Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ всС (findAll) Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ (byDoneTrue) записи Π² порядкС (byOrder) ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ (Decs) ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π΄Π°Ρ‚Ρ‹ (byDate):
Page<Note> findAllByDoneTrueOrderByDateDesc(Pageable pageable);

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ очСрСдная исповСдь Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π³ΠΎ программиста

Всё! МоТно смСло Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ web-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ использованиСм ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Shift+F10 ΠΈΠ»ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠΊΠΎΠ½ΠΊΡƒ. Spring Boot собСрСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° Apache Maven ΠΈ установит Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр Apache Tomcat ΠΏΠΎ адрСсу localhost:8080. Π’Π΅ΠΏΠ΅Ρ€ΡŒ достаточно лишь ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΏΠΎ ссылкС Π² любом Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅.
Π—Π°Π²ΠΎΠ΅Π²Π°Π½ΠΈΠ΅ Spring Boot - 6
И, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΡƒ для выполнСния ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… бизнСс-Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ. ΠŸΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» прилоТСния ограничиваСтся ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ усилиями, Π½Π°Ρ…ΠΎΠ΄Ρ‡ΠΈΠ²ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΈΠ²ΠΎΠΉ ΠΈ Ρ„Π°Π½Ρ‚Π°Π·ΠΈΠ΅ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.
Π—Π°Π²ΠΎΠ΅Π²Π°Π½ΠΈΠ΅ Spring Boot - 7
Π‘ΡƒΠ΄ΡƒΡ‡ΠΈ ΠΎΡ‚ΠΊΡ€ΠΎΠ²Π΅Π½Π½Ρ‹ΠΌ ΠΈ обращая Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ, вновь ΠΈ вновь ΡƒΠ±Π΅ΠΆΠ΄Π°ΡŽΡΡŒ Π² вСрности Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ направлСния ΠΈ осознаю ΠΏΠΎΠ»ΡŒΠ·Ρƒ ΠΎΡ‚ обучСния Π½Π° ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΡ€Ρ‚Π°Π»Π΅ JavaRush. Благодаря мноТСству практичСских Π·Π°Π΄Π°Ρ‡ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ манящий интСрСс ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ программирования, ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π±ΠΈΡ‚Ρ‹ΠΉ Π² ΡƒΡΡ‚Π°Ρ€Π΅Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΈ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ скучной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ ΡƒΡ‡Π΅Π±Π½ΠΎΠ³ΠΎ завСдСния схоТСго направлСния. Π§Π΅Ρ‚Ρ‹Ρ€Π΅ мСсяца Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ изучСния ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° Π² back-end стСкС Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ Π²Π»ΠΎΠΆΠΈΠ»ΠΈ Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС Π·Π½Π°Π½ΠΈΠΉ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ†Π΅Π»Ρ‹ΠΌΠΈ Π³ΠΎΠ΄Π°ΠΌΠΈ посСщСния Π»Π΅ΠΊΡ†ΠΈΠΉ ΠΈ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Ρ… занятий. Π₯ΠΎΡ‚ΠΈΡ‚Π΅ Π²Π΅Ρ€ΡŒΡ‚Π΅, Π° Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ β€” Π½Π΅Ρ‚. Π–Π΅Π»Π°ΡŽ Π½Π΅ ΠΏΠ°ΡΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ трудностями вхоТдСния Π² слоТный ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», вСдь ΠΈΠΌΠ΅Π½Π½ΠΎ благодаря ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π½ΠΈΡŽ прСпятствий ΠΌΡ‹ становимся Π»ΡƒΡ‡ΡˆΠ΅ ΠΈ развиваСмся Π² ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ ΠΈ личностном ΠΏΠ»Π°Π½Π΅. НадСюсь, малСнький рассказ способствовал ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΡŽ свСТих ΠΈΠ΄Π΅ΠΈ для примСнСния Π²ΠΎΡΡ…ΠΈΡ‚ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ инструмСнта ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ SpringBoot. P.S. Github.
ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ (37)
  • популярныС
  • Π½ΠΎΠ²Ρ‹Π΅
  • старыС
Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ
Иван Π‘Π΅Ρ€Π³Π΅Π΅Π²ΠΈΡ‡ Π–Π΅Π»Π΅Π·Π½ΠΎΠ΄ΠΎΡ€ΠΎΠΆΠ½ΠΈΠΊ Π² Π Π–Π”
15 сСнтября 2021, 19:33
Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ вопрос Π½Π΅ Π² Ρ‚Π΅ΠΌΡƒ, Π½ΠΎ Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅. На Ρ‡Π΅ΠΌ написан ΠΊΠΎΠ΄ для html страницы? НапримСр для Π΄ΠΆΠ°Ρ„Π° fx ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ scene buider, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΊΠΎΠ½ΠΊΠΈ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΌΡ‹ΡˆΠΊΠΎΠΉ ΠΏΠ΅Ρ€Π΅Ρ‚Π°Ρ‰ΠΈΡ‚ΡŒ. А ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ…Ρ‚ΠΌΠ»? Π½Π΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΆΠ΅ всС эти Ρ‚Π΅Π³ΠΈ Π½Π°Π±ΠΈΡ€Π°ΡŽΡ‚))
Jean Valjean
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 41
3 октября 2021, 13:59
Thymeleaf
Николай
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 23
23 октября 2020, 11:19
ΠžΡ‡Π΅Π½ΡŒ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΡΡ‚ΠΈΠ»ΡŒ излоТСния. Автор стараСтся Π±Ρ‹Ρ‚ΡŒ вСсСлым ΠΈ остроумным. Π‘Π°ΠΌΠΎ ΠΏΠΎ сСбС это Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ, Π½ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ слабо Π·Π½Π°ΠΊΠΎΠΌ с ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠΌ, ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π²ΠΎΡΠΏΡ€ΠΈΡΡ‚ΠΈΡŽ, Ρ‚.ΠΊ. приходится ΠΎΡ‚Π΄Π΅Π»ΡΡ‚ΡŒ сущСствСнноС ΠΎΡ‚ нСсущСствСнного ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ объСм тСкста.
Alex V. Sokoloww
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 23
21 апрСля 2022, 05:43
ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄ΠΆΠ°Π²Π°Ρ€Π°Ρˆ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ обучСния сухой ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», Π»ΠΈΠ±ΠΎ ΠΈΠ³Ρ€ΠΎΠ²ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ разросся, Π½ΠΎ ΠΏΠΎ ΠΎΠΏΡ‹Ρ‚Ρƒ обучСния скаТу Ρ…ΡƒΠΆΠ΅ Ρ‡Π΅ΠΌ сухая Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ. Π― Π½Π° Ρ…ΠΈΠΌΠΈΡŽ ΠΈ Ρ„ΠΈΠ·ΠΈΠΊΡƒ взглянул ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€Π΅ΠΏΠΎΠ΄Π° гундящСго ΠΏΠΎΠ΄ нос Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ. А сухой конспСкт ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ.
Surplus Java Developer Π² Лаборатория ΠšΠ°ΡΠΏΠ΅Ρ€ΡΠΊ
20 июля 2020, 19:26
Π’ΠΎ странноС чувство, ΠΊΠΎΠ³Π΄Π° кусок ΠΆΠΈΠ·Π½ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‚ Π½Π° ΠΊΠ°Ρ‚ΡƒΡˆΠΊΠ΅ ΠΈ Π·Π°ΠΏΠ΅Ρ‡Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Π² качСствС наслСдия. ОсобСнно приятно Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ, обсуТдСния ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΡ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΡΡ‚Ρ€Π΅ΠΌΠΈΡ‚ΡŒΡΡ ΠΊ Π»ΡƒΡ‡ΡˆΠ΅ΠΌΡƒ. Бпасибо большоС, Ρ‡Ρ‚ΠΎ Π’Ρ‹ Π΅ΡΡ‚ΡŒ. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡ‚Π΅ Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ, Π²Π΅Ρ€ΡŒΡ‚Π΅ Π² сСбя ΠΈ Π²ΠΎΠΏΠ»ΠΎΡ‰Π°ΠΉΡ‚Π΅ ΠΌΠ΅Ρ‡Ρ‚Ρ‹ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.
ДСнис
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 20
18 мая 2020, 10:30
Π’ΠΎΡ‚ Π±Ρ‹ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ Π²Π΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π° спринг рСст ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ„ΠΎΡ€ Π°Π½Π΄Ρ€ΠΎΠΈΠ΄. Π‘ ΡΠ΅ΠΊΡŽΡ€ΠΈΡ‚ΠΈ ΠΈ Π³ΡƒΠ³Π» Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ.. Ρ‚Π°ΠΊΠΎΠΉ шаблон прилоТСния
10 фСвраля 2020, 19:00
Π₯ΠΎΡ€ΠΎΡˆΠ°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ, большоС спасибо! Π’ΠΎΡ‚ с этого, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, начинаСтся настоящая Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°.
4 ноября 2019, 16:19
Быстро информация устарСваСт. На start.spring.io пСрСчислСнного Π½Π°Π±ΠΎΡ€Π° ΡƒΠΆΠ΅ Π½Π΅ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ. Π‘Π°ΠΌ сСйчас ΡΡ‚ΠΎΡŽ Π½Π° @Entity . ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΈΠ· ΡΡ‚Π°Ρ‚ΡŒΠΈ Idea ругаСтся,ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π΅Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ. Π’Π°ΠΊΠΆΠ΅ нСльзя ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ красиво ΠΏΠ°ΠΏΠΊΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, всС ΠΎΠ΄Π½ΠΎΠΉ портянкой ΠΈΠ΄Π΅Ρ‚.
4 ноября 2019, 18:13
Π½Π΅ Π΄ΠΎΠ»Π³ΠΎ Π΄ΡƒΠΌΠ°ΡŽ скачал ultimate Π²Π΅Ρ€ΡΠΈΡŽ ΠΈ всС ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Ρ‚ ΠΏΠΎ схСмС... Π½ΡƒΠΆΠ½Π° faq ΡΡ‚Π°Ρ‚ΡŒΡ для Community
Sergej Kalva
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 2
23 октября 2019, 14:05
ΠŸΠΎΡ…ΠΎΠΆΠ΅ Π½Π° курс ΠΊΠ°ΠΊ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ сову. Бпасибо +5.
ram0973
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 41
21 июня 2021, 12:38
Ρ‚ΠΎΡ‡Π½ΠΎ
1 сСнтября 2019, 06:35
Ок, ΠΊΠ°ΠΊ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΆΠ΅ красиво, ΠΊΠ°ΠΊ ΠΈ Π½Π° ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π°Ρ…?
Saniya
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 17
26 фСвраля 2019, 15:54
Если Π·Π½Π°Π΅Ρ‚Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ источники/ΠΊΠ½ΠΈΠ³ΠΈ Π½Π° Π΄Π°Π½Π½ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ, ΠΏΡ€ΠΎΡˆΡƒ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ. Бпасибо!
Ola Backend Developer
4 фСвраля 2019, 09:50
ΠΊΠ°ΠΊ Π·Π°Π²ΠΎΠ΅Π²Π°Ρ‚ΡŒ Spring Π±Π΅Π· Spring Boot?