JavaRush /Блоги Java /Random-TG /Муқаддима ба Maven, Spring, MySQL, Hibernate ва аввалин б...
Макс
Сатҳи

Муқаддима ба Maven, Spring, MySQL, Hibernate ва аввалин барномаи CRUD (қисми 4)

Дар гурӯҳ нашр шудааст
Нимирӯзи ба хайр. Дар ин мақола ман мехоҳам аввалин вохӯрии худро бо чизҳое ба монанди Maven, Spring, Hibernate, MySQL ва Tomcat дар раванди эҷоди як барномаи оддии CRUD мубодила кунам. Ин қисми ниҳоӣ аст. Мақола пеш аз ҳама барои онҳое пешбинӣ шудааст, ки дар ин ҷо аллакай 30-40 сатҳро хатм кардаанд, аммо то ҳол берун аз Java-и покро нагузоштаанд ва ҳоло бо ин технологияҳо, чаҳорчӯбаҳо ва дигар чизҳои ношинос ворид шудан ба ҷаҳони кушодро оғоз мекунанд (ё дар ҳоли ҳозир оғоз мекунанд) суханони. Ин қисми чоруми ниҳоии мақолаи "Муқаддима ба Maven, Spring, MySQL, Hibernate ва аввалин барномаи CRUD" мебошад. Қисмҳои қаблиро тавассути истиноди зерин дидан мумкин аст:

Мундариҷа:

Дизайн ва захираҳои веб

Замимаи мо кор мекунад, аммо шумо наметавонед ба он бе ашк, навиштаҷоти дилгиркунанда, истинодҳои зишт, заминаи сафеди холӣ нигоҳ кунед. Мо бояд инро ислоҳ кунем ва зебоиҳои гуногун зам кунем. Мо инро чӣ тавр мекунем? Хуб, пеш аз ҳама, шумо метавонед танҳо бо саҳифаҳо бозӣ кунед ва бо истифода аз имкониятҳои HTML ҳама гуна корҳоро иҷро кунед . Аммо агар шумо кӯшиш кунед, ки замина, рангҳо, андозаҳо, ҷойгиркунии элементҳо ва ғайраро бо истифода аз HTML тағир диҳед. ва ғайра. пас дар ниҳоят шумо метавонед аз саҳифа чунин бесарусомонӣ кунед, ки баъдтар дар он ҷо ҳеҷ чизро муайян карда наметавонед. Илова бар ин, имконоти тарҳрезии HTML хеле маҳдуд аст. Барои ин беҳтар аст, ки CSS (Cascading Style Sheets) -ро истифода баред. Он гоҳ ҳама чизҳои марбут ба тарроҳиро дар як ҷо ҷамъ кардан мумкин аст ва сипас ба унсури дилхоҳи саҳифа татбиқ карда мешавад. Рамзи CSS-ро бевосита дар саҳифаи JSP дар теги махсус навиштан мумкин аст , аммо гузоштани он дар файли алоҳида ва сипас онро танҳо ба саҳифаҳои зарурӣ татбиқ кардан хеле қулайтар аст. Барои ҷойгир кардани файлҳо бо услубҳо ва дигар захираҳои веби статикӣ, мо дар дохor webapp феҳристи алоҳида эҷод мекунем . Барои он ки захираҳои вебро бо захираҳои муқаррарӣ омехта накунем (дар он ҷо мо db.properties дорем ), биёед танҳо ба ин директория res занг занем ва ҳамаи файлҳои CSS, тасвирҳо ва ғайраро дар он ҷо ҷойгир кунем:
Муқаддима ба Maven, Spring, MySQL, Hibernate ва аввалин барномаи CRUD (қисми 4) - 1
Барои истифодаи ин файлҳо мо бояд ҷойгиршавии онҳоро дар конфигуратсия муайян кунем. Биёед ба синфи худ равем WebConfig. Пештар, мо эзоҳро @EnableWebMvcбарои танзим накардани чизе истифода мебурдем, балки танҳо конфигуратсияи пешфарзро истифода мебарем. Аммо ҳоло зарурати танзим кардани чизе вуҷуд дорад. Барои ин, мо интерфейсро истифода мебарем WebMvcConfigurer, ки ба шумо имкон медиҳад усулҳои конфигуратсияро бекор кунед. ки. мо метавонем конфигуратсияи пешфарзро истифода барем, аммо дар айни замон баъзе ҷанбаҳоро барои худамон танзим кунем. Дар ин ҳолат addResourceHandlers, ба мо усуле лозим аст, ки бо он мо ҷойгиршавии захираҳои веби статикиро нишон медиҳем. Дар ҳар сурат, тамоми синф чунин ба назар мерасад:
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;
    }
}
Ҳоло барои истифодаи CSS-и мо дар саҳифа шумо бояд ба он дар дохor тег пайванд кунед head:
<head>
    <link href="<c:url value="/res/style.css"/>" rel="stylesheet" type="text/css"/>
</head>
Танҳо ин сатрро илова кунед ва масалан, ин файли оддии CSS-ро созед:
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;
}
Ва ин ҷадвали моро ба куллӣ тағйир медиҳад (албатта аблаҳӣ менамояд, аммо ин тавр аст, масалан): Муқаддима ба Maven, Spring, MySQL, Hibernate ва аввалин барномаи CRUD (қисми 4) - 2Хуб, ман фикр мекунам, ки дар бораи CSS муфассал сӯҳбат кардан лозим нест, ҳама чиз хеле оддӣ аст. Дар Интернет шумо метавонед бисёр вариантҳои тайёрро барои тарҳрезии ҷадвалҳо ва формаҳо пайдо кунед. Аммо беҳтар аст, албатта, тарроҳиро худатон анҷом диҳед, ба шумо лозим нест, ки дизайнер бошед, дар ниҳоят, ин як сайти мураккаб нест. Ҳатто чанд соат пас аз шиносоии аввал барои эҷоди як тарҳи хеле зебо ва озода барои чунин саҳифаи оддӣ кофӣ хоҳад буд. Илова бар ин, Интернет пур аз ҳама гуна дарсҳо, мисолҳо мебошад, сайтҳои махсус мавҷуданд, ки шумо метавонед дар як экран HTML, CSS-ро таҳрир кунед ва фавран бубинед, ки ҳама чӣ гуна аст. Бо машқҳои каме шумо метавонед санъати ҳақиқиро эҷод кунед. Дуруст аст, ки шумо набояд дар ин ҷо низ аз ҳад зиёд парешон шавед (агар, албатта, шумо нақшаи дизайнер шудан надошта бошед), вагарна тарроҳӣ чунин аст, шумо метавонед дар ин ҷо муддати тӯлонӣ часпид. Вақте ки ман бори аввал ба фаҳмидани CSS шурӯъ кардам, ман дармон шудам. Ман мехостам ҳама чизро, ҳар як амволро санҷам, чизеро печонам, бо он кор кунам, таҷриба кунам, саҳифаҳои баъзе сайтҳоро гирифта, онҳоро ба таври шинохтанашаванда аз нав созам. Ман шояд як ҳафта бо ин бозича кайф карда будам, дигар коре накардам, то он даме, ки маро раҳо накунад :) Хуб, дар маҷмӯъ, албатта, шумо набояд аз ҳад зиёд кор кунед ва мӯъҷизаи рангоранги нофаҳмо созед, шумо бояд ин корро оддӣ кунед ва бо завк. Ягона чизе, ки қобor қайд аст. Шумо бояд фаҳмед, ки CSS тавсифи тарроҳӣ ва HTML аломатгузорӣ аст . Шумо набояд кӯшиш кунед, ки ҳама чизро тавассути CSS иҷро кунед; иҷрои баъзе ҷанбаҳо хеле душвор хоҳад буд ва баъзеи онҳо ғайриимкон аст, вақте ки дар HTML ин бо якчанд сатри иловагӣ ё ҳатто як атрибут дар тег анҷом дода мешавад. Шумо бояд онҳоро муттаҳид кунед, ҳама гуна рангҳо, заминаҳо, шрифтҳоро дар CSS созед ва агар масалан, ба шумо якчанд ҳуҷайраҳои ҷадвалро муттаҳид кардан лозим бошад, истифодаи асбобҳои HTML осонтар аст. Хуб, масалан, ин аст он чизе ки ман тавонистам бо саҳифаҳо дар тӯли якчанд соат бо CSS ва HTML кор кунам (ман дар ин ҷо дар бораи бесарусомоние, ки барои ноил шудан ба ин кор кардаам, муфассал нақл намекунам, дар ниҳоят истинод ба GitHub-и ин лоиҳа, ки шумо метавонед онро бубинед): Муқаддима ба Maven, Spring, MySQL, Hibernate ва аввалин барномаи CRUD (қисми 4) - 3Албатта, ман намедонам, ки ман ҳама чизро дар он ҷо чӣ қадар босалоҳият кардам, аммо бо назардошти он, ки ман бори аввал CSS-ро як ҳафта пеш дида будам, ман фикр мекунам, ки ин хеле хуб шуд.

Саҳифабандӣ

Ҳоло ҳама чиз кор мекунад, хуб ба назар мерасад, аммо то ҳол дар ҷадвал танҳо чанд сабт мавҷуд аст. Чӣ мешавад, агар дар он сад филм ё ҳазор филм бошад?.. Дар ин рӯйхат ҳаракат кардан чандон қулай нест. Масалан, вақте ки рӯйхат дар саҳифаҳои 10 сабт намоиш дода мешавад, хеле қулайтар аст. Аз ин рӯ, ҳоло мо кӯшиш хоҳем кард, ки рӯйхатро ба саҳифаҳо тақсим кунем (баъзан онро "пейджинг" ё "саҳифасозӣ" низ меноманд ( саҳифабандии англисӣ )). Инро бо роҳҳои гуногун анҷом додан мумкин аст. Масалан, шумо метавонед рӯйхати пурраро ба саҳифаи jsp интиқол диҳед ва дар он ҷо барои шумораи зарурии сабтҳо ҷадвал эҷод кунед. Ё, масалан, шумо метавонед сабтҳои лозимиро аз рӯйхати умумии хадамот берун кашед ва он гоҳ ин рӯйхатро ба саҳифаи jsp барои намоиш фиристед. Аммо беҳтар аст, ки ин корро дар сатҳи пойгоҳи додаҳо анҷом диҳед. Идеяи он нест, ки руйхати пурраро аз база гирифта, баъд ба киемхо чудо кунем, балки дар аввал порчаи лозимиро аз база гирифта, ба хама чизи дигар даст нарасонем. Охир, чаро ба мо лозим аст, ки якбора садҳо ё ҳазорҳо сабтҳоро аз пойгоҳи додаҳо берун кашем, агар он чизе, ки ба мо лозим аст, дар даҳгонаи аввал бошад, беҳтар аст, ки танҳо як даҳ сабтро кашем. Биёед ба DAO равем ва ба усули allFilmsпараметре илова кунем int page, ки барои рақами саҳифа масъул хоҳад буд (дар хидмат, албатта, мо низ ҳамин тавр мекунем). Ва биёед татбиқи ин усулро каме тағир диҳем; агар пештар мо тамоми рӯйхатро хориҷ карда бошем, ҳоло танҳо як қисми онро берун мекунем. setFirstResultУсулҳо (аз кадом сатри ҷадвал оғоз кардан лозим аст) ва setMaxResults(чанд сабт барои намоиш додан) дар ин кор ба мо кӯмак мекунанд :
@SuppressWarnings("unchecked")
public List<Film> allFilms(int page) {
    Session session = sessionFactory.getCurrentSession();
    return session.createQuery("from Film").setFirstResult(10 * (page - 1)).setMaxResults(10).list();
}
Онхое. агар ин саҳифаи 1 бошад, мо ҳадди аксар 10 сабтро аз 0-ум нишон медиҳем; агар ин саҳифаи 5-ум бошад, пас 10 сабт сар карда аз 40-ум (фаромӯш накунед, ки рақамгузорӣ дар базаи маълумот аз 0 оғоз мешавад). Мо инчунин усулеро эҷод мекунем, ки шумораи сабтҳоро дар ҷадвал бармегардонад. Мо ин лозим аст, то шумораи ҳамаи саҳифаҳоро донем ва барои онҳо дар саҳифаи jsp истинодҳо эҷод кунем:
public int filmsCount() {
     Session session = sessionFactory.getCurrentSession();
     return session.createQuery("select count(*) from Film", Number.class).getSingleResult().intValue();
 }
Бо истифода аз чунин дархост, мо рақами ҳамаи сабтҳои ҷадвалро (ҳамчун intарзиш) бидуни кашидани худи сабтҳо мегирем. Акнун биёед ба контроллер равем ва бо усуле кор кунем, ки саҳифаи асосиро бо рӯйхати филмҳо бармегардонад:
@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;
}
Дар ин ҷо шарҳи нав пайдо шуд @RequestParam, ки нишон медиҳад, ки мо ин арзишро аз параметри дархост мегирем. Ҳоло, агар мо ба суроғае бо параметр равем, масалан http://localhost:8080/ ?page=4 , мо мувофиқан саҳифаи 4-умро мегирем. Мо арзиши пешфарзро ба " 1 " муқаррар кардем, то вақте ки барнома оғоз меёбад, вақте ки мо ба суроғае бидуни параметри http://localhost:8080/ меравем , мо саҳифаи аввалро мегирем. Дар усул мо шумораи ҳамаи сабтҳоро мегирем, пас бо ин роҳи оддӣ шумораи саҳифаҳоро ҳисоб мекунем. Онхое. агар мо 10 сабт дошта бошем, ин 1 саҳифа аст ва агар 11 бошад, ин аллакай 2 аст. Хуб, мо ҳама чизро ба модел интиқол медиҳем. Шумо бояд шумораи саҳифаҳоро донед, то пайвандҳо барои ҳамаи онҳо дар як давра эҷод кунед ва бигзоред, ки шумораи филмҳо дар он ҷо бошанд, масалан, агар шумо хоҳед, ки ин маълумотро дар ягон ҷо дар саҳифа намоиш диҳед. Ҳоло танҳо ин аст, ки ба films.jsp равед ва бо истифода аз ин сохтор истинод ба ҳар як саҳифа илова кунед:
<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>
Мо пайвандҳоро аз рӯи ҳисобкунакҳои 1, 2, 3, ... эҷод мекунем ва параметрро аз рӯи арзиши индекс муқаррар мекунем.

Дар омади гап, ҳамон тавре, ки бо саҳифабандӣ, шумо метавонед хусусиятҳои дигарро, ба монанди мураттабкунӣ, филтркунӣ ва ҷустуҷӯ илова кунед. Мо танҳо параметрҳои гуногунро ба усули DAO мегузорем ва онҳоро барои ташкor дархости мувофиқ ба пойгоҳи додаҳо истифода мебарем, то сабтҳои лозимиро бо тартиби зарурӣ кашем.

Биёед боз як ламси хурд илова кунем. Мо ба контролер бармегардем. Дар усулҳои илова, таҳрир ва нест кардан, пас аз анҷоми амалиёт, мо ба саҳифаи асосии "redirect:/" равона мекунем . ки. агар мо дар ҷое дар саҳифаи 50-ум бошем ва вуруди таҳрирро пахш кунем, пас пас аз иҷро мо ба суроғаи " / " меравем , яъне. Биёед ба саҳифаи 1 баргардем. Ин чандон қулай нест, ман мехоҳам ба он ҷое, ки аз куҷо омадаем, баргардам. Биёед инро хеле содда ҳал кунем. Биёед дар синф FilmControllerяк тағирёбандаи мисол эҷод кунемint page
private int page;
Дар дохor усул allFilmsмо арзиши параметрро ба ин тағирёбанда таъин мекунем page:
this.page = page;
ки. Ҳар дафъае, ки ин усул иҷро карда мешавад (яъне вақте ки мо дар саҳифаҳо паймоиш мекунем), арзиши саҳифаи ҷорӣ ба тағирёбанда навишта мешавад. Ва он гоҳ мо ин арзишро дар усулҳои худ барои бозгардонидан ба ҳамон саҳифа истифода мебарем.
modelAndView.setViewName("redirect:/?page=" + this.page);

Хулоса

Мо эҳтимол дар ин ҷо ба охир мерасем. Натиҷа як барномаи мукаммали CRUD мебошад. Он бешубҳа аз идеал дур аст (хеле дур), аммо он метавонад оптимизатсия ва такмил дода шавад, хатогиҳо ислоҳ карда шаванд ва функсияҳо илова карда шаванд. Шумо метавонед усулҳои дарунсохтро барои амалиётҳои хом истифода баред; илова кардани филтр, ҷустуҷӯ, ҷудокунӣ; дигар ҷадвалҳои алоқамандро илова кунед; амалӣ намудани дастгирии корбарони гуногун бо авторизатсия ва аутентификатсия ва ғайра. ва ғайра. Доираи хаёлот беканор аст, бинобар ин ба он равед. Истинод ба github-и ин лоиҳа . Ба диққататон ташаккур. PS Ин аввалин кӯшиши ман дар навиштани мақола аст, бинобар ин ба таври қатъӣ доварӣ накунед :). Ман бахшиш мепурсам, ки ягон истинодҳои гуногунро ба захираҳои муфид илова накардаам; мутаассифона, ман то ҳол одати захира кардани истинодҳо ба манбаъҳоеро, ки аз онҳо маълумот мегирам, инкишоф дода наметавонам. Ва, албатта, барои ҳарфҳои зиёд бахшиш мепурсам, кӯтоҳӣ истеъдоди ман нест, умедворам, ки касе аз ӯҳдаи ин кор баромада метавонад. Истинодҳо ба ҳама қисмҳо
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION