Мазмұны:
- Кіріспе
- Жоба құру
- Көктемгі MVC қосылымы
- Беттерді және контроллерді жасау
- Конфигурация
- Үлгі
- Үлгі-көрініс-контроллер
Кіріспе
Мен өзім үшін жаңа технологиялармен және фреймворктермен танысуды олар қолданылған әртүрлі мысалдарды зерделеу арқылы бастадым, өйткені мен әдетте толыққанды қосымшаның мысалын қолдана отырып, оны әрекетте көргенде жақсырақ түсінемін. Әдетте, мұндай мысалдар CRUD қолданбалары болып табылады ( C reate, Read , U pdate, D elete), Интернет әртүрлі дәрежедегі күрделіліктің мысалдарына толы. Мәселе мынада, олар әдетте ол жерде қалай, не және не үшін жасалды, неге анау-мынау тәуелділік қосылды, анау-мынау класс не үшін қажет және т.б. егжей-тегжейлі түсіндірмейді. Көп жағдайда олар соңғы POM файлы бар, сабақтардың соңғы нұсқалары бар толығымен дайын қосымшаны алады және тәжірибелі адамға түсінікті болып көрінетін ұсақ-түйектерге назар аудармай, әрқайсысын жай ғана орындайды. Мен мұндай мысалдардың көбін қарадым және әдетте бәрі қалай жұмыс істейтіні түсінікті, бірақ олардың бұған қалай келгені толық түсініксіз. Сондықтан мен мұндай мысал тәжірибелі әзірлеуші емес, көктем, күту және басқа нәрселермен ешқашан айналыспаған бастаушы позициясынан пайдалы болады деп шештім.Жоба құру
Сондықтан, мен жаңадан келгендіктен, біз ешқандай түсініксіз архетиптерді қолданбаймыз. Көктемгі инициализатор әлі де қорқынышты естіледі. Сондықтан біз ең қарапайым қарапайым Maven жобасын жасаймыз. Менде домендік атау жоқ, сондықтан groupid-де жай ғана жазамынtestgroup
, ал артефактиде мен атын жазамын, мысалы, filmography
(бұл фильмдер тізімі болады). Біз жобаны жасаймыз және Enable auto-import
идея оны ұсынған кезде таңдаймыз. Осының арқасында біз POM файлына кез келген өзгертулер енгізген сайын (Project Object Model, бұл файл Maven жобасының бүкіл құрылымын сипаттайды), бәрі бірден жобаға автоматты түрде қолданылады. Кітапханалар жергілікті репозиторийден алынады, егер бізде олар бұрыннан бар болса немесе біз бұрын қарастырылмаған жаңа тәуелділіктерді пайдалансақ, Maven оларды орталық репозиторийден Интернет арқылы жүктеп алады. Maven сонымен қатар дереккөздер мен құжаттаманы жүктеп алу функциясына ие (Көздерді жүктеп алу және/немесе құжаттама). Бұл өте ыңғайлы, егер қандай да бір сыныпта немесе әдісте бірдеңе түсініксіз болса, бастапқы codeқа өтіп, оның ішінде қалай жұмыс істейтінін көруге болады. Бір-екі мәліметтерді қосайық. Бұл веб-қосымша болады және біз Tomcat пайдаланамыз . Қолданбаны Tomcat-қа орналастыру үшін оны соғыс мұрағаты түрінде жіберу керек (Web Application Resource, веб-қосымшаларға арналған арнайы пішім). Мұны істеу үшін POM файлына келесі жолды қосыңыз, осылайша қолданба соғыс мұрағатына жинақталады:
<packaging>war</packaging>
Сондай-ақ сізге веб-көздер үшін арнайы каталог қажет болады, біздің жағдайда jsp беттері және кейбір веб-ресурстар болады . main
Каталог құрайық webapp
. main
Оны дәл осылай атаған жөн және дәл солай орналасуы керек java
, resources
себебі бұл Maven каталогының стандартты құрылымы. Біз буманы орнатқаннан кейін war
және осылайша бұл веб-жоба екенін анықтағаннан кейін, каталог webapp
автоматты түрде веб-бағдарлама көздері ретінде белгіленеді (онда көк нүкте болады) және вебке қатысты барлық нәрсе осы қалтада ізделеді. Және бір сәт. Әдепкі бойынша, Maven 1.5 тіл нұсқасын пайдаланады, бірақ мен, мысалы, 1.8 нұсқасын - Java 8 нұсқасын қолданғым келеді (10 немесе 11 алуға болады, бірақ әлі де ол жерден ешқандай мүмкіндіктерді пайдалану жоспарлары жоқ, сондықтан ол 8 болсын. ). Мұны өте оңай шешуге болады, біз Google-да «Maven java 8» сияқты нәрсені жазамыз және Maven қажетті нұсқаға біздің сабақтарымызды құрастыру үшін POM файлына не қосу керектігін көреміз. Нәтижесінде бізде келесілер бар:
Көктемгі MVC қосылымы
Бір жерден бастау керек. Жоспарға сәйкес, біз дерекқорды қосып, Hibernate режимін қолданамыз, бірақ мұның бәрі әзірше тым қорқынышты болып көрінеді. Алдымен біз қарапайым нәрсе жасауымыз керек. Көктемгі MVC, бұл қазірдің өзінде жақсырақ, біз MVC үлгісімен ұзақ уақыт бойы таныспыз, ол курстың үлкен тапсырмаларының жартысында қолданылған. Осы жерден біз билей бастаймыз. Spring MVC көмегімен веб-қосымшаны жасау үшін бізге Servlet-API қажет, яғни. оның көмегімен сұрау-жауап әрекеті жүзеге асатын нәрсе. Мұны қосуға тырысайық. Біз Google-ге барамыз, Maven репозиторийінен қажетті тәуелділіктерді іздейміз және олардыpom.xml
. «Сыртқы кітапханалар» бөлімінде сіз тек spring-webmvc жүктелгенін ғана емес , сонымен қатар басқа да көптеген нәрселерді көре аласыз. Анау. көктемгі өзек , контекст , бұршақ және т.б. үшін тәуелділіктерді қосымша қосудың қажеті жоқ. бізге қажет нәрсенің бәрі spring-webmvc бірге тартылды .
Бізге шағын ескерту жасау керек. Әдетте, олар бұрыннан қосылғандармен жинақталған болса да, пайдаланылған әрбір кітапхана үшін тәуелділікті бөлек қосу ұсынылады, өйткені бұл кейбір мәселелер мен ақауларды болдырмауға көмектеседі. Қарапайым мысал. Кейбір API қолданатын тәуелділікті қостық делік және сонымен бірге ол осы API үшін іске асырудың қандай да бір түрін шығарады. Содан кейін біз бірдей API қолданатын тағы бір тәуелділікті қостық және бұл үшін оның кейбір іске асырылуын тартады, бірақ бұл жолы ол басқаша. Осылайша, бізде бір API-нің 2 түрлі іске асырылуы болады. Егер біз өзіміз осы API-нің кейбір әдістерін бір жерде қолданғымыз келсе, онда мәселе туындайды, өйткені жүйе қандай іске қосуды пайдалану керектігін білмейді, ол кездейсоқ таңдайды, мүмкін біз күткенді емес. Егер сіз іске асырудың біреуіне тәуелділікті нақты көрсетсеңіз, оған басымдық беріледі. Дегенмен, бұл қатаң ұсыныс емес, ол негізінен әртүрлі компаниялардың көптеген әртүрлі кітапханалары пайдаланылатын ірі жобаларға қатысты. POM файлын тым көп жүктемеу үшін біз мұны істемейміз; ешқандай проблемалар күтілмейді. Бірақ соған қарамастан, мұны әлі де есте ұстаған жөн. |
provided
Тәуелділік нені білдіреді javax.servlet-api
? Қолдану аясы – тәуелділік ауқымы, provided
бұл тәуелділік қолданбаны құрастыру және сынау сатысында қолжетімді болады, бірақ ол мұрағатталмайды. Қолданбаны орналастыру үшін біз Tomcat сервлет контейнерін қолданамыз және оның ішінде мұндай кітапханалар бар, сондықтан оларды сол жерге тасымалдаудың және мұрағатты қажетсіз жүктемемен жүктеудің қажеті жоқ. Болашаққа қарап, дәл сол себепті біз әдеттегі әдіссіз жасаймыз main
, өйткені ол Tomcat ішінде бұрыннан бар.
Беттерді және контроллерді жасау
Енді қарапайым нәрсе пісіріп көрейік. Алдымен, қосымша каталог жасайықwebapp
, мысалы pages
, онда біздің көріністер сақталады, яғни. jsp беттерін ашыңыз және бірнеше бет жасаңыз. Бізге болашақта фильмдер тізімі көрсетілетін бет қажет болады, мысалы films.jsp
, және мүмкін редакциялау үшін бөлек бет жасай аламыз editPage.jsp
. Біз оларды әзірше маңызды ештеңемен толтырмаймыз; тек сынақ үшін біз бір бетте екіншісіне сілтеме жасаймыз. Енді бізге сұраныстарды өңдейтін сынып қажет, яғни. контроллер. Жаңа бума қосып controller
, оған класс жасайық FilmController
(жалпы, барлығын әртүрлі бумаларға буып алудың қажеті жоқ, бұл қолданба өте шағын және қарапайым болады, бірақ қалыпты жобада көптеген контроллерлер, конфигурация кластары, модельдер болуы мүмкін. , және т. Бұл сыныпта сұрауларға жауап ретінде көзқарастарымызды қайтаратын әдістерді жасаймыз.
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;
}
}
Мұның мәні неде? Spring MVC деп аталатын нәрсе бар DispatcherServlet
. Бұл негізгі контроллер сияқты, барлық кіріс сұраулар ол арқылы өтеді, содан кейін ол оларды белгілі бір контроллерге береді. Аннотация жай ғана Spring MVC-ге бұл класс контроллер (жақсы, жалпы логикалық) екенін айтады, диспетчер сәйкес әдісті шақыру үшін @Controller
annotationларды тексереді . @RequestMapping
Аннотация @RequestMapping
контроллер әдістерінің мекенжайларын көрсетуге мүмкіндік береді, олардың көмегімен олар клиентте (шолғышта) қолжетімді болады. Ол сондай-ақ барлық әдістер үшін түбірлік мекенжайды орнату үшін контроллер класына қолданылуы мүмкін. Әдістің allFilms()
параметрі value
" " күйіне орнатылған , сондықтан ол http://host:port//
комбинациясы браузерге енгізілгенде дереу шақырылады (яғни, әдепкі бойынша ол http://localhost:8080/ немесе http болып табылады. ://127.0 .0.1:8080/ ). Параметр сұраудың қандай түріне қолдау көрсетілетінін көрсетеді (GET, POST, PUT, т.б.). Бұл жерде біз тек деректерді қабылдайтындықтан, GET қолданылады. Кейінірек қосу және өңдеу әдістері пайда болғанда, POST сұраулары әлдеқашан болады. (Айтпақшы, әдісті көрсететін annotationның орнына annotationларды және т.б. баламалы түрде қолдануға болады ) ) . Біздің әдістерімізде біз an object жасаймыз және қайтарылуы қажет көріністің атын орнатамыз. method
@RequestMapping
@GetMapping
@PostMapping
@GetMapping
@RequestMapping(method = RequestMethod.GET
ModelAndView
Конфигурация
Конфигурацияны орнатуға көшейік. Пакеттеconfig
класс жасайық WebConfig
. Онда түрдегі нысанды қайтаратын бір ғана әдіс болады ViewResolver
, бұл атау бойынша ұсынуды табу үшін қажетті интерфейс.
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 бұл класс конфигурация класы және bean
құрамдастардың анықтамалары мен тәуелділіктерін қамтитынын айтады. Бұршақтар көктем басқаратын нысандар болып табылады. Аннотация бұршақты анықтау үшін пайдаланылады @Bean
. @EnableWebMvc
ішінен Spring MVC конфигурациясын импорттауға мүмкіндік береді WebMvcConfigurationSupport
. Сіз сондай-ақ, мысалы, WebMvcConfigurer
көптеген әдістер жиынтығы бар интерфейсті іске асыра аласыз және барлығын өз қалауыңыз бойынша теңшей аласыз, бірақ біз оған әлі кірудің қажеті жоқ, стандартты параметрлер жеткілікті. @ComponentScan
Spring-ге ол басқаруы керек компоненттерді қайдан іздеу керектігін айтады, яғни. annotationмен белгіленген сыныптар немесе , , @Component
сияқты туындылары . Бұл annotationлар класс бұршағын автоматты түрде анықтайды. Әдісте біз оның орындалуын жасаймыз және ішінде өкілдіктерді қай жерден іздеу керектігін анықтаймыз . Сондықтан, контроллер әдісінде біз " " атауын орнатқан кезде көрініс " " ретінде табылады . Сонымен, бізде конфигурация сыныбы бар, бірақ әзірге бұл жеке класстың бір түрі, ол біздің қолданбамызға ешқандай әсер етпейді. . Бұл конфигурацияны Spring контекстінде тіркеуіміз керек. Ол үшін сізге сынып қажет . Бумада біз оның мұрагерін жасаймыз, айталық AppInitializer , және оның әдістерін жүзеге асырамыз. @Controller
@Repository
@Service
viewResolver()
webapp
films
/pages/films.jsp
AbstractAnnotationConfigDispatcherServletInitializer
config
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[]{"/"};
}
}
Соңғы әдіс мекенжайларды тіркейді және конфигурация кластарын тіркеудің тағы 2 әдісі бар. Веб конфигурациялары, онда ViewResolver
's және т.б. анықталған жерде орналасады getServletConfigClasses()
. Мұның бәрі туралы құжаттамада және әртүрлі нұсқаулықтарда оқыған дұрыс, бірақ біздің жағдайда бұл туралы әлі де тереңдеудің қажеті жоқ, біздікі, WebConfig
негізінен, RootClasses
екеуінде де анықталуы мүмкін, тіпті екеуін де бірден анықтауға болады, ол әлі де жұмыс істейді . Тағы бір нәрсе. Пішіннен орыс таңбалары бар мәндерді жіберген кезде, нәтиже сызбалар болған кезде codeтауда қиындықтар туындауы мүмкін. Бұл мәселені шешу үшін сұрауларды алдын ала өңдейтін сүзгіні қосамыз. Біз AppInitializer сыныбына өтіп , әдісті қайта анықтаймыз getServletFilters
, онда біз қажетті codeтауды көрсетеміз, ол, әрине, беттердегі және дерекқордағы сияқты барлық жерде бірдей болуы керек:
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[] {characterEncodingFilter};
}
Барлығы орнатылған сияқты, сіз оны іске қосып көріңіз және не болатынын көре аласыз. Іске қосу -> Іске қосу -> Конфигурацияларды өңдеу -> Жаңа конфигурация қосу -> Tomcat serverі -> Жергілікті Келесіде орналастыру үшін артефакт таңдау керек. Идеяның өзі кеңес береді Ескерту: орналастыру үшін ешқандай артефактілер белгіленбеген . Түзету түймесін басып , ... таңдаңыз : соғыс жарылды . Немесе Орналастыру -> қосу -> Артефакт -> ... тармағына өтуге болады : соғыс жарылды . Сондай-ақ «Орналастыру» бөліміне өтіп, Applecation контекстік өрісін (бұл қолданба браузерде қолжетімді болатын url мекенжайының бөлігі болады) « » күйіне орнатуыңыз керек . Содан кейін біздің қосымшамыз http://localhost:8080/ мекенжайында дереу қолжетімді болады (бірақ сіз сол жерде бірдеңені көрсете аласыз, мысалы, " ", содан кейін оны барлық мекенжайларға қосу керек, яғни, мысалы, ол жерде болмайды. " http://localhost:8080/edit" , бірақ ол "http://localhost:8080/filmography/edit" болады ). «Іске қосу» түймесін басып , ол басталғанша күтіңіз. Мен мынаны алдым: бәрі жақсы сияқты, бірақ бір ескерту бар. Өйткені, біздің парақшаларымыз енді жалпыға қолжетімді және мекенжай жолағында жолды жазу арқылы тікелей қол жеткізуге болады. Біз http://localhost:8080/pages/films.jsp сайтына кіреміз , енді біз өз бетімізді контроллердің білмеуінсіз алдық. Бұл өте дұрыс емес, сондықтан біз арнайы каталог жасаймыз . Ішіндегі нәрсе жұртшылықтан жасырылады және оған тек контроллер арқылы қол жеткізуге болады. Біз өз көріністері бар каталогты ( ) ішіне орналастырамыз және сәйкесінше оны префикске қосамыз: /
/filmography
webapp
WEB-INF
pages
WEB-INF
ViewResolver
viewResolver.setPrefix("/WEB-INF/pages/");
Енді біз өз бетімізді http://localhost:8080 мекенжайында аламыз , бірақ тікелей http://localhost:8080/WEB-INF/pages/films.jsp арқылы әрекет етсек, 404 қатесін аламыз. Жақсы, тамаша, бізде Ең қарапайым веб-қосымша, олар айтқандай, Hello World. Қазіргі уақытта жоба құрылымы келесідей көрінеді:
Үлгі
Бізде қазірдің өзінде көріністер мен контроллер бар, бірақ MVC-де 3-ші әріп бар, сондықтан суретті аяқтау үшін біз үлгі қосамыз. Пакеттеmodel
сыныпты жасайық 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
}
Ерекше ештеңе жоқ, қарапайым сынып, жеке өрістер, алушылар мен орнатушылар. Мұндай класстардың an objectілері POJO
(Plain Old Java Object) деп те аталады, жақсы, яғни. «қарапайым java нысаны». Енді осындай нысанды жасап, оны бетте көрсетуге тырысайық. Әзірге біз оны қалай жасау және инициализациялау туралы көп алаңдамаймыз. Оны сынап көру үшін оны тікелей контроллерде жасайық, мысалы, келесідей:
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
Осы әдісті пайдаланып, бұл нысанды бізге қосыңыз addObject
:
@RequestMapping(method = RequestMethod.GET)
public ModelAndView allFilms() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("films");
modelAndView.addObject("film", film);
return modelAndView;
}
Енді біз бұл нысанды өз бетімізде көрсете аламыз. «Hello World» орнына films.jsp
біз жазамыз ${film}
және « » атрибут атауына сәйкес нысан film
осы жерде ауыстырылады. Оны іске қосып, не болғанын көрейік (нысанның анық шығуы үшін сынып Film
қайта анықталды toString()
):
Үлгі-көрініс-контроллер
Осы кезеңде бізде толыққанды Spring MVC қосымшасы бар сияқты. Әрі қарай қозғалмас бұрын, бәрін қайта қарап, оның қалай жұмыс істейтінін анықтаған дұрыс. Интернетте сіз бұл туралы көптеген суреттер мен диаграммаларды таба аласыз, маған бұл ұнайды:Dispatcher Servlet
, содан кейін ол осы сұрауды пайдалану арқылы өңдеу үшін қолайлы контроллерді табады HandlerMapping
(бұл контроллерді таңдауға арналған интерфейс, қол жетімді контроллердің қайсысында мұндай мекенжайды қабылдайтын әдіс бар екенін тексереді) , қолайлы әдісті шақырады және Controller
көрініс туралы ақпаратты қайтарады, содан кейін диспетчер ViewResolver
'a арқылы аты бойынша қалаған көріністі табады, содан кейін үлгі деректері осы көрініске тасымалданады және біз бетті шығыс ретінде аламыз. Солай. Жалғасы бар... Maven, Spring, MySQL, Hibernate және бірінші CRUD қолданбасымен таныстыру (1-бөлім) Maven, Spring, MySQL, Hibernate және бірінші CRUD қолданбасымен таныстыру (2-бөлім) Maven, Spring, MySQL, Hibernate және бірінші CRUD қолданбасы (3-бөлім) Maven, Spring, MySQL, Hibernate және бірінші CRUD қолданбасына кіріспе (4-бөлім)
GO TO FULL VERSION