Муқаддима
Тавре ки мо медонем, муваффақияти Java маҳз ба шарофати таҳаввулоти нармафзор, ки барои пайвастшавӣ ба шабака кӯшиш мекунад, ба даст омад. Аз ин рӯ, мо барномаи маъмулии консолии " Hello World " -ро ҳамчун асос мегирем ва мефаҳмем, ки он барои барномаи шабакавӣ аз як барномаи консолӣ чӣ лозим аст. Пас, аввал ба шумо лозим аст, ки лоиҳаи Java эҷод кунед. Барномасозон одамони танбал мебошанд. Дар замонҳои пеш аз таърих, вақте ки баъзеҳо мамонтҳоро шикор мекарданд, дигарон нишаста, кӯшиш мекарданд, ки дар тамоми китобхонаҳои Java ва сохторҳои директория ошуфта нашаванд. Барои он ки таҳиякунанда метавонад раванди эҷоди барномаро назорат кунад, то ки вай танҳо бинависад "Ман китобхонаи фалон versionи 2 мехоҳам" -ро офарид, онҳо асбобҳои махсус - сохтани системаҳоро пайдо карданд. Ду машҳуртарини онҳо Maven ва Gradle мебошанд . Барои ин мақола мо Gradle-ро истифода мебарем. Агар пештар ба мо лозим меомад, ки сохтори директорияро худамон созем, ҳоло Gradle бо истифода аз плагини Gradle Init ба мо имкон медиҳад, ки лоиҳаи Java бо сохтори директория ва синфи асосии Main дар як фармон эҷод кунем:gradle init --type java-application
Ин фармон оғозкуниро (init) барои ба мо як барномаи Java (java-application) бо консол Hello World. Пас аз анҷом, файл дар директория пайдо мешавад - build.gradle . Ин скрипти сохтани мост , яъне скрипти муайян барои сохтани барнома бо тавсифи он, ки барои ин кадом амалҳоро иҷро кардан лозим аст. Биёед онро кушоем ва ба он сатр илова кунем: jar.baseName = 'webproject'
Gradle ба шумо имкон медиҳад, ки дар лоиҳа амалҳои гуногунро иҷро кунед ва ин амалҳо вазифаҳо номида мешаванд . Бо иҷрои фармон (вазифа) файли JAR gradle build
дар директорияи /build/libs сохта мешавад . Ва, тавре ки шумо тахмин кардед, номи он ҳоло webproject.jar хоҳад буд . Аммо агар мо иҷро кунем java -jar ./build/libs/webproject.jar
, мо хато мегирем: no main manifest attribute
. Сабаб дар он аст, ки барои барномаи java шумо бояд манифестро замима кунед - ин тавсифи тарзи кор бо барнома, чӣ гуна қабул кардани он аст. Сипас JVM, ки замимаи java-ро иҷро мекунад, медонад, ки кадом синф нуқтаи вуруд ба барнома ва маълумоти дигар аст (масалан, classpath). Агар мо ба мундариҷаи скрипти сохтмон бодиққат назар кунем, мо мебинем, ки плагинҳо пайваст мешаванд. Масалан: apply plugin: 'java'
Агар мо ба саҳифаи Gradle Java Plugin равем , мо мебинем, ки манифестро танзим карда метавонем:
jar {
manifest {
attributes 'Main-Class': 'App'
}
}
Синфи асосӣ, нуқтаи вуруд ба барнома, барои мо аз ҷониби Gradle Init Plugin тавлид шудааст. Ва он ҳатто дар параметри mainClassName нишон дода шудааст. Аммо ин ба мо мувофиқ набуд, зеро... ин танзимот ба плагини дигар, Gradle Application Plugin дахл дорад . Ҳамин тавр, мо як барномаи Java дорем, ки Hello World-ро дар экран намоиш медиҳад. Ин барномаи Java дар JAR (Java ARchive) бастабандӣ шудааст. Он оддӣ, ба консол асос ёфтааст, на муосир. Чӣ тавр онро ба барномаи веб табдил додан мумкин аст?
API servlet
Барои он ки Java бо шабака кор карда тавонист, дар замонҳои қадим мушаххасоти Сервлет API пайдо шуда буд . Маҳз ҳамин мушаххасот ҳамкории муштарӣ ва server, гирифтани паём аз муштарӣ (масалан, браузер) ва ирсоли посухро (масалан, бо матни саҳифа) тавсиф мекунад. Табиист, ки аз он вақт инҷониб бисёр чиз тағйир ёфт, аммо гап дар он аст, ки барои як барномаи Java табдил додани барномаи веб, API Servlet истифода мешавад. Барои он ки беасос тахмин накунем, биёед ин мушаххасотро гирем: JSR-000340 JavaTM Servlet 3.1 . Пеш аз ҳама, мо ба " Боби 1: Шарҳ " таваҷҷӯҳ дорем . Он мафҳумҳои асосиеро, ки мо бояд фаҳмем, тавсиф мекунад. Аввалан, сервлет чист? Дар боби " 1.1 Сервлет чист? " мегӯяд, ки Сервлет ҷузъи Java мебошад, ки аз ҷониби контейнер идора карда мешавад ва мундариҷаи динамикӣ тавлид мекунад. Мисли дигар ҷузъҳои Java, сервлет як синфи Java мебошад, ки ба byte-code тартиб дода мешавад ва метавонад бо истифода аз технологияи Java ба serverи веб бор карда шавад. Муҳим аст, ки сервлетҳо бо муштарии веб (масалан, браузер) дар доираи парадигмаи дархост/ҷавоб, ки аз ҷониби Контейнери Сервлет амалӣ карда мешавад, ҳамкорӣ кунанд. Маълум мешавад, ки Сервлетҳо дар як намуди контейнери Сервлет зиндагӣ мекунанд. Ин чи аст? Дар боби " 1.2 Контейнери Сервлет чист? " гуфта мешавад, ки Контейнери Сервлет як қисми serverи веб ё serverи барномаест, ки хидматҳои шабакавиро пешкаш мекунад, ки тавассути он дархостҳо фиристода мешаванд ва посухҳо фиристода мешаванд. Ин контейнери Сервлет давраи зиндагии сервлетҳоро идора мекунад. Ҳама контейнерҳои Сервлет талаб карда мешаванд, ки ҳадди аққал протоколи HTTP-ро дастгирӣ кунанд, аммо метавонанд дигаронро дастгирӣ кунанд. Масалан, HTTPS. Инчунин муҳим аст, ки Контейнери Сервлет метавонад ҳама гуна маҳдудиятҳои марбут ба амниятро дар муҳите, ки дар он сервлетҳо иҷро мешаванд, ҷорӣ кунад. Инчунин муҳим аст, ки тибқи " 10.6 Архиви Архиви Веб " барномаи веб бояд дар файли WAR (Web Archive) бастабандӣ карда шавад. Яъне, ҳоло мо бояд кӯза ва плагинҳои барномаамонро барои чизи дигар хориҷ кунем. Ва ин плагини Gradle WAR аст . Ва ба ҷои jar.baseName war.baseName-ро нишон диҳед Зеро Азбаски мо дигар плагини jar-ро истифода намебарем, мо танзимоти манифестро низ хориҷ кардем. Вақте ки мо JAR-ро оғоз кардем, ба Java Virtual Machine (JVM) лозим буд, ки тавассути манифест чӣ гуна кор кардан бо замимаи мо гуфта шавад. Зеро JVM онро идора мекард. Барномаи веб, аз афташ, аз ҷониби як намуди веб-server иҷро карда мешавад. Маълум мешавад, ки ӯ бояд бо кадом роҳе ба ӯ бигӯяд, ки бо веб-барномаи мо чӣ гуна кор кардан лозим аст? Ва маълум мешавад, ки ҳа. Барномаҳои веб манифести махсуси худро доранд. Он Deployment Descriptor номида мешавад . Бахши том ба он бахшида шудааст: “ 14. Descriptor Deployment ”. Як бахши муҳим вуҷуд дорад: " Боби 10:". Дар бораи он сухан меравад, ки барномаи веб аз нуқтаи назари API Servlet чист. Масалан, дар боби " 10.5 Structure Directory " нишон дода шудааст, ки Дескриптори ҷойгиркунӣ дар куҷо бояд бошад:/WEB-INF/web.xml
. WEB-INF -ро дар куҷо ҷойгир кардан мумкин аст? Тавре ки дар плагини Gradle WAR гуфта шудааст, он макети навро илова мекунад : src/main/webapp
.Бинобар ин, биёед чунин директорияро созем, дар дохor мо директорияи WEB-INF ва дар дохor мо файли web.xml эҷод мекунем.Муҳим аст, ки директория WEB-INF номида мешавад, на META-INF! Биёед онро аз " 14.5.1 Намунаи асосӣ " Намунаи XML нусхабардорӣ кунем:
specification is available at http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd
, яъне мо бояд истиноди схемаро бо xsd-и муқарраршуда дар ҳама ҷо иваз кунем, фаромӯш накунем, ки онро version="2.5"
ба 3.1 тағир диҳем ва инчунин фазои номро дар ҳама ҷо иваз кунем ( xmlns ва дар xsi:schemaLocation). Онҳо нишон медиҳанд, ки мо дар кадом фазои ном кор хоҳем кард (ба таври содда гуем, кадом номҳои элементҳоро мо метавонем истифода барем). Агар шумо файли схемаро кушоед, targetNamespace ҳамон фазои номро дар бар мегирад, ки мо бояд муайян кунем:
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class App extends HttpServlet {
public String getGreeting() {
return "Hello world.";
}
public void doGet(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/html");
try {
response.getWriter().println(getGreeting());
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
}
Аммо лоихаи мо хануз тайёр нест. Азбаски мо ҳоло аз versionи Servlet API 3.1 вобастаем. Ин маънои онро дорад, ки дар скрипти сохтани мо мо бояд вобастагиро аз API Servlet нишон диҳем. JVM бояд донад, ки он чизе, ки шумо дар code навиштаед, дуруст аст ва чӣ тавр истифода бурдани он. Тавре ки мо дар хотир дорем, мушаххасот аслан танҳо интерфейсҳое мебошанд, ки чӣ гуна бояд кор кунанд. Ва татбиқҳо дар тарафи serverи веб ҷойгиранд. Аз ин рӯ, бе API Servlet дар Maven Central Китобхонаи заруриро пайдо хоҳад кард: javax.servlet-api . Ва вурудро ба блоки вобастагӣ илова кунед . Дар анбори Maven, тавре ки шумо дидед, гуфта мешавад, ки таъмин карда шудааст. Пеш аз истифодаи вобастагӣ, шумо бояд миқёсро муайян кунед. Gradle доираи бо номи "таъминшуда" надорад, аммо он доираи " танҳо компиляция " дорад. Аз ин рӯ, мо нишон медиҳем: providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
Уф, ҳама чиз хуб аст? Gradle Build лоиҳаи моро ба файли WAR месозад. Ва мо бояд минбаъд бо он чӣ кор кунем? Аввалан, ба мо serverи веб лозим аст. Дар Google мо “ веб-serverи java list ” менависем ва рӯйхати веб-serverҳоро мебинем. Биёед аз ин рӯйхат интихоб кунем, масалан, TomCat . Ба вебсайти Apache Tomcat равед , versionи охиринро (ҳоло versionи 9) ҳамчун бойгонии zip (агар барои Windows) зеркашӣ кунед. Онро дар ягон директория кушоед. Бале, мо serverи веб дорем. Аз феҳристи веб-server дар зеркаталоги бин , мо catalina-ро аз сатри фармон иҷро мекунем ва имконоти дастрасро мебинем. Биёед: catalina start
. Ҳар як веб-server директорияе дорад, ки веб-server онро назорат мекунад. Агар дар он ҷо файли замимаи веб пайдо шавад, serverи веб ба насби он шурӯъ мекунад. Ин насбкунӣ ҷойгиркунӣ ё ҷойгиркунӣ номида мешавад . Бале, барои ҳамин " дескриптори густариш ". Яъне, чӣ гуна барномаро дуруст ҷойгир кардан лозим аст. Дар Tomcat ин феҳрист webapps аст . Биёед ҷангеро, ки мо бо истифода аз сохтани gradle сохтаем, нусхабардорӣ кунем. Пас аз ин, дар гузориш мо чизеро мебинем: Deployment of web application archive [tomcat\webapps\webproject.war] has finished in [время] ms
Барои боз ҳам беҳтар фаҳмидан, дар директорияи tomcat мо файлро таҳрир карда \conf\tomcat-users.xml
, сатрҳои зеринро илова мекунем:
http://127.0.0.1:8080/manager
ин ҷо мо роҳҳои ҳама барномаҳоро мебинем. Веб-лоиҳаи мо ба эҳтимоли зиёд роҳ/webproject дода шудааст. Ин роҳ чист? Мушаххасоти дар боби " 10.1 Веб-барномаҳо дар дохor serverҳо " изҳор мекунад, ки барномаи веб бо ягон роҳ дар дохor барнома алоқаманд аст (дар ин ҳолат, /webproject). Ҳама дархостҳо тавассути ин роҳ бо ҳамон ServletContext алоқаманд карда мешаванд. Ин роҳ инчунин contextRoot номида мешавад . Ва тибқи " 10.2 Муносибат бо ServletContext ", контейнери сервлет бо барномаи веб ва ServletContext як ба як алоқаманд аст. Яъне, ҳар як веб-барнома ServletContext-и худро дорад. ServletContext чист ? Тавре ки дар мушаххасот гуфта мешавад, ServletContext an objectест, ки ба сервлетҳо "намоиши барномаеро ", ки дар он кор мекунанд, таъмин мекунад. Context Servlet муфассалтар дар боби 4 мушаххасоти Servlet API тавсиф шудааст. Тааҷҷубовар аст, ки API Servlet дар versionи 3.1 дигар мавҷудияти web.xml-ро талаб намекунад. Масалан, шумо метавонед бо истифода аз эзоҳҳо сервлетро муайян кунед:
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/app2")
public class App2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
response.getWriter().println("app2");
}
}
Инчунин дар мавзӯи: " Мусоҳибаи Java EE - JEE Servlet API (Саволҳо ва Ҷавобҳо) " тавсия дода мешавад. Ҳамин тавр, мо Сервлет дорем - он масъул аст, ки ба муштарии веб чӣ посух диҳад. Мо ServletContainer дорем, ки дархостҳоро аз корбар қабул мекунад, ба роҳе, ки бо роҳи сервлет дастрас шудааст, мувофиқат мекунад ва агар мувофиқат пайдо шавад, Сервлетро иҷро мекунад. Хуб. Баҳор дар ин тасвири ҷаҳон чӣ ҷойро ишғол мекунад ?
Spring Web MVC
Хуб, мо як барномаи веб дорем. Акнун мо бояд баҳорро пайваст кунем. Мо инро чӣ тавр карда метавонем? Аввалан, шумо бояд бифаҳмед, ки чӣ тавр ба таври дуруст пайваст кардани Spring ба лоиҳаи худ. Маълум мешавад, ки қаблан ин корро мувофиқи ҳуҷҷатҳои лоиҳаи платформаи баҳор анҷом додан мумкин буд , аммо ҳоло " Платформа 9 апрели соли 2019 ба анҷом мерасад ", яъне тавсия дода намешавад. истифода баред, зеро ба наздикй дигар дастгирй карда намешавад. Ягона роҳ ин аст " Истифодабарандагони платформа ташвиқ карда мешаванд, ки ба истифодаи идоракунии вобастагии Spring Boot шурӯъ кунанд ". Аз ин рӯ, биёед ба ҳуҷҷатгузории Spring Boot гузарем . Иҷозат диҳед фаҳмонам, ки мо худи Spring Boot-ро истифода намебарем, балки танҳо Идоракунии вобастагӣ аз Spring Boot. Яъне, лоиҳаи Spring Boot метавонад дар бораи кадом versionҳои китобхонаҳо (аз ҷумла Spring MVC) маълумот диҳад. Дар он ҷо мо 3.2-ро пайдо хоҳем кард. Истифодаи идоракунии вобастагии Spring Boot дар алоҳидагӣ . Тибқи ҳуҷҷатҳо, ба скрипти сохтмон инҳоро илова кунед:plugins {
id 'org.springframework.boot' version '2.0.4.RELEASE' apply false
}
apply plugin: 'io.spring.dependency-management'
Ва
dependencyManagement {
imports {
mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
}
}
Тавре ки шумо мебинед, мо нишон додем apply false
, яъне. Мо худи Spring Boot-ро истифода намебарем, аммо аз он ҷо идоракунии вобастагӣ истифода мебарем. Ин идоракунии вобастагӣ инчунин BOM - " Bill Of Materials " номида мешавад . Ҳоло мо омодаем, ки худи лоиҳаи Spring Web MVC-ро пайваст кунем. Spring Web MVC як қисми лоиҳаи Spring Framework аст ва мо ба бахши " Web Servlet " таваҷҷӯҳ дорем . Биёед вобастагиро ба скрипти сохтмон илова кунем: compile 'org.springframework:spring-webmvc'
. Тавре ки мо мебинем, мо фарогирии миқёсро муқаррар кардем, зеро serverи веб ба мо баҳор намедиҳад. Лоиҳаи мо маҷбур аст, ки китобхонаи баҳорро дар дохor худ дохил кунад. Минбаъд, барои мо муҳим аст, ки қисмати " 1.2. DispatcherServlet "-ро хонем, ки дар он гуфта мешавад, ки Spring MVC дар атрофи намунаи " Фронт контроллер " сохта шудааст , ки дар он як навъ сервлети марказӣ мавҷуд аст, ки конфигуратсия ва ваколатро ба ҷузъҳои дигар таъмин мекунад. . Диспетчерро метавон ҳамчун диспетчер тарҷума кард. Ҳамин тавр, пеш аз ҳама, дар web.xml мо эълон мекунем:
applicationContext.xml
, ки мо қаблан зикр кардем, эҷод кунед. Биёед аз ҳуҷҷатҳои баҳор мисол гирем: " 1.10.3. Ба таври худкор муайян кардани синфҳо ва бақайдгирии таърифҳои лӯбиё ".
-
Конфигуратсияи веб барои мисол конфигуратсияи услуби Java:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void configureViewResolvers(ViewResolverRegistry registry) { registry.jsp("/WEB-INF/pages/", ".jsp"); } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }
Ин мисол дар ҳуҷҷатҳои Spring Framework тавсиф шудааст: " 1.11. MVC Config ".
Дар ин ҷо мо ViewResolver-ро ба қайд мегирем, ки барои муайян кардани ҷойгиршавии саҳифаҳои jsp кӯмак мекунад. Усули дуюм кафолат медиҳад, ки " сервлети пешфарз " фаъол аст.
Шумо метавонед дар ин ҷо бештар дар бораи ин маълумот хонед: " Зарурат ва истифодаи default-servlet-handler чист ".
-
Назоратчии HelloController барои тавсифи харитасозии дархостҳо ба JSP мушаххас
@Controller public class HelloController { @GetMapping("/hello") public String handle(Model model) { return "hello"; } }
Дар ин ҷо мо шарҳи @Controller-ро истифода кардем, ки дар ҳуҷҷатҳо дар боби " 1.4. Контроллерҳои эзоҳшуда " тавсиф шудааст.
/webproject/hello
(дар он ҷо /webproject решаи контекст аст), аввал DispatcherServlet коркард карда мешавад. Вай ҳамчун диспетчери асосӣ муайян мекунад, ки мо /* ба дархости ҷорӣ мувофиқат мекунем, яъне DispatcherServlet бояд коре кунад. Он гоҳ он аз тамоми харитаҳои дарёфткардааш мегузарад. Он мебинад, ки HelloController бо усули дастаки мавҷуд аст, ки ба /hello харита шудааст ва онро иҷро мекунад. Ин усул матни "салом"-ро бармегардонад. Ин матн аз ҷониби ViewResolver қабул карда мешавад, ки он ба server мегӯяд, ки файлҳои jsp-ро, ки бояд ба муштарӣ намоиш дода шаванд, дар куҷо ҷустуҷӯ кунад. Ҳамин тариқ, муштарӣ дар ниҳоят ин саҳифаи хеле азизро мегирад.
GO TO FULL VERSION