Məzmun:
- Giriş
- Layihənin yaradılması
- Yay MVC bağlantısı
- Səhifələrin və Nəzarətçinin yaradılması
- Konfiqurasiya
- Model
- Model-View-Nəzarətçi
Giriş
İstifadə olunduğu müxtəlif nümunələri öyrənməklə mənim üçün yeni olan texnologiyalar və çərçivələrlə tanış olmağa başladım, çünki adətən tam hüquqlu bir tətbiq nümunəsindən istifadə edərək bir şeyi hərəkətdə görəndə daha yaxşı başa düşürəm. Tipik olaraq, belə nümunələr CRUD proqramlarıdır ( C reate, Read , U pdate, D elete), İnternet müxtəlif mürəkkəblik dərəcələrinin belə nümunələri ilə doludur. Problem ondadır ki, onlar adətən orada necə, nə və nə üçün edildiyini, niyə filan asılılığın əlavə edildiyini, filan sinfin nə üçün lazım olduğunu və s. Əksər hallarda, onlar son POM faylı ilə, dərslərin son versiyaları ilə tamamilə bitmiş bir proqram qəbul edirlər və təcrübəli bir insana yəqin ki, aydın görünən xırda şeylərə diqqət yetirmədən sadəcə hər birini keçirlər. Mən bir çox belə nümunələrə baxdım və adətən hər şeyin necə işlədiyi aydın olur, lakin onların buna necə gəldiyi tam aydın deyil. Buna görə də, belə bir nümunənin təcrübəli bir tərtibatçının mövqeyindən deyil, Bahar, Hibernate və digər şeylərlə heç vaxt məşğul olmayan bir başlanğıc mövqeyindən faydalı olacağına qərar verdim.Layihənin yaradılması
Beləliklə, mən yeni olduğum üçün heç bir qaranlıq arxetiplərdən istifadə etməyəcəyik. Spring initializr hələ də çox qorxulu səslənir. Buna görə də ən adi sadə Maven layihəsini yaradacağıq. Mənim domen adım yoxdur, ona görə də groupid-də sadəcə yazacağamtestgroup
və artefaktda adı yazacam, məsələn, filmography
(bu filmlərin siyahısı olacaq). Biz layihə yaradırıq və Enable auto-import
ideya nə vaxt təklif edirsə, onu seçirik. Bunun sayəsində hər dəfə POM faylına hər hansı dəyişiklik etdikdə (Project Object Model, bu fayl Maven layihəsinin bütün strukturunu təsvir edir), hər şey dərhal avtomatik olaraq layihəyə tətbiq olunacaq. Əgər bizdə artıq varsa, kitabxanalar yerli depomuzdan götürüləcək və ya əvvəllər məşğul olmadığımız bəzi yeni asılılıqlardan istifadə etsək, Maven onları sadəcə mərkəzi repozitoriyadan İnternet vasitəsilə endirəcək. Maven həmçinin mənbələri və sənədləri yükləmək funksiyasına malikdir (Mənbələri və/və ya Sənədləri yükləyin). Bu, həm də çox rahatdır, əgər hansısa sinif və ya metodda bir şey aydın deyilsə, mənbə koduna daxil olub hamısının içəridə necə işlədiyini görə bilərsiniz. Bir-iki təfərrüat əlavə edək. Bu veb tətbiqi olacaq və biz Tomcat istifadə edəcəyik . Bir tətbiqi Tomcat-a yerləşdirmək üçün onu müharibə arxivi şəklində ora köçürməlisiniz (Veb Tətbiq Resursu, veb proqramları üçün xüsusi format). Bunu etmək üçün POM faylına aşağıdakı sətri əlavə edin ki, proqram müharibə arxivinə yığılsın:
<packaging>war</packaging>
Yaxşı, veb mənbələr üçün xüsusi bir kataloqa da ehtiyacınız olacaq, bizim vəziyyətimizdə jsp səhifələri və bəzi veb resursları olacaq . main
Bir kataloq yaradaq webapp
. Tam olaraq belə adlandırılmalı və ilə eyni main
şəkildə yerləşməlidir java
, resources
çünki bu standart Maven kataloq strukturudur. Paketi quraşdırdıqdan war
və bununla da bunun veb layihəsi olduğunu müəyyən etdikdən sonra kataloq webapp
avtomatik olaraq Veb proqram mənbələri kimi qeyd olunacaq (onda mavi nöqtə olacaq) və internetlə əlaqəli hər şey bu qovluqda axtarılacaq. Və bir an. Varsayılan olaraq, Maven dil versiyası 1.5-dən istifadə edir, lakin mən, məsələn, 1.8 - Java 8 versiyasından istifadə etmək istəyirəm (10 və ya 11-i götürə bilərsiniz, lakin hələ də oradan heç bir funksiyadan istifadə etmək planları yoxdur, ona görə də 8 olsun. ). Bunu çox sadə şəkildə həll etmək olar, biz Google-da “Maven java 8” kimi bir şey yazırıq və POM faylına nə əlavə etmək lazım olduğunu görürük ki, Maven tələb olunan versiya üçün dərslərimizi tərtib etsin. Nəticədə, biz aşağıdakıları əldə edirik:
Yay MVC bağlantısı
Bir yerdən başlamaq lazımdır. Plana görə, verilənlər bazasını birləşdirəcəyik və Hibernate-dən istifadə edəcəyik, lakin bütün bunlar hələlik bir az qorxulu səslənir. Əvvəlcə daha sadə bir şey etməliyik. Spring MVC, bu artıq daha yaxşıdır, MVC nümunəsi ilə çoxdan tanışıq, kursun böyük tapşırıqlarının yarısında istifadə edilmişdir. Buradan rəqs etməyə başlayacağıq. Spring MVC ilə veb tətbiqi yaratmaq üçün bizə Servlet-API də lazımdır, yəni. onun köməyi ilə sorğu-cavab qarşılıqlı əlaqəsinin baş tutacağı şey. Bunu birləşdirməyə çalışaq. Google-a gedirik, Maven deposunda lazımi asılılıqları axtarırıq və onlarıpom.xml
. Xarici Kitabxanalar bölməsində siz yalnız spring-webmvc-nin deyil , həm də bir çox başqa şeylərin yükləndiyini görə bilərsiniz. Bunlar. yaz nüvəsi , kontekst , lobya və s. üçün asılılıqları əlavə etməyə ehtiyacımız yoxdur. bizə lazım olan hər şey spring-webmvc ilə birlikdə çəkildi .
Kiçik bir imtina etməliyik. İstifadə olunan hər bir kitabxana üçün asılılıq əlavə etmək tövsiyə olunur, hətta onlar artıq əlavə olunmuşlarla birlikdə yığılsa belə, çünki bu, bəzi problemlərdən və nasazlıqlardan qaçmağa kömək edə bilər. Sadə bir misal. Deyək ki, biz bəzi API-dən istifadə edən bir asılılıq əlavə etdik və eyni zamanda bu API üçün bir növ həyata keçirəcək. Və sonra biz eyni API-dən istifadə edən başqa bir asılılıq əlavə etdik və bunun üçün tətbiqinin bir hissəsini çəkdik, lakin bu dəfə fərqlidir. Beləliklə, eyni API-nin 2 fərqli tətbiqinə sahib olacağıq. Və əgər biz özümüz bu API-nin bəzi üsullarını haradasa istifadə etmək istəsək, onda problem yaranacaq, çünki sistem hansı tətbiqdən istifadə edəcəyini bilməyəcək, təsadüfi seçəcək, bəlkə də gözlədiyimiz kimi deyil. Tətbiqlərdən biri üçün bir asılılığı açıq şəkildə göstərsəniz, ona üstünlük veriləcəkdir. Ancaq bu, o qədər də ciddi tövsiyə deyil, əsasən müxtəlif şirkətlərin bir çox müxtəlif kitabxanalarının istifadə olunduğu böyük layihələrə aiddir. POM faylını çox yükləməmək üçün burada bunu etməyəcəyik; heç bir problem gözlənilmir. Ancaq buna baxmayaraq, bunu hələ də yadda saxlamağa dəyər. |
provided
asılı nə deməkdir javax.servlet-api
? Əhatə dairəsi asılılığın əhatə dairəsidir, provided
bu o deməkdir ki, asılılıq proqramın tərtib edilməsi və sınaqdan keçirilməsi mərhələsində mövcud olacaq, lakin o, arxivləşdirilməyəcək. Fakt budur ki, tətbiqi yerləşdirmək üçün biz Tomcat servlet konteynerindən istifadə edəcəyik və onun içərisində artıq belə kitabxanalar var, ona görə də onları ora köçürməyə və arxivi lazımsız yüklə yükləməyə ehtiyac yoxdur. İrəliyə baxsaq, eyni səbəbdən biz adi üsul olmadan edəcəyik main
, çünki o, Tomcat daxilində artıq mövcuddur.
Səhifələrin və Nəzarətçinin yaradılması
İndi sadə bir şey bişirməyə çalışaq. Birincisi, əlavə bir kataloq yaradaqwebapp
, məsələn pages
, baxışlarımızın saxlanacağı, yəni. jsp səhifələrini seçin və bir neçə səhifə yaradın. Gələcəkdə filmlərin siyahısının nümayiş olunacağı bir səhifəyə ehtiyacımız olacaq, məsələn films.jsp
, və bəlkə redaktə üçün ayrıca bir səhifə yarada bilərik editPage.jsp
. Hələlik onları ciddi bir şeylə doldurmayacağıq; sadəcə sınaq üçün bir səhifədə digərinə keçid edəcəyik. İndi bizə sorğuları emal edəcək bir sinif lazımdır, yəni. nəzarətçi. Gəlin yeni paket əlavə edək controller
və orada bir sinif yaradaq FilmController
(ümumiyyətlə, hər şeyi müxtəlif paketlərdə paketləmək lazım deyil, bu proqram çox kiçik və sadə olacaq, lakin normal bir layihədə çoxlu kontrollerlər, konfiqurasiya sinifləri, modellər ola bilər. və s., buna görə də kiçik layihələrdən başlayaraq, qarışıqlıq olmaması üçün dərhal hər şeyi nizamlı və strukturlaşdırılmış şəkildə etməyə alışmaq daha yaxşıdır). Bu sinifdə sorğulara cavab olaraq fikirlərimizi qaytaracaq üsullar yaradacağıq.
package testgroup.filmography.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class FilmController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView allFilms() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("films");
return modelAndView;
}
@RequestMapping(value = "/edit", method = RequestMethod.GET)
public ModelAndView editPage() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("editPage");
return modelAndView;
}
}
Nə mənası var? Spring MVC adlı bir şey var DispatcherServlet
. Bu, əsas nəzarətçi kimidir, bütün daxil olan sorğular ondan keçir və sonra onları xüsusi nəzarətçiyə ötürür. Annotasiya @Controller
sadəcə Spring MVC-yə deyir ki, bu sinif bir nəzarətçidir (yaxşı, ümumiyyətlə məntiqlidir), dispetçer @RequestMapping
müvafiq metodu çağırmaq üçün annotasiyaları yoxlayacaq. Annotasiya @RequestMapping
nəzarətçi metodları üçün ünvanlar təyin etməyə imkan verir ki, bu da onların müştəridə (brauzerdə) mövcud olmasıdır. O, həmçinin bütün metodlar üçün kök ünvanını təyin etmək üçün nəzarətçi sinfinə tətbiq oluna bilər. Metod üçün allFilms()
parametr value
" " olaraq təyin edilib , ona görə də brauzerə http://host:port//
kombinasiyası daxil edildikdə dərhal çağırılacaq (yəni, standart olaraq http://localhost:8080/ və ya http- dir. ://127.0 .0.1:8080/ ). Parametr hansı növ sorğunun dəstəkləndiyini müəyyən edir (GET, POST, PUT və s.). Burada yalnız məlumat qəbul etdiyimiz üçün GET istifadə olunur. Daha sonra əlavə və redaktə üsulları görünəndə artıq POST sorğuları olacaq. (Yeri gəlmişkən, metodu göstərən annotasiya əvəzinə annotasiyalardan və s. ekvivalent olaraq istifadə edə bilərsiniz ) ) . Metodlarımızda biz obyekt yaradırıq və geri qaytarılmalı olan görünüşün adını təyin edirik. method
@RequestMapping
@GetMapping
@PostMapping
@GetMapping
@RequestMapping(method = RequestMethod.GET
ModelAndView
Konfiqurasiya
Konfiqurasiyanın qurulmasına keçək. Paketdəconfig
bir sinif yaradaq WebConfig
. O, tipli obyekti qaytaran yalnız bir metoda malik olacaq ViewResolver
, bu adla təmsili tapmaq üçün lazım olan interfeysdir.
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.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "testgroup.filmography")
public class WebConfig {
@Bean
ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/pages/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}
@Configuration
Spring-ə deyir ki, bu sinif konfiqurasiya sinfidir və bean
komponentlərin tərifləri və asılılıqlarını ehtiva edir. Fasulye Bahar tərəfindən idarə olunan obyektlərdir. Annotasiya lobya müəyyən etmək üçün istifadə olunur @Bean
. @EnableWebMvc
Spring MVC konfiqurasiyasını idxal etməyə imkan verir WebMvcConfigurationSupport
. Siz həmçinin, məsələn, WebMvcConfigurer
bir çox metodları olan bir interfeys tətbiq edə və hər şeyi öz zövqünüzə uyğunlaşdıra bilərsiniz, lakin buna hələ girmək lazım deyil, standart parametrlər kifayət edəcəkdir. @ComponentScan
Bahara idarə etməli olduğu komponentləri harada axtarmaq lazım olduğunu bildirir, yəni. annotasiya @Component
və ya onun törəmələri ilə işarələnmiş siniflər @Controller
, @Repository
, @Service
. Bu qeydlər avtomatik olaraq sinif paxlasını müəyyən edir. Metodda viewResolver()
biz onun həyata keçirilməsini yaradırıq və təqdimatların harada axtarılacağını müəyyənləşdiririk webapp
. Buna görə də, nəzarətçi metodunda " " adını təyin etdikdə films
görünüş " " olaraq tapılacaq. /pages/films.jsp
Deməli, konfiqurasiya sinifimiz var, lakin hələlik bu, sadəcə bir növ ayrıca sinifdir, tətbiqimizə heç bir şəkildə təsir göstərmir. . Bu konfiqurasiyanı Bahar kontekstində qeydiyyatdan keçirməliyik. Bunun üçün bir sinif lazımdır AbstractAnnotationConfigDispatcherServletInitializer
. Paketdə biz onun varisini, deyək ki, AppInitializerconfig
yaradırıq və onun üsullarını həyata keçiririk.
package testgroup.filmography.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
Sonuncu üsul ünvanları qeyd edir və konfiqurasiya siniflərinin qeydiyyatı üçün daha 2 üsul var. Veb konfiqurasiyaları, burada ViewResolver
's və buna bənzərlər müəyyən edilir getServletConfigClasses()
. Bütün bunlar haqqında sənədlərdə və müxtəlif təlimatlarda oxumaq daha yaxşıdır, amma bizim vəziyyətimizdə hələ bunu araşdırmaq lazım deyil, bizimkilər, WebConfig
prinsipcə, RootClasses
hər ikisində müəyyən edilə bilər, hətta hər ikisini birdən təyin edə bilərsiniz, yenə də işləyəcək . Daha bir şey. Formadan rus simvolları ilə dəyərlər göndərildikdə, nəticə cızıqlar olduqda kodlaşdırma ilə bağlı problemlər yarana bilər. Bu problemi həll etmək üçün sorğuları əvvəlcədən emal edəcək filtr əlavə edəcəyik. AppInitializer sinfinə gedirik və istədiyiniz kodlaşdırmanı göstərdiyimiz metodu ləğv edirik getServletFilters
, o, əlbəttə ki, səhifələrdə və verilənlər bazasında olduğu kimi hər yerdə olduğu kimi olmalıdır:
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[] {characterEncodingFilter};
}
Yaxşı, hər şey qurulmuş kimi görünür, onu işə salıb nə baş verdiyini görə bilərsiniz. Çalıştır -> Çalıştır -> Konfiqurasiyaları redaktə et -> Yeni Konfiqurasiya əlavə et -> Tomcat Server -> Yerli Sonra, yerləşdirmək üçün artefakt seçməlisiniz. İdeyanın özü bir ipucu verəcək Xəbərdarlıq: Yerləşdirmə üçün heç bir artefakt qeyd edilməyib . Düzəliş düyməsini basın və seçin ...: müharibə partladı . Və ya gedə bilərsiniz Yerləşdirmə -> əlavə et -> Artifakt -> ...: war exploded . Və siz həmçinin Yerləşdirməyə getmək və Applecation kontekst sahəsini (bu, tətbiqin brauzerdə mövcud olacağı url ünvanının bir hissəsi olacaq) " " olaraq təyin etməlisiniz. Sonra tətbiqimiz dərhal http://localhost:8080/ ünvanında mövcud olacaq (lakin siz orada bir şey də təyin edə bilərsiniz, məsələn, " " və sonra bunu bütün ünvanlara əlavə etməlisiniz, yəni məsələn, olmayacaq. " http://localhost:8080/edit" , lakin "http://localhost:8080/filmography/edit" olacaq ). Run düyməsini basın və başlayana qədər gözləyin. Aldığım budur: Hər şey yaxşı görünür, amma bir xəbərdarlıq var. Məsələ burasındadır ki, səhifələrimiz artıq ictimaiyyət üçün açıqdır və ünvan çubuğuna yolu yazmaqla birbaşa daxil olmaq olar. Biz http://localhost:8080/pages/films.jsp-ə daxil oluruq və indi səhifəmizi nəzarətçinin xəbəri olmadan almışıq. Nədənsə bu çox düzgün deyil, buna görə də xüsusi bir kataloq yaradacağıq . İçəridə olanlar ictimaiyyətdən gizlənəcək və yalnız nəzarətçi vasitəsilə əldə edilə bilər. Görünüşlərimizin olduğu kataloqu ( ) içərisinə yerləşdiririk və müvafiq olaraq onu prefiksə əlavə edirik: /
/filmography
webapp
WEB-INF
pages
WEB-INF
ViewResolver
viewResolver.setPrefix("/WEB-INF/pages/");
İndi biz səhifəmizi http://localhost:8080 ünvanında əldə edirik, lakin birbaşa http://localhost:8080/WEB-INF/pages/films.jsp- ə cəhd etsək, 404 xətası alırıq. Yaxşı, əladır, bizdə ən sadə veb tətbiqi, necə deyərlər, Salam Dünya. Layihənin strukturu hazırda belə görünür:
Model
Artıq baxışlarımız və nəzarətçimiz var, lakin MVC-də 3-cü hərf də var, ona görə də şəkli tamamlamaq üçün model də əlavə edəcəyik. Paketdə, məsələn, aşağıdakı sahələrləmodel
bir sinif yaradaq : , (başlıq), (buraxılış ili), (janr) və (yəni, bu filmə artıq baxmısınız və ya yox). Film
int id
String title
int year
String genre
boolean watched
package testgroup.filmography.model;
public class Film {
private int id;
private String title;
private int year;
private String genre;
private boolean watched;
// + Getters and setters
}
Xüsusi bir şey yoxdur, sadəcə adi bir sinif, özəl sahələr, alıcılar və təyinatçılar. Belə siniflərin obyektləri də adlanır POJO
(Plain Old Java Object), yaxşı, yəni. "sadə java obyekti". İndi belə bir obyekt yaratmağa və onu səhifədə göstərməyə çalışaq. Hələlik onu necə yaratmaq və işə salmaq barədə çox narahat olmayacağıq. Bunu sınamaq üçün gəlin onu birbaşa nəzarətçidə axmaqcasına yaradaq, məsələn:
public class FilmController {
private static Film film;
static {
film = new Film();
film.setTitle("Inception");
film.setYear(2010);
film.setGenre("sci-fi");
film.setWatched(true);
}
ModelAndView
Və metoddan istifadə edərək bu obyekti bizimkinə əlavə edin addObject
:
@RequestMapping(method = RequestMethod.GET)
public ModelAndView allFilms() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("films");
modelAndView.addObject("film", film);
return modelAndView;
}
İndi biz bu obyekti səhifəmizdə göstərə bilərik. Hello World əvəzinə films.jsp
biz yazacağıq ${film}
və atribut adına uyğun olan obyekt film
burada " " əvəz olunacaq. Gəlin onu işə salmağa çalışaq və nə baş verdiyini görək (obyektin aydın çıxışı üçün sinif Film
yenidən təyin olundu toString()
):
Model-View-Nəzarətçi
Bu mərhələdə artıq tam hüquqlu Spring MVC tətbiqimiz var. Davam etməzdən əvvəl hər şeyə bir daha nəzər salmaq və hər şeyin necə işlədiyini anlamaq yaxşı olardı. İnternetdə bununla bağlı çoxlu şəkil və diaqram tapa bilərsiniz, mən bunu bəyənirəm:Dispatcher Servlet
, sonra o, bu sorğudan istifadə edərək emal etmək üçün uyğun nəzarətçi tapır HandlerMapping
(bu, nəzarətçi seçmək üçün interfeysdir, mövcud nəzarətçilərdən hansının belə bir ünvanı qəbul edən metodu olduğunu yoxlayır) , uyğun metodu çağırır və Controller
görünüş haqqında məlumatı qaytarır, sonra dispetçer ViewResolver
'a-dan istifadə edərək istədiyi görünüşü tapır, bundan sonra model məlumatları bu görünüşə ötürülür və biz çıxış kimi səhifəmizi alırıq. Bu kimi bir şey. Davamı olacaq... Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqinin təqdimatı (1-ci hissə) Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqinin təqdimatı (2-ci hissə) Maven, Spring, MySQL, Hibernate və ilk CRUD tətbiqi (3-cü hissə) Maven, Spring, MySQL, Hibernate-ə giriş və ilk CRUD tətbiqi (4-cü hissə)
GO TO FULL VERSION