JavaRush /Java blogi /Random-UZ /Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasig...
Макс
Daraja

Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasiga kirish (4-qism)

Guruhda nashr etilgan
Hayrli kun. Ushbu maqolada men oddiy CRUD ilovasini yaratish jarayonida Maven, Spring, Hibernate, MySQL va Tomcat kabi narsalar bilan birinchi uchrashuvimni baham ko'rmoqchiman. Bu yakuniy qism. Maqola, birinchi navbatda, bu erda 30-40 darajani tugatgan, lekin hali sof Java-dan tashqariga chiqmagan va ushbu texnologiyalar, ramkalar va boshqa notanish dunyoga endigina kirishni boshlayotgan (yoki boshlamoqchi bo'lgan)lar uchun mo'ljallangan. so'zlar. Bu "Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasiga kirish" maqolasining yakuniy to'rtinchi qismi. Oldingi qismlarni quyidagi havolalar orqali ko'rish mumkin:

Tarkib:

Dizayn va veb-resurslar

Bizning ilovamiz ishlaydi, lekin siz ko'z yoshlarsiz, zerikarli yozuvlarsiz, xunuk havolalarsiz, bo'sh oq fonsiz qaray olmaysiz. Biz buni tuzatishimiz va turli xil go'zalliklarni qo'shishimiz kerak. Buni qanday qilamiz? Xo'sh, birinchi navbatda, siz sahifalar bilan o'ynashingiz va HTML imkoniyatlaridan foydalangan holda har xil narsalarni qilishingiz mumkin . Ammo agar siz faqat HTML yordamida fonni, ranglarni, o'lchamlarni, elementlarning joylashishini va hokazolarni o'zgartirishga harakat qilsangiz. va h.k. keyin oxirida siz sahifadan shunday tartibsizlik qilishingiz mumkinki, keyinchalik u erda hech narsani aniqlay olmaysiz. Bundan tashqari, HTML-ning dizayn imkoniyatlari juda cheklangan. Buning uchun CSS (Cascading Style Sheets) dan foydalanish yaxshiroqdir. Keyin dizayn bilan bog'liq bo'lgan hamma narsa bir joyda to'planishi mumkin, keyin esa sahifaning kerakli elementiga qo'llanilishi mumkin. CSS kodini to'g'ridan-to'g'ri JSP sahifasida maxsus tegda yozish mumkin , ammo uni alohida faylga qo'yish va keyin uni kerakli sahifalarga qo'llash ancha qulayroqdir. Uslublar va boshqa statik veb-resurslarga ega fayllarni joylashtirish uchun biz webapp ichida alohida katalog yaratamiz . Veb-resurslarni oddiy resurslar bilan chalkashtirmaslik uchun (bu erda bizda db.properties mavjud ), keling, ushbu katalogni res deb nomlaymiz va u erda barcha CSS fayllari, rasmlari va boshqalarni joylashtiramiz:
Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasiga kirish (4-qism) - 1
Ushbu fayllardan foydalanish uchun biz konfiguratsiyada ularning joylashuvini ko'rsatishimiz kerak. Keling, sinfimizga boraylik WebConfig. Ilgari biz hech narsani sozlamaslik uchun izohdan foydalanganmiz @EnableWebMvc, lekin oddiy konfiguratsiyadan foydalanardik. Ammo hozir biror narsani sozlash kerak. Buning uchun biz foydalanamiz interfeys WebMvcConfigurer, bu konfiguratsiya usullarini bekor qilish imkonini beradi. Bu. biz standart konfiguratsiyadan foydalanishimiz mumkin, lekin ayni paytda o'zimiz uchun ba'zi jihatlarni moslashtiramiz. Bunday holda addResourceHandlers, bizga statik veb-resurslarning joylashishini ko'rsatadigan usul kerak. Har holda, butun sinf shunday ko'rinishga ega bo'ladi:
package testgroup.filmography.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "testgroup.filmography")
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/res/**").addResourceLocations("/res/");
    }

    @Bean
    ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/pages/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}
Endi sahifamizda CSS-dan foydalanish uchun teg ichida unga bog'lanishingiz kerak head:
<head>
    <link href="<c:url value="/res/style.css"/>" rel="stylesheet" type="text/css"/>
</head>
Shu qatorni qo'shing va, masalan, oddiy CSS faylini yarating:
table {
    border-spacing: 0 10px;
    font:  bold 100% Georgia, serif;
    margin: 40px auto;
    text-shadow: 5px 5px 5px #3F3F7F;
    background: #B1B9D9;
    text-align: center;
    vertical-align: middle;
    width: 50%;
    border: 10px solid blue;
}
Va bu bizning jadvalimizni butunlay o'zgartiradi (bu ahmoqona ko'rinadi, albatta, lekin bu, masalan, shunday): Maven, Spring, MySQL, Hibernate va birinchi CRUD ilovasiga kirish (4-qism) - 2Menimcha, CSS haqida batafsil gapirishning hojati yo'q, hamma narsa juda oddiy. Internetda siz jadvallar va shakllarni loyihalash uchun juda ko'p tayyor variantlarni topishingiz mumkin. Lekin, albatta, dizaynni o'zingiz qilishingiz yaxshiroq, siz dizayner bo'lishingiz shart emas, axir, bu qandaydir murakkab sayt emas. Birinchi tanishuvdan bir necha soat o'tgach, bunday oddiy sahifa uchun juda chiroyli va chiroyli dizayn yaratish uchun etarli bo'ladi. Bundan tashqari, Internet har xil darslar, misollar bilan to'la, siz HTML, CSS-ni bir vaqtning o'zida bir ekranda tahrirlashingiz va barchasi qanday ko'rinishini darhol ko'rishingiz mumkin bo'lgan maxsus saytlar mavjud. Bir oz mashq qilsangiz, haqiqiy san'atni yaratishingiz mumkin. To'g'ri, siz bu erda ham haddan tashqari o'zingizni tutmasligingiz kerak (agar siz dizayner bo'lishni rejalashtirmasangiz), aks holda dizayn - bu juda uzoq vaqt davomida qolib ketishingiz mumkin. CSS-ni birinchi marta tushuna boshlaganimda, men tiqilib qoldim. Men hamma narsani, har bir mulkni sinab ko'rmoqchi bo'ldim, nimanidir burardim, u bilan o'ynadim, tajriba o'tkazdim, ba'zi saytlarning sahifalarini oldim va ularni tanib bo'lmas darajada qayta yaratdim. Men, ehtimol, bir hafta davomida bu o'yinchoq bilan xursand bo'ldim, boshqa hech narsa qilmadim, u meni qo'yib yubormaguncha :) Xo'sh, umuman olganda, siz buni haddan tashqari oshirib, tushunarsiz rang-barang mo''jiza yaratmasligingiz kerak, buni oddiy qilish kerak va did bilan. E'tiborga loyiq yagona narsa. Siz tushunishingiz kerakki, CSS dizayn tavsifi , HTML esa belgilashdir . Siz CSS orqali mutlaqo hamma narsani qilishga urinmasligingiz kerak; ba'zi jihatlarni bajarish juda qiyin bo'ladi, ba'zilari esa imkonsizdir, agar HTMLda bu bir nechta qo'shimcha qatorlar yoki tegda faqat bitta atribut bilan amalga oshirilsa. Siz ularni birlashtirishingiz, CSS-da barcha turdagi ranglar, fonlar, shriftlarni yaratishingiz kerak va agar, masalan, bir nechta jadval katakchalarini birlashtirishingiz kerak bo'lsa, HTML vositalaridan foydalanish osonroq. Misol uchun, men CSS va HTML bilan bir necha soat o'ynab, sahifalar bilan nima qila oldim (men bu erda men bunga erishish uchun qilgan tartibsizliklar haqida batafsil gapirmayman, oxirida shunday bo'ladi. ushbu loyihaning GitHub-ga havola, u erda siz ko'rishingiz mumkin): Знакомство с Maven, Spring, MySQL, Hibernate и первое CRUD приложение (часть 4) - 3Albatta, men u erda hamma narsani qanchalik malakali qilganimni bilmayman, lekin CSS-ni bir hafta oldin birinchi marta ko'rganimni hisobga olsak, bu juda yaxshi chiqdi.

Sahifalar

Endi hamma narsa ishlaydi, yaxshi ko'rinadi, ammo jadvalda hozircha bir nechta yozuvlar mavjud. Unda yuzta yoki mingta film bo‘lsa-chi?.. Bunday uzun ro‘yxatni aylanib chiqish unchalik qulay emas. Ro'yxat, masalan, 10 ta yozuvdan iborat sahifalarda ko'rsatilganda, bu ancha qulayroq. Shuning uchun, endi biz ro'yxatni sahifalarga bo'lishni amalga oshirishga harakat qilamiz (ba'zan bu "paging" yoki "sahifalash" ( inglizcha pagination ) deb ham ataladi). Bu turli yo'llar bilan amalga oshirilishi mumkin. Misol uchun, siz to'liq ro'yxatni jsp sahifasiga o'tkazishingiz va u erda kerakli miqdordagi yozuvlar uchun jadval yaratishingiz mumkin. Yoki, masalan, xizmatdagi umumiy ro'yxatdan kerakli yozuvlarni chiqarib olishingiz va keyin ushbu mini-ro'yxatni ko'rsatish uchun jsp sahifasiga yuborishingiz mumkin. Lekin, albatta, buni ma'lumotlar bazasi darajasida qilish eng yaxshisidir. Maqsad ma'lumotlar bazasidan to'liq ro'yxatni olib, keyin uni qismlarga bo'lish emas, balki dastlab ma'lumotlar bazasidan kerakli qismni boshqa hamma narsaga tegmasdan olishdir. Axir, nega biz bir vaqtning o'zida ma'lumotlar bazasidan yuzlab yoki minglab yozuvlarni olib tashlashimiz kerak, agar bizga kerak bo'lgan narsa birinchi o'ntalikka kirsa, faqat shu o'ntalikni olib tashlash yaxshiroqdir. Keling, DAO ga boramiz va usulga allFilmsparametr qo'shamiz int page, sahifa raqami uchun javobgar bo'ladi (xizmatda, albatta, biz ham xuddi shunday qilamiz). Va keling, ushbu usulni amalga oshirishni biroz o'zgartiraylik; agar ilgari biz butun ro'yxatni chiqargan bo'lsak, endi biz faqat bir qismini chiqaramiz. setFirstResultBunda usullar (jadvalning qaysi qatoridan boshlash kerak) va setMaxResults(qancha yozuvlarni ko'rsatish) bizga yordam beradi :
@SuppressWarnings("unchecked")
public List<Film> allFilms(int page) {
    Session session = sessionFactory.getCurrentSession();
    return session.createQuery("from Film").setFirstResult(10 * (page - 1)).setMaxResults(10).list();
}
Bular. agar bu birinchi sahifa bo'lsa, biz 0-dan boshlab maksimal 10 ta yozuvni ko'rsatamiz; agar bu 5-sahifa bo'lsa, 40-dan boshlab 10 ta yozuvni ko'rsatamiz (ma'lumotlar bazasida raqamlash 0 dan boshlanishini unutmang). Shuningdek, biz qo'shimcha ravishda jadvaldagi yozuvlar sonini qaytaradigan usul yaratamiz. Bu barcha sahifalar sonini bilish va jsp sahifamizda ular uchun havolalar yaratish uchun kerak bo'ladi:
public int filmsCount() {
     Session session = sessionFactory.getCurrentSession();
     return session.createQuery("select count(*) from Film", Number.class).getSingleResult().intValue();
 }
Bunday so'rovdan foydalanib, biz jadvaldagi barcha yozuvlar sonini ( intqiymat sifatida) yozuvlarni o'zlari chiqarmasdan olamiz. Endi kontrollerga o'tamiz va filmlar ro'yxati bilan asosiy sahifani qaytaradigan usul ustida ishlaymiz:
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView allFilms(@RequestParam(defaultValue = "1") int page) {
    List&ltFilm> films = filmService.allFilms(page);
    int filmsCount = filmService.filmsCount();
    int pagesCount = (filmsCount + 9)/10;
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("films");
    modelAndView.addObject("page", page);
    modelAndView.addObject("filmsList", films);
    modelAndView.addObject("filmsCount", filmsCount);
    modelAndView.addObject("pagesCount", pagesCount);
    return modelAndView;
}
Bu erda yangi izoh paydo bo'ldi @RequestParam, bu biz ushbu qiymatni so'rov parametridan olayotganimizni ko'rsatadi. Endi, agar biz parametrli manzilga o'tsak, masalan, http://localhost:8080/ ?page=4 , biz mos ravishda 4-sahifani olamiz. Biz standart qiymatni " 1 " ga o'rnatdik, shunda dastur ishga tushganda, http://localhost:8080/ parametri bo'lmagan manzilga o'tsak , biz birinchi sahifani olamiz. Usulda biz barcha yozuvlar sonini olamiz, keyin bu oddiy usulda biz sahifalar sonini hisoblaymiz. Bular. agar bizda 10 ta yozuv bo'lsa, bu 1 sahifa va agar 11 bo'lsa, bu allaqachon 2. Xo'sh, biz bu narsani modelga o'tkazamiz. Ularning barchasiga bir tsiklda havolalar yaratish uchun siz sahifalar sonini bilishingiz kerak va filmlar soni har qanday holatda, masalan, sahifaning biron bir joyida ushbu ma'lumotni ko'rsatishni xohlasangiz, u erda bo'lsin. Endi faqat films.jsp saytiga o‘tish va ushbu konstruksiyadan foydalanib har bir sahifaga havolalar qo‘shish qoladi:
<c:forEach begin="1" end="${pagesCount}" step="1" varStatus="i">
    <c:url value="/" var="url">
        <c:param name="page" value="${i.index}"/>
    </c:url>
    <a href="${url}">${i.index}</a>
</c:forEach>
Biz 1, 2, 3, ... hisoblagichlar bo'yicha havolalar yaratamiz va parametrni indeks qiymati bo'yicha o'rnatamiz.

Aytgancha, sahifalash bilan bir xil tarzda siz saralash, filtrlash va qidirish kabi boshqa xususiyatlarni qo'shishingiz mumkin. Biz shunchaki DAO usuliga turli parametrlarni o'tkazamiz va ulardan kerakli tartibda kerakli yozuvlarni chiqarish uchun ma'lumotlar bazasiga tegishli so'rovni shakllantirish uchun foydalanamiz.

Keling, yana bir kichik teginish qo'shamiz. Biz boshqaruvchiga qaytamiz. Qo'shish, tahrirlash va o'chirish usullarida operatsiya tugagandan so'ng biz asosiy sahifaga yo'naltiramiz "redirect:/" . Bu. agar biz 50-sahifada biror joyda bo'lsak va yozuvni tahrirlash tugmasini bosing, keyin bajarilgandan so'ng biz " / " manziliga o'tamiz , ya'ni. Keling, 1-sahifaga qaytaylik. Bu juda qulay emas, men kelgan joyimizga qaytishni xohlayman. Keling, buni juda oddiy hal qilaylik. Keling, sinfda FilmControllermisol o'zgaruvchisini yarataylikint page
private int page;
Usul ichida allFilmsbiz ushbu o'zgaruvchiga parametr qiymatini tayinlaymiz page:
this.page = page;
Bu. Ushbu usul har safar bajarilganda (ya'ni, sahifalar bo'ylab harakat qilganimizda), joriy sahifaning qiymati o'zgaruvchiga yoziladi. Va keyin biz ushbu qiymatni o'sha sahifaga qayta yo'naltirish uchun usullarimizda ishlatamiz.
modelAndView.setViewName("redirect:/?page=" + this.page);

Xulosa

Ehtimol, biz shu erda tugatamiz. Natijada to'liq huquqli CRUD ilovasi. Bu, albatta, idealdan uzoq (juda uzoq), lekin uni optimallashtirish va yaxshilash mumkin, xatolar tuzatiladi va funksionallik qo'shiladi. Xamir operatsiyalari uchun o'rnatilgan usullardan foydalanishingiz mumkin; filtrlash, qidirish, saralashni qo'shish; boshqa tegishli jadvallarni qo'shing; avtorizatsiya va autentifikatsiya bilan turli foydalanuvchilarni qo'llab-quvvatlashni amalga oshirish va hokazo. va h.k. Tasavvur doirasi cheksizdir, shuning uchun unga boring. Ushbu loyihaning github ga havola . E'tiboringiz uchun rahmat. PS Bu mening hayotimdagi maqola yozishga birinchi urinishim, shuning uchun qat'iy hukm qilmang :). Foydali manbalarga boshqa havolalarni qo'shmaganim uchun uzr so'rayman; afsuski, men hali ham ma'lumot oladigan manbalarga havolalarni saqlash odatini rivojlantira olmayapman. Va, albatta, ko'p harflar uchun uzr so'rayman, qisqalik mening iste'dodim emas, umid qilamanki, kimdir buni uddalay oladi. Barcha qismlarga havolalar
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION