JavaRush /Java блогу /Random-KY /Conquest Жазгы Бут
Surplus
Деңгээл
Москва

Conquest Жазгы Бут

Группада жарыяланган
Кайырлы күн, кымбаттуу окурман! Жана сиз менен таанышканыма кубанычтамын, атүгүл жазгы Буттун өнүгүүсү менен биринчи таанышуу жөнүндө жөнөкөй теманы карап чыгуунун негизги себеби болгон. Мен JavaRush порталында практикага киришүү тапшырмасын аткаруудагы тажрыйбам менен бөлүшкүм келет, ал өзүнүн топтогон бorминин күчүн сынап көргүсү келген жөнөкөй техникалык университеттин студентинин көз карашын сунуштайт. Багындырган жазгы бут кийим - 1Тиркелген codeдо же ой жүгүртүү ыкмасында оройлуктун болушу мүмкүн экенин эч кандай жол менен четке Howпайм жана конструктивдүү сынды кубаттайм, анткени ал “дөңүрлөр менен көгөргөндөрдүн” аркасында профессионалдык багытта өнүгүүгө болот. Анын үстүнө, мен такыр эле берилген шарттарды чечүүдө "панацея" болуп көрүнбөйм жана нерв системасы үчүн анча-мынча кесепеттери жок салыштырмалуу татаал темага кирүүнүн негизги маанисин калтырып, программанын айрым фрагменттерин атайылап өткөрүп жибербейм. Туура, ачыктан-ачык нерсени четке кагуу ойлонбойт: бул мен үчүн оор болду жана белгилүү бир учурга чейин такыр эч нерсе ачык болгон жок. Ал эми тапшырма менен биринчи жолугушуудан эле ушундай сезимдерди сезип жатсаңыз, анда "Кош келиңиз!" ThymeleafКелгиле, келүүчү маалымат массивдерин чыпкалоо үчүн шаблон кыймылдаткычын жана queryжергorктүү MySQL serverине сурамдарды колдонуу менен практикага кирүү сынагынын жөнөкөйлөштүрүлгөн аналогиясын колдонуп, Spring Boot программасында веб-тиркемени жазалы . Ошентип, баштайлы!

Жазгы бут. Бул кандай жаныбар жана аны кантип бышыруу керек?

Кыскача жана кыскача айтканда, бул Pivotelдин эң сонун куралы , тиркемени түзүү процессинде баалуу убакытты үнөмдөө, үчүнчү тараптын китепканаларын түздөн-түз туташтыруу, таасирдүү картографиялык кенептерди жана сервлеттерди жазуу зарылдыгын жок кылуу. IntelliJ IDEA Ultimate Edition (Файл - Жаңы - Долбоор... - Spring Initializr) менен интеграцияланган же start.spring.io веб-кызматында жайгашкан Spring Initializr куруучуну колдонуу жетиштүү . сунуш кылат.
Conquest Жазгы Бут - 2
Алдыга коюлган техникалык мүнөздөмөлөргө ылайык, биз MySQL маалымат базасын колдонуу менен жөнөкөй веб-тиркеме түзүү үчүн мырзанын стандартын колдонобуз :
  • WEB веб тиркемесин иштеп чыгуунун негизги компоненти болуп саналат, анын ичинде localhost:8080 стандарттык дареги боюнча жергorктүү Apache Tomcat serverи жана универсалдуу Spring MVC алкагы.

  • DevTools - компиляцияланган codeдо же шаблондордо өзгөртүүлөр табылганда, ысык JVMде тиркемени тез кайра иштетүү үчүн колдонулат; Андан тышкары, эгер тандалган кыймылдаткыч долбоорго кирсе, Thymeleaf кэшти тазалоодон бошотот.

  • JPA – бул маалымат базалары менен иштөө үчүн талап кылынган технология жана Java an objectилеринин an objectиге байланышы бар карта түзүүнү камсыз кылат, an objectтерди башкаруу, сактоо жана алуу үчүн API (биздин учурда күтүү режими ) менен камсыз кылат.

  • Thymeleaf (Mustache, AngularJS, Vaadin жана андан тышкары) - колдонмонун визуализациясы үчүн шаблон кыймылдаткычы; Html принциптери менен жакындан тааныштыгымдын аркасында мен тилди дүйнөнүн бурчуна түрткөн Thymeleafти тандадым.

  • MySQL - базага каршы SQL сурамдарын аткаруу үчүн Java Database Connectivity драйверлерин туташтырат.
Компоненттерди акыркы тандоодон жана түзүүдөн кийин, биз андан ары толтурууга даяр каталогдору бар кадимки веб-тиркеме архитектурасын алабыз. Визуалдык бөлүк менен өз ара аракеттенүү үчүн фрагменттер, мейли CSS графикалык стилдери, стандарттуу HTML баракчалары же JavaScript функционалдуулугу, "ресурстарда" жайгашуусу керек, ал эми арткы компоненти, тиешелүүлүгүнө жараша, "javaда" жайгаштырылышы керек. Долбоордун структурасын жана компоненттердин ортосундагы көз карандылыкты сактаган тамыр диапазонундагы pom.xml файлына да көңүл бурушубуз керек. Эгерде сиз кошумча пакеттер менен функцияны андан ары кеңейтүүнү кааласаңыз же керексиз нерселерди алып салгыңыз келсе, <dependencies></dependencies>окшош ыкма боюнча тегдердин ортосунда манипуляцияларды жасашыңыз керек.
Conquest Жазгы Бут - 3

Улуу келечекке алгачкы кадамдар

Андан кийин, абдан кызыктуу жана логикалык суроо туулат: "Эми эмне кылуу керек? Бул кантип иштейт? Программа Model-View-Controller принциптеринде курулган: ал туташкан маалыматтар базасынан an objectтерди окууну уюштурат (Модель) жана башкаруу элементтери менен колдонуучунун интерфейсинде көрсөтүлөт (View); Компоненттердин ортосундагы байланыш жана берилген суроо-талаптарга ылайык иш-аракеттердин аткарылышы Контроллердин аркасында ишке ашырылат. Бул үзгүлтүксүз өнүгүү үчүн шилтеме катары кызмат кылган негизги элементтерди түзүү болуп саналат. Тайгак жолду болтурбоо жана жумуш талаасында жолдошторуңуздун урмат-сыйын сактоо үчүн, компоненттерди тиешелүү каталогдорго жайгаштырыңыз (мисалы, Controller файлын “java” бутагындагы контроллер папкасына жайгаштырыңыз) жана кылдаттык менен сактаңыз. жумуш ордунда тартип.

Маңыз – чоң механизмдин кичинекей бөлүгү

Же башкача айтканда, маселеде коюлган шарттарга ылайык биздин Модель. Талкуу темасынан чыгып, кириш долбоорго кайрылып, биз ишенимдүү түрдө милдеттердин ортосунда минималдуу айырмачылыктар бар деп ырастай алабыз жана андан ары карап чыгууда орточо түшүнүктү карманышат. Айталы, дептердеги белгилер, анын ичинде:
  • Жалпы агымда жайгашкан жерди аныктоо үчүн идентификациялык номер;
  • Белгилүү сандагы белгилердин тексттик билдирүүсү;
  • Колдонуучу аны жалпы тизмеге кошкон датасы;
  • "Бүттү же аткарылган жок" ("Оку же окулбады") аныктоо үчүн логикалык өзгөрмө.
Ошондуктан, келгиле, "an object" деп аталган каталогдо Note классын түзүп, тиешелүү талааларды кошолу:
@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;
   }
}
Теориялык позициядан эмне болуп жатканын жакшыраак түшүнүү үчүн талкуу темасынан дагы бир четтөө. Жаздагы компоненттердин ортосундагы байланыш annotationлар менен аныкталат - an objectтердин алдындагы атайын көрсөткүчтөр, алардын ар бири механизмде белгилүү роль ойнойт жана “@” белгиси менен башталат. @Entity annotationсы Spring Boot программасына кийинки класстын маалыматтары "Entity" ге таандык экенин көрсөтөт, ал эми @Id жана @GeneratedValue маалымат массивдерин иштетүүдө итераторду автоматтык түрдө түзүү менен идентификатор катары тандалган талааны белгилейт. Визуалдык форматтын компакттуулугун жогорулатуу үчүн стандарттуу Getter жана Setter кошууну атайылап өткөрүп жиберем. Андан кийин, жазууларды сактоо үчүн маалымат базасын колдонууну эске алуу менен, биз тиркемени иштеп чыгуунун кийинки кадамына өтөбүз: биз "репозиторий" каталогунда NoteRepository интерфейсин, алмашуу чынжырындагы бириктирүүчү элементти түзөбүз жана эң көп мурастайбыз. сакталган an objectти жана жетүү үчүн бүтүн итераторду көрсөтүү менен андан аркы иштөө үчүн ылайыктуу репозиторий.
public interface NoteRepository extends JpaRepository<Note, Integer> {
}
Чындыгында, баары ушунда. Кыска жана кыска. Эми Spring Boot түзүлгөн компонентти маалымат базасы менен өз ара аракеттенүүнү уюштуруу үчүн колдонот. Иш-аракет үчүн ар кандай потенциалы бар эски репозиторийлердин салыштырмалуу көп түрлөрү бар. JpaRepository тепкичтин башында турат жана эң потенциалга ээ, анын ичинде анын астындагы CrudRepository жана PageAndSortingRepository. Биз мындан ары барбайбыз жана темадан тайбайбыз, анткени кээ бир кылдаттыктарды Pivotel сайтынан техникалык documentтерден тапса болот. Эми, маалымат сүрөтүн ишке ашыргандан жана колдонмо тарабында байланыш ыкмаларын көрсөткөндөн кийин, расмий иштеп чыгуучунун ассамблеясында рабочий платформада алдын ала орнотулган "MySQL Workbench" ылайыктуу тышкы чөйрөсүндө MySQL маалымат базасын түзүүгө көңүл бурушуңуз керек. жергorктүү serverди түзүү үчүн кошумча пакеттер менен:
Conquest жазгы бут кийим - 4
Андан кийин, негизги терезеде учурдагы локалдык server менен иконканы чыкылдаткандан кийин чөйрөнүн көрсөтмөлөрүнө ылайык, биз субъектибиздин талааларына ылайык table диаграммасын түзөбүз (Эскертүү) жана аны тиешелүү маалыматтар менен толтурабыз. Каалаган натыйжага ийгorктүү жетүү үчүн шашылыш түрдө көңүл бурууну талап кылган MySQL диалектинин кылдат жактарын өзүнчө тактоо керек:
  • Мындай өзүнчө буль түрү жок. Ар кандай суроо-талаптарды иштетүү аракеттери тиешелүүлүгүнө жараша “чын” же “жалган” бит маанисин “1” же “0” битине айлантат;
  • Дата толугу менен Убакыт белгисинин түрүндө сакталат. Эгер сиз өзүңүзгө тааныш Датаны колдонсоңуз, анда сиз календардагы позиция менен гана чектешиңиз керек болот.
Conquest Жазгы Бут - 5
Даярдоо кадамдары аяктагандан кийин, куралдар панелиндеги "чагылган" сөлөкөтүн чыкылdateу менен жергorктүү serverге маалыматтарды жөнөтүү үчүн "MySQL Workbench" көрсөтөбүз. Эми, маалымат кошуу туура аяктаган болсо, биз ишенимдүү түрдө application.properties файлына учурдагы маалымат базасынын конфигурациясын кошуу менен иштеп чыгууну улантуу үчүн өзүбүздүн түпкү IDEге кайтып келе алабыз (көбүнчө "ресурстар" каталогунда жайгашкан):
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
Акыр-аягы, annotationларды колдонуу менен Note an objectисин MySQL менен байланыштыруу. @Table тандалган аталышы жана схемасы бар 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;
   }
}

Көрүү же колдонуучу интерфейси

Тилекке каршы, биз аман-эсен төмөнкүдөй айта алабыз: "Кичине эле теориялык же практикалык бorми жок өтүнмөнүн визуалдаштыруу негизги мүдүрүлүүчү болуп калат." Чынын айтканда, алдыңкы компонент жумуштун жалпы көлөмүнүн укмуштуудай көлөмүн алып, узак убакыт бою менин нервимди ишенимдүү түрдө кыйратты. Бирок Thymeleafтын укмуштуудай жөнөкөйлүгүнүн аркасында бир катар сыйкырдуу жеңилүүлөрдөн кийин ылайыктуу компромисс табууга мүмкүн болду. Андан ары талкуу тандалган кыймылдаткычты колдонуунун татаалдыктары жөнүндө болот, бирок жалпы түшүнүк окшош позицияны карманат. Негизги техника - бул эң таза HTMLди колдонуу жана бирдей бөлүмдөрдүн бир нече жолу кайталанышын болтурбоо үчүн жеке фрагменттерден акыркы дисплейди чогултуу. UI архитектурасы башкаруу элементтери бар навигациялык тилкеден (жаңы жазуу кошуу, башкы бетке кайтуу) жана нота өсүү (ASC) менен кошулган убакыт боюнча сорттолгон an objectтерди көрсөтүү үчүн динамикалык tableдан турган башкы барактан турат дейли. же азайтуучу (DESC) багыт.мааниси. Стандарттык позиция катары бардык жазууларды өсүү тартибинде көрсөтүүнү алалы. Тандалган калыптардын кыймылдаткычынын иерархиялык саясатына ылайык, компоненттин визуализациясынын элементтери "ресурстар" каталогундагы "шаблондор" тармагында жайгашуусу керек. Демек, компоненттер менен андан аркы манипуляциялар коюлган шарттарды эске алат. Келгиле, html5 шаблонунда “индекс” (же жеке каалоосуна жараша башка ат) менен негизги баракты түзөлү. Мисалы:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/head :: head"></head>
<body>
<div class="container">
   <div th:replace="fragments/header :: header"></div>
   <div th:if="${not #lists.isEmpty(notes)}">
       <div th:replace="operations/list :: notebook"></div>
   </div>
   <div th:replace="fragments/footer :: footer"></div>
</div>
</body>
</html>
Ошентип, акыркы өтүнмөнүн негизги компоненттерин бөлүп көрөлү. Thymeleaf proceduresалардын колдонулушун көрсөтүү үчүн өзүнчө синтаксисти колдонот жана «th:» ачкыч сөзү менен башталат, китепканага шилтеме сөзсүз түрдө ачылыш <html> тегине киргизилет.
<div th:if="${not #lists.isEmpty(notes)}">
"Эгер" операциясы кадимки нерселерди жасоо ыкмасынан такыр айырмаланbyte жана андан ары көрсөтүү үчүн an objectтердин бар-жоктугун текшерет. Контроллерди колдонуу менен теманын кайталанышын өзүнчө белгилеп кетүү керек, анын моделдин жана визуализациянын өз ара аракеттенүүсүн уюштуруу үчүн колдонулушун эске алуу менен. Көптөгөн бүдөмүк учурлар келечекте калыптанат, кааласаңыз артка кайтыңыз.
<head th:replace="operations/list :: notebook"></head>
"Алмаштыруу" операциясы учурдагы же өзүнчө барактан тандалган фрагмент менен "түпкүндү" же активдүү блокту алмаштырууну көрсөтөт - мисалда акыркы учур айкын көрүнүп турат. «Операциялар» каталогунун «list.html» ичинен «блокнот» деп аталган фрагментти «индекс» файлынын <div></div>ке көчүрөбүз, мазмунду акыркы орунга толугу менен алмаштырабыз. Чыгуучу төмөнкү мазмунга ээ:
<!DOCTYPE html>
<!--suppress ALL -->
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:th="http://www.thymeleaf.org">

<div th:fragment="notebook">
   <table class="table table-bordered table-hover horizontal-align">
       <thead>
       <tr>
           <th style="width: 5%">#</th>
           <th style="width: 60%">Message</th>
           <th class="dropdown" style="width: 20%">Date
               <a th:href="@{'/sort/{sortDate}' (sortDate = 'ASC')}"><i class="fa fa-chevron-circle-up"></i></a>
               <a th:href="@{'/sort/{sortDate}' (sortDate = 'DESC')}"><i class="fa fa-chevron-circle-down"></i></a>
           </th>
           <th style="width: 5%">Done</th>
           <th style="width: 5%">Edit</th>
           <th style="width: 5%">Delete</th>
       </tr>
       </thead>
       <tbody>
       <tr th:each="note : ${notes}">
           <td th:text="${note.id}" style="text-align: center">#</td>
           <td th:text="${note.message}">Message</td>
           <td th:text="${#dates.format(note.date, 'EEE, d MMM yyyy HH:mm')}" style="text-align: center">Date</td>
           <td style="text-align: center">
               <i th:if="${note.done} == true" class="fa fa-plus-square-o" style="font-size:20px;color:#337ab7"></i>
               <i th:if="${note.done} == false" class="fa fa-minus-square-o" style="font-size:20px;color:#337ab7"></i>
           </td>
           <td style="text-align: center"><a th:href="@{'/edit/{id}'(id=${note.id})}"><i class="fa fa-edit" style="font-size:20px"></i></a></td>
           <td style="text-align: center"><a th:href="@{'/delete/{id}'(id=${note.id})}"><i class="fa fa-trash" style="font-size:20px"></i></a></td>
       </tr>
       </tbody>
   </table>
</div>
</html>
Келгиле, конструктивдүү серепке кайрылып көрөлү жана колдонулган Thymeleaf функцияларын ирети менен карап чыгалы, стандарттуу HTML синтаксисин же колдонулган графикалык стилдерди калтырып, өзгөчө шаблон кыймылдаткычынын механизмин түшүнүүгө көңүл буралы.
<div th:fragment="notebook">
“Фрагмент” операциясы фрагменттин атын аныктайт жана “алмаштыруу” буйругу үчүн блоктун мазмунун колдонууга мүмкүндүк берет. Анын үстүнө! Бир беттин ичинде бир нече жолу колдонуу эч кандай түрдө жокко чыгарылbyte, бул дагы бир жолу программалоо тилдериндеги proceduresалар же функциялар менен окшоштуктарды алып келет.
<a th:href="@{'/sort/{sortDate}' (sortDate = 'ASC')}">
@PostMapping annotationсына чалуу Контроллерде “/sort/{sortDate}” картасы менен колдонулат, мында {sortDate} – чыгуучу сорт багытынын атрибуту. Окшош нерсени кийинки блоктон көрүүгө болот, ал итерация циклиндеги колдонуучу тандаган элементтин абалына жараша динамикалык өзгөрүүнү кошот:
<a th:href="@{'/edit/{id}'(id=${note.id})}">
<tr th:each="note : ${notes}">
Маанилерди санап чыгуу Java синтаксисиндеги for блогунун тааныш колдонуусуна абдан окшош: өзгөрмө "эскертүү" учурдагы элементти ${notes} киргизүү атрибутунун массивинен алат - an objectтердин массивинен - ​​жана маанилерди өзгөртүү үчүн колдонулат кийинчерээк. Чынын айтканда, биз Thymeleaf мүмкүнчүлүктөрүнүн кеңири спектрин практикалык колдонуунун мисалдары менен көрсөтүүгө өзүнчө макала арнасак болот - шаблондук кыймылдаткыч өтө жөнөкөй жана кошумча синтаксистин таасирдүү жүктөрүн үйрөнүүнү талап кылbyte. Жогоруда сүрөттөлгөн функциялар иштеп чыгуучулардын расмий веб-сайтындагы техникалык documentтерде баяндалган жана бэк-энд менен байланышты уюштурууда негизги мааниге ээ. Ошондуктан, сиз ишенимдүү түрдө кийинки жана акыркы бөлүгүнө өтө аласыз. Албетте, визуализациянын калган компоненттерин макаланын аягындагы даяр тиркемеге шилтеме менен тиркөө менен.

Контролёр, кичинекей компанияда администратор

"Веб тиркемесинин архитектурасынын негизи" - балким, программанын ишин уюштурууда Controller компонентинин маанилүүлүгүнүн так сүрөттөлүшүн табууга эч кандай жол жок болушу мүмкүн: көпчүлүк операциялар так программанын ортосундагы байланыштыруучу элемент тарабынан аткарылат. модели жана көрүнүшү. Spring Boot аракетинин механикасынын аркасында сиз карта түзүү жана GET/POST суроо ыкмаларын кичинекей көйгөйсүз ишенимдүү колдоно аласыз жана маалымат репозиторийин автоматтык түрдө туташтыра аласыз. Келгиле, NoteController классын "контроллерлор" каталогунда өзүнчө файлда түзөлү, дагы бир жолу тиешелүү annotationны колдонууга шилтеме кылуу менен:
@Controller
public class NoteController {

   private NoteService service;

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

   @GetMapping("/")
   public String list(Model model) {
       return "index";
   }
}
Кылдат көз бизнес логикасын маалымат базасын башкаруу кызматы менен иштөөдөн обочолонтуу үчүн кызматты кошуу менен байланышкан тиркеме архитектурасынын дизайнындагы маанилүү өзгөрүүнү байкашы мүмкүн. Аткарылган иш-аракеттер даяр продукциянын универсалдуулугун жогорулатуу жана маалымат базасы менен байланыш ыкмаларын өзгөртүүсүз колдонуучу интерфейсинин функционалдуулугун өзгөртүү үчүн кеңири чөйрөнү камсыз кылуу үчүн талап кылынат. Стандарттык өкүлчүлүк ушуга окшогондордун көбүнөн эч кандай айырмаланbyte: интерфейс өзүнчө каталогдо жайгашкан жана Spring Boot аныктоо үчүн @Service annotationсы бар класс тарабынан ишке ашырылат:
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 annotationсы кызматты тиешелүү түрдөгү көрсөтүлгөн өзгөрмөгө автоматтык түрдө байланыштыруу жана маалымат базасы менен байланыш түзүү зарылдыгын көрсөтөт. Localhost:8080ге чалуу кабыл алынганда "индекс" деп аталган баракты кайтарган @GetMapping("/") annotationсында көрсөтүлгөн көрүнүштүн байланыш ыкмасына көбүрөөк көңүл буруу керек. Кеңейтилген сүрөттөмө @RequestMapping(value = "/", method = RequestMethod.GET) көрсөтүү же кайтаруу түрүн даяр ModelAndView менен алмаштыруу башка ыкманы колдонсоңуз болот. Бирок, практикалык колдонуудагы тажрыйбанын учурдагы абалына ылайык, мен акыркы натыйжада эч кандай принципиалдуу айырмачылыктарды байкабайм жана кадимки вариантты колдоном. Кошумча өтмөктү колдонуу менен жаңы элементтерди кошуу менен контроллерди кеңейтели. Колдонуучу навигация тилкесинин элементин чыкылдаткандан кийин, @GetMapping("/new") чакырып, "операциялар" каталогунан "жаңы" баракка багытталат, кнопканы колдонуу менен киргизилген маалыматтарды ырастоодо "билдирүү" деп аталган параметрди кайтарат. жана негизги блокко багыттоо. Киргизүү терезесиндеги өзгөрмө аталышынын өткөрүлүп берилген маанинин аталышы менен толук дал келүүсүнүн зарылдыгы өзгөчө сөздү талап кылат.
<input type="text" class="form-control" id="message" th:name="message" placeholder="Enter your note." maxlength="100"/>
@GetMapping("/new")
public String newNote() {
   return "operations/new";
}

@PostMapping("/save")
public String updateNote(@RequestParam String message) {
   service.saveNote(new Note(message));
   return "redirect:/";
}
Ушундай эле ыкма рекордду жаңыртуу үчүн колдонулат. Контролду чыкылдаткандан кийин, @GetMapping("/edit/{id}") картасы чакырылат жана URL саптан идентификатор өткөрүлүп берилет, "эскертүү" атрибуту андан ары түзөтүү үчүн жазуу менен кошулат. @RequestParam(маани = "аткарылды", талап кылынат = жалган) логикалык аткарылды) белгилүү бир маанини көрсөтүү Thymeleaf шаблон кыймылдаткычын колдонууда белги кутучасын колдонууда негизги ролду ойнойт жана демейки боюнча "жалган" деп коюлган.
@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:/";
}
Маалыматтар базасынан элементтерди алып салуу өтө жөнөкөй жана өткөн маанини колдонуу менен тиешелүү кызмат функциясын чакыруу менен эч кандай олуттуу манипуляцияны талап кылbyte:
@GetMapping("/delete/{id}")
public String delete(@PathVariable Integer id) {
   service.deleteNote(id);
   return "redirect:/";
}
Эми даяр фрагменттерге чакан оңдоолорду киргизели жана Spring Data JPAдагы суроо сурамдарын колдонуу менен MySQL менен кызыктуу байланышка өтүп, контроллерди жабуудан мурун жөнөкөй чыпкалоону башкаруу функциясын өзүнчө кошуп алалы.
@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 сурамдары менен кокусунан жолуккандан кийин келди.
public interface NoteRepository extends JpaRepository<Note, Integer> {
   List<Note> findAllByOrderByDateAsc();
   List<Note> findAllByOrderByDateDesc();
}
Spring Data JPA маалымат алынгандан кийин сорттоо зарылдыгын жок кылган жана кеңири колдонуу потенциалына ээ болгон жогорку гранулдуу маалымат базасы сурамдарын түзүү мүмкүнчүлүгүн берет. Мисалы:
List<Note> findAllByOrderByDateAsc();
Метод SQL сурамына айландырылат жана бардык жазууларды (findAll) датасы (byOrder) боюнча өсүү тартибинде (Date) иретте көрсөтөт (Asc). Мындан тышкары, бир талап менен көптөгөн талаалар боюнча татаал айкалыштарды жана үлгүлөрдү түзө аласыз. Айтыңызчы, бардык (findAll) аяктаган (byDoneTrue) жазууларды күн мааниси боюнча (byDate) азайган (byOrder) ирети менен тандаңыз:
Page<Note> findAllByDoneTrueOrderByDateDesc(Pageable pageable);

Корутунду же башталгыч программисттин башка мойнуна алуу

Баары! Shift+F10 комбинациясын колдонуп же тиешелүү сөлөкөтүн чыкылdateу менен веб-тиркемени коопсуз ишке киргизсеңиз болот. Spring Boot программаны Apache Mavenде курат жана localhost:8080 дарегинде жергorктүү Apache Tomcat serverин орнотот. Эми сиз каалаган браузерде шилтемени ээрчишиңиз керек.
Багындырган жазгы бут кийим - 6
Жана, албетте, бизнестин башка талаптарын аткаруу үчүн методологияны иштеп чыгуу. Колдонмонун потенциалы иштеп чыгуучунун аракети, тапкычтыгы жана фантазиясы менен чектелет.
Багындырган жазгы бут кийим - 7
Ачык айтып, басып өткөн жолго көңүл буруп, мен тандалган багыттын тууралыгына кайра-кайра ынандым жана JavaRush бorм берүү порталында окуунун пайдасын түшүнөм. Ар түрдүү практикалык тапшырмалардын аркасында ушул сыяктуу багыттагы жогорку окуу жайынын эскирген жана таң калыштуу кызыксыз программасында толугу менен басылган программалоону үйрөнүүгө болгон кызыктыруучу кызыгууну кайтарууга мүмкүн болду. Арткы технологиялык стектеги материалды жигердүү изилдөөнүн төрт айлыгы, лекцияларга жана лабораториялык сабактарга катышкан жылдарга салыштырмалуу бир топ көбүрөөк бorмди жумшады. Ишен, ишенбе. Татаал материалды кирүүдөгү кыйынчылыктарга алдырбашыңарды каалайм, анткени тоскоолдуктарды жеңүү аркылуу биз жакшырып, профессионалдык жана инсандык жактан өнүгөбүз. Бул кичинекей окуя мага SpringBoot деп аталган укмуштуудай куралды колдонуу боюнча жаңы идеяларды табууга жардам берди деп үмүттөнөм. PS Github .
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION