JavaRush /Kurslar /All lectures for UZ purposes /Spring Boot va Web MVC

Spring Boot va Web MVC

All lectures for UZ purposes
Daraja , Dars
Mavjud

Spring Boot veb-ilovalar ishlab chiqishda juda qulay. Siz Tomcat, Jetty, Undertow yoki Netty bilan mustaqil HTTP-server yaratishingiz mumkin. Ko'pgina veb-ilovalar spring-boot-starter-web modulidan foydalanib tezda ishlatadi. Shu bilan birga spring-boot-starter-webflux moduli yordamida reaktiv veb-ilovalar ham yaratishingiz mumkin.

Agar siz servletlar asosida veb-ilovalar yaratmoqchi bo'lsangiz, Spring Boot'ning Spring MVC yoki Jersey uchun auto-konfiguratsiya imkoniyatlaridan foydalanishingiz mumkin.

"Spring Web MVC" Freymvorki

Spring Web MVC freymvorki (ko'pincha "Spring MVC" deb ataladi) to'liq funksional "model-view-controller" veb-freymvorkidir. Spring MVC kiruvchi HTTP so'rovlarini boshqarish uchun @Controller yoki @RestController annotatsiyali maxsus beans yaratishga imkon beradi. Kontrollerdagi metodlar HTTP protokoli bilan @RequestMapping annotatsiyalar orqali moslanadi.

Quyidagi kodda JSON formatidagi ma'lumotlar bilan ishlovchi odatiy @RestController annotatsiyasi ko'rsatilgan:

Java
import java.util.List; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; // RestController @RequestMapping("/users") public class MyRestController { private final UserRepository userRepository; private final CustomerRepository customerRepository; public MyRestController(UserRepository userRepository, CustomerRepository customerRepository) { this.userRepository = userRepository; this.customerRepository = customerRepository; } @GetMapping("/{userId}") public User getUser(@PathVariable Long userId) { return this.userRepository.findById(userId).get(); } @GetMapping("/{userId}/customers") public List<Customer> getUserCustomers(@PathVariable Long userId) { return this.userRepository.findById(userId).map(this.customerRepository::findByUser).get(); } @DeleteMapping("/{userId}") public void deleteUser(@PathVariable Long userId) { this.userRepository.deleteById(userId); } } 
Kotlin
import org.springframework.web.bind.annotation.DeleteMapping import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController // RestController @RequestMapping("/users") class MyRestController(private val userRepository: UserRepository, private val customerRepository: CustomerRepository) { @GetMapping("/{userId}") fun getUser(@PathVariable userId: Long): User { return userRepository.findById(userId).get() } @GetMapping("/{userId}/customers") fun getUserCustomers(@PathVariable userId: Long): List<Customer> { return userRepository.findById(userId).map(customerRepository::findByUser).get() } @DeleteMapping("/{userId}") fun deleteUser(@PathVariable userId: Long) { userRepository.deleteById(userId) } } 

"WebMvc.fn" funksional varianti konfiguratsiyani so'rovlar bilan ishlashdan ajratadi, quyidagi misol kabi:

Java
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.web.servlet.function.RequestPredicate; import org.springframework.web.servlet.function.RouterFunction; import org.springframework.web.servlet.function.ServerResponse; import static org.springframework.web.servlet.function.RequestPredicates.accept; import static org.springframework.web.servlet.function.RouterFunctions.route; // Configuration proxyBeanMethods public class MyRoutingConfiguration { private static final RequestPredicate ACCEPT_JSON = accept(MediaType.APPLICATION_JSON); @Bean public RouterFunction<ServerResponse> routerFunction(MyUserHandler userHandler) { return route() .GET("/{user}", ACCEPT_JSON, userHandler::getUser) .GET("/{user}/customers", ACCEPT_JSON, userHandler::getUserCustomers) .DELETE("/{user}", ACCEPT_JSON, userHandler::deleteUser) .build(); } } 
Kotlin
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.http.MediaType import org.springframework.web.servlet.function.RequestPredicates.accept import org.springframework.web.servlet.function.RouterFunction import org.springframework.web.servlet.function.RouterFunctions import org.springframework.web.servlet.function.ServerResponse // Configuration proxyBeanMethods class MyRoutingConfiguration { @Bean fun routerFunction(userHandler: MyUserHandler): RouterFunction<ServerResponse> { return RouterFunctions.route() .GET("/{user}", ACCEPT_JSON, userHandler::getUser) .GET("/{user}/customers", ACCEPT_JSON, userHandler::getUserCustomers) .DELETE("/{user}", ACCEPT_JSON, userHandler::deleteUser) .build() } companion object { private val ACCEPT_JSON = accept(MediaType.APPLICATION_JSON) } } 
Java
import org.springframework.stereotype.Component; import org.springframework.web.servlet.function.ServerRequest; import org.springframework.web.servlet.function.ServerResponse; // @Component public class MyUserHandler { public ServerResponse getUser(ServerRequest request) { ... return ServerResponse.ok().build(); } public ServerResponse getUserCustomers(ServerRequest request) { ... return ServerResponse.ok().build(); } public ServerResponse deleteUser(ServerRequest request) { ... return ServerResponse.ok().build(); } } 
Kotlin
import org.springframework.stereotype.Component import org.springframework.web.servlet.function.ServerRequest import org.springframework.web.servlet.function.ServerResponse // @Component class MyUserHandler { fun getUser(request: ServerRequest?): ServerResponse { return ServerResponse.ok().build() } fun getUserCustomers(request: ServerRequest?): ServerResponse { return ServerResponse.ok().build() } fun deleteUser(request: ServerRequest?): ServerResponse { return ServerResponse.ok().build() } } 
Router aniqlashini modullashtirish uchun siz xohlagancha ko'p RouterFunction beans yaratishingiz mumkin. Agar ular navbati bilan ishlatilishi kerak bo'lsa, beanslarni tartiblash mumkin.

Spring MVC Auto-konfiguratsiyasi

Spring Boot, ko'pgina ilovalar uchun mukammal ishlaydigan, Spring MVC uchun auto-konfiguratsiyani ta'minlaydi.

Auto-konfiguratsiya Spring standartlariga qo'shimcha ravishda quyidagi funksiyalarni qo'shadi:

  • ContentNegotiatingViewResolver va BeanNameViewResolver beans qo'shish.

  • Statik resurslarni qo'llab-quvvatlash, WebJars'ni qo'llab-quvvatlashni o'z ichiga oladi.

  • Converter, GenericConverter va Formatter beans'larning avtomatik ro'yxatdan o'tishi.

  • HttpMessageConvertersni qo'llab-quvvatlash.

  • MessageCodesResolverni avtomatik ro'yxatdan o'tishi.

  • Statik index.htmlni qo'llab-quvvatlash.

  • ConfigurableWebBindingInitializer beans'ning avtomatik ishlatilishi.

Agar ushbu Spring Boot MVC sozlamalarini saqlab qolish va boshqa MVC sozlamalarini (interceptors, formatters, view controllers va boshqa funksiyalarni) qo'shmoqchi bo'lsangiz, @Configuration annotatsiyali o'zingizning WebMvcConfigurer turidagi sinfingizni qo'shishingiz mumkin, lekin resmi @EnableWebMvc annotatsiyasiz.

Agar RequestMappingHandlerMapping, RequestMappingHandlerAdapter yoki ExceptionHandlerExceptionResolverning maxsus nusxalarini berish kerak bo'lsa va Spring Boot MVC sozlamalarini saqlab qolmoqchi bo'lsangiz, WebMvcRegistrations turidagi beanni e'lon qilishingiz va ushbu komponentlarning maxsus nusxalarini taqdim etishingiz mumkin.

Agar Spring MVC ishini to'liq nazorat qilishni istasangiz, o'z @Configurationni @EnableWebMvc annotatsiyali qo'shishingiz yoki @Configuration annotatsiyali o'z DelegatingWebMvcConfiguration sinfingizni qo'shishingiz mumkin, bu @EnableWebMvc annotatsiyasining Javadoc'da ko'rsatilganidek.

Spring MVC ConversionService ning qiymatlarni application.properties yoki application.yaml faylingizdan o'zgartirish uchun foydalanadigan xizmatdan farqli. Bu shuni anglatadiki, Period, Duration va DataSize konvertorlari mavjud bo'lmaydi va @DurationUnit va @DataSizeUnit annotatsiyalari e'tiborga olinmaydi.

Agar Spring MVC tomonidan foydalaniladigan ConversionServiceni sozlamalarga moslashtirish kerak bo'lsa, WebMvcConfigurerni addFormatters usuli bilan taqdim etishingiz mumkin. Ushbu usuldan siz har qanday yoqtirilgan konvertorni ro'yxatdan o'tkazishingiz yoki ApplicationConversionService uchun mavjud bo'lgan statik metodlarga vakolat berishingiz mumkin.

HttpMessageConverters

Spring MVC HTTP so'rov va javoblarni o'zgartirish uchun HttpMessageConverter interfeysidan foydalanadi. Dastlabki sozlamalar "out of the box" yetarli. Masalan, ob'ektlar avtomatik ravishda JSON formatiga (Jackson kutubxonasi yordamida) yoki XMLga (Jackson XML kengaytmasi mavjud bo'lsa, aks holda JAXB yordamida) o'zgartirilishi mumkin. Dastlabki sozlamalar bo'yicha stringlar UTF-8 formatida kodlanadi.

Agar konvertorlarni qo'shmoqchi yoki sozlamoqchi bo'lsangiz, Spring Boot HttpMessageConverters sinfidan foydalanishingiz mumkin, quyidagi misolda ko'rsatilganidek:

Java
import org.springframework.boot.autoconfigure.http.HttpMessageConverters; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; // Configuration proxyBeanMethods public class MyHttpMessageConvertersConfiguration { @Bean public HttpMessageConverters customConverters() { HttpMessageConverter<?> additional = new AdditionalHttpMessageConverter(); HttpMessageConverter<?> another = new AnotherHttpMessageConverter(); return new HttpMessageConverters(additional, another); } } 
Kotlin
import org.springframework.boot.autoconfigure.http.HttpMessageConverters import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.http.converter.HttpMessageConverter // Configuration proxyBeanMethods class MyHttpMessageConvertersConfiguration { @Bean fun customConverters(): HttpMessageConverters { val additional: HttpMessageConverter<*> = AdditionalHttpMessageConverter() val another: HttpMessageConverter<*> = AnotherHttpMessageConverter() return HttpMessageConverters(additional, another) } } 

Ixtiyoriy HttpMessageConverter konteksda mavjud bo'lsa, u konvertorlar ro'yxatiga qo'shiladi. Shu tarzda siz dastlabki sozlamalarni o'zgartirishingiz ham mumkin.

MessageCodesResolver

Spring MVC xato xabarlarini yaratish uchun strategiyani taqdim etadi: MessageCodesResolver. Agar spring.mvc.message-codes-resolver-format xususiyati PREFIX_ERROR_CODE yoki POSTFIX_ERROR_CODE o'rnatilgan bo'lsa, Spring Boot uni siz uchun yaratadi.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION