JavaRush /Kurslar /All lectures for UZ purposes /Spring MVC konfiguratsiyasi

Spring MVC konfiguratsiyasi

All lectures for UZ purposes
Daraja, Dars
Mavjud

Java'da MVC konfiguratsiyasi va XML'dagi MVC nom maydoni ko'pchilik ilovalarga mos keladigan standart konfiguratsiyani va uni sozlash uchun konfiguratsiya API'ni taqdim etadi.

Java MVC konfiguratsiyasi va MVC nom maydoni tomonidan yaratilgan asosiy bean'larni tushunishingiz shart emas.

MVC konfiguratsiyasi faollashtirilishi

Java-konfiguratsiyada @EnableWebMvc anotatsiyasidan foydalanib, MVC konfiguratsiyasini faollashtirishingiz mumkin, quyidagi misolda ko'rsatilgani kabi:

Java
@Configuration
@EnableWebMvc
public class WebConfig {
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig

XML-konfiguratsiyada <mvc:annotation-driven> elementidan foydalanib, MVC konfiguratsiyasini faollashtirishingiz mumkin, quyidagi misolda ko'rsatilgani kabi:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <mvc:annotation-driven/>
</beans>

Quyidagi misolda Spring MVC komponentlari va sinf yo'lida mavjud bo'lgan bog'liqliklarga (masalan, JSON, XML va boshqalarga ma'lumot konvertorlari) mos ravishda ro'yxatdan o'tkaziladi.

MVC konfiguratsiya API

Java-konfiguratsiyada, WebMvcConfigurer interfeysini amalga oshirish orqali, quyidagi misolda ko'rsatilgani kabi:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    // Konfiguratsiya metodlarni amalga oshiramiz...
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    // Konfiguratsiya metodlarni amalga oshiramiz...
}

XML'da <mvc:annotation-driven/> elementining atributlari va subelementlarini tekshirishingiz mumkin. Spring MVC XML-sxemasini ko'ring yoki kod avtomatik to'ldirish funktsiyasidan foydalaning, sizning IDE'da qanday atributlar va subelementlar mavjudligini bilish uchun.

Tiplarni konversiya qilish

Standart ravishda, turli sonlar va sanalarning formatlash vositalari o'rnatilgan bo'lib, ular @NumberFormat va @DateTimeFormat orqali mos sozlamalarni qo'llab-quvvatlaydi.

Java-konfiguratsiyada maxsus formatlash vositalari va konvertorlarni ro'yxatga olish uchun quyidagi usuldan foydalaning:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        // ...
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    override fun addFormatters(registry: FormatterRegistry) {
        // ...
    }
}

XML-konfiguratsiyada buni quyidagi usulda bajaring:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <mvc:annotation-driven conversion-service="conversionService"/>
    <bean id="conversionService"
            class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="org.example.MyConverter"/>
            </set>
        </property>
        <property name="formatters">
            <set>
                <bean class="org.example.MyFormatter"/>
                <bean class="org.example.MyAnnotationFormatterFactory"/>
            </set>
        </property>
        <property name="formatterRegistrars">
            <set>
                <bean class="org.example.MyFormatterRegistrar"/>
            </set>
        </property>
    </bean>
</beans>

Spring MVC dastlabki qiymatlarni tahlil qilish va formatlashda so'rovning regional sozlamalarini inobatga oladi. Bu, masalan, sanalar ko'rinishida stringlar bilan "input" shaklidagi formalar uchun to'g'ri keladi. Biroq, brauzerlar "date" va "time" shaklidagi maydonlar uchun HTML xususiyatiga muvofiq belgilanadigan qat'iy formatdan foydalanadi. Ushbu holatlar uchun sanani va vaqtni formatlash quyidagicha sozlanishi mumkin:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
        registrar.setUseIsoFormat(true);
        registrar.registerFormatters(registry);
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    override fun addFormatters(registry: FormatterRegistry) {
        val registrar = DateTimeFormatterRegistrar()
        registrar.setUseIsoFormat(true)
        registrar.registerFormatters(registry)
    }
}

Validatsiya

Agar classpath'da Bean Validation (masalan, Hibernate Validator) mavjud bo'lsa, LocalValidatorFactoryBean global validator sifatida ro'yxatdan o'tadi va u @Valid anotatsiyasi va metod argumentlari uchun Validated xususiyatlarini ishlatishda foydalanilishi mumkin.

Java-konfiguratsiyasida global Validator ni quyidagi uslubda sozlashingiz mumkin:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public Validator getValidator() {
        // ...
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    override fun getValidator(): Validator {
        // ...
    }
}

Quyidagi misolda XML bilan bunday konfiguratsiyani qanday olish mumkinligi ko'rsatilgan:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <mvc:annotation-driven validator="globalValidator"/>
</beans>

Shuni ta'kidlashingiz kerakki, Validator implementatsiyalarini lokal ro'yxatga olish ham mumkin, quyidagi misolda ko'rsatilgani kabi:

Java
@Controller
public class MyController {
    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.addValidators(new FooValidator());
    }
}
Kotlin
@Controller
class MyController {
    @InitBinder
    protected fun initBinder(binder: WebDataBinder) {
        binder.addValidators(FooValidator())
    }
}
Agar kerak bo'lsa, LocalValidatorFactoryBean ni biron bir joyda qo'shish kerak bo'lsa, bean yaratib, uni @Primary anotatsiyasi bilan belgilash, MVC konfiguratsiyasida e'lon qilingan bilan ziddiyatdan qochishga yordam beradi.

Interceptor'lar

Java-konfiguratsiyada kiruvchi so'rovlarga qo'llash uchun interceptor'larni ro'yxatdan o'tkazishingiz mumkin, quyidagi misolda ko'rsatilgani kabi:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleChangeInterceptor());
        registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    override fun addInterceptors(registry: InterceptorRegistry) {
        registry.addInterceptor(LocaleChangeInterceptor())
        registry.addInterceptor(ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**")
    }
}

Quyidagi misolda XML bilan bunday konfiguratsiyani qanday olish mumkinligi ko'rsatilgan:

<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/admin/**"/>
        <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>
Moslashtirilgan interceptor'lar yo'llarni moslashtirish uchun to'liq xavfsizlik darajasi sifatida ishlatishga mos emas, chunki bu URL-yo'llarda ko'plab nomaqbul belgilarni bloklashga qodir xavfsizlik devori mavjud. Biz odatda Spring Security'dan foydalanishni tavsiya qilamiz, bu Spring MVC uchun maxsus MvcRequestMatcher ni o'z ichiga oladi.

Kontent turlari

Spring MVC, so'rovdan (masalan, Accept header, URL yo'lni kengaytmasi, request parametri va boshqalar) muhit turini aniqlash uslubini sozlashingiz mumkin.

Odatiy bo'lib, faqat Accept header tekshiriladi.

Agar URL asosida kontent turini aniqlash kerak bo'lsa, yo'lni kengaytmasi o'rniga so'rov parametrlarini ishlatishni ko'rib chiqishingiz mumkin.

Java-konfiguratsiyada so'ralgan kontent turini aniqlashni sozlashingiz mumkin, quyidagi misolda ko'rsatilgani kabi:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.mediaType("json", MediaType.APPLICATION_JSON);
        configurer.mediaType("xml", MediaType.APPLICATION_XML);
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    override fun configureContentNegotiation(configurer: ContentNegotiationConfigurer) {
        configurer.mediaType("json", MediaType.APPLICATION_JSON)
        configurer.mediaType("xml", MediaType.APPLICATION_XML)
    }
}

Quyidagi misolda XML bilan bunday konfiguratsiyani qanday olish mumkinligi ko'rsatilgan:

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="mediaTypes">
        <value>
            json=application/json
            xml=application/xml
        </value>
    </property>
</bean>

Xabar konvertorlari

Java-konfiguratsiyada HttpMessageConverter'ni sozlashingiz mumkin, quyidagi usulni overrayd qilib (Spring MVC tomonidan yaratilgan oddiy konvertorlar o'rniga)

Quyidagi misolda XML va Jackson JSON konvertorlari standart emas, balki maxsus sozlangan ObjectMapper bilan qo'shilgan:

Java
@Configuration
@EnableWebMvc
public class WebConfiguration implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
                .indentOutput(true)
                .dateFormat(new SimpleDateFormat("yyyy-MM-dd"))
                .modulesToInstall(new ParameterNamesModule());
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
        converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()));
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfiguration : WebMvcConfigurer {
    override fun configureMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
        val builder = Jackson2ObjectMapperBuilder()
                .indentOutput(true)
                .dateFormat(SimpleDateFormat("yyyy-MM-dd"))
                .modulesToInstall(ParameterNamesModule())
        converters.add(MappingJackson2HttpMessageConverter(builder.build()))
        converters.add(MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()))

Yuqoridagi misolda Jackson2ObjectMapperBuilder JSP uchun View sifatida ishlatiladigan MappingJackson2HttpMessageConverter va MappingJackson2XmlHttpMessageConverter uchun umumiy konfiguratsiyani yaratish uchun ishlatilgan bo'lib, indentatsiya yoqilgan, sana formati sozlangan va moduli ro'yxatdan o'tgan.

Ushbu quruvchi Jackson xususiyatlarini quyidagicha sozlaydi:

U shuningdek, quyidagi ma'lum modullarni sinf yo'lida topilgan taqdirda avtomatik ravishda ro'yxatdan o'tkazadi:

Jackson XML qo'llab-quvvatlovi bilan qo'llab-quvvatlanadigan indentatsiyani yoqish uchun woodstox-core-asl dan qo'shimcha ravishda jackson-dataformat-xml kerak.

Yana bir nechta qiziqarli Jackson modullari mavjud:

Quyidagi misolda XML bilan bunday konfiguratsiyani qanday olish mumkinligi ko'rsatilgan:

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="objectMapper"/>
        </bean>
        <bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter">
            <property name="objectMapper" ref="xmlMapper"/>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
<bean id="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
      p:indentOutput="true"
      p:simpleDateFormat="yyyy-MM-dd"
      p:modulesToInstall="com.fasterxml.jackson.module.paramnames.ParameterNamesModule"/>
<bean id="xmlMapper" parent="objectMapper" p:createXmlMapper="true"/>

Ko'rinishni boshqarish

Bu ParameterizableViewController ni belgilash uchun qisqacha tavsiya. Chaqqiruda darhol ko'rinishga o'tadi. Statik holatlarda foydalanishingiz mumkin, Java-kontroller mantiqi bajarilgunga qadar ko'rinish javobni yaratadi.

Java-konfiguratsiyasidagi quyidagi misolda / dagi so'rov home nomli ko'rinishga kiradi:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("home");
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    override fun addViewControllers(registry: ViewControllerRegistry) {
        registry.addViewController("/").setViewName("home")
    }
}

Quyidagi misolda, oldingi misolda ko'rsatilgan narsani XML yordamida olish mumkin, <mvc:view-controller> elementidan foydalanib:

<mvc:view-controller path="/" view-name="home"/>

Agar @RequestMapping annotatsiyasi qaysidir bir URL manzilga mos kelgan bo'lsa, har qanday HTTP usuli uchun ko'rinishni boshqaruvchi sifatida ishlatilishi mumkin emas. Bu URL-manzil bilan annotatsiyalangan kontroller bilan moslik etarli darajada bo'lganligi sababli, bu oxirgi nuqta ekanligini bildiradi, shuning uchun mijozga 405 (METHOD_NOT_ALLOWED), 415 (UNSUPPORTED_MEDIA_TYPE) yoki boshqa shunga o'xshash javoblar yuborilishi mumkin, bu esa oʻzgarishlarni tekshirish uchun. Shuning uchun, URL manzili bilan ishlashni annotatsiyalangan nazoratchi va ko'rinish nazoratchisi sifatida bo'lishdan saqlanish tavsiya etiladi.

Ko'rinishni aniqlash

MVC konfiguratsiyasi ko'rinish aniqlovchilarini ro'yxatdan o'tkazishni osonlashtiradi.

Java-konfiguratsiyasidagi quyidagi misolda JSP va Jackson uchun View sifatida ko'rinishni kontent kelishuvini sozlash ko'rsatilgan:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.enableContentNegotiation(new MappingJackson2JsonView());
        registry.jsp();
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    override fun configureViewResolvers(registry: ViewResolverRegistry) {
        registry.enableContentNegotiation(MappingJackson2JsonView())
        registry.jsp()
    }
}

Quyidagi misolda XML bilan bunday konfiguratsiyani qanday olish mumkinligi ko'rsatilgan:

<mvc:view-resolvers>
    <mvc:content-negotiation>
        <mvc:default-views>
            <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
        </mvc:default-views>
    </mvc:content-negotiation>
    <mvc:jsp/>
</mvc:view-resolvers>

Biroq, FreeMarker, Tiles, Groovy Markup va boshqa script shablonlari ham ko'rinish texnologiyasiga mos kelishini talab qiladi.

MVC nom maydoni maxsus elementlarni taqdim etadi. Quyidagi misol FreeMarker bilan ishlaydi:

<mvc:view-resolvers>
    <mvc:content-negotiation>
        <mvc:default-views>
            <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
        </mvc:default-views>
    </mvc:content-negotiation>
    <mvc:freemarker cache="false"/>
</mvc:view-resolvers>
<mvc:freemarker-configurer>
    <mvc:template-loader-path location="/freemarker"/>
</mvc:freemarker-configurer>

Java-konfiguratsiyada mos Configurer bean'ini qo'shishingiz mumkin, quyidagi misolda ko'rsatilgani kabi:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.enableContentNegotiation(new MappingJackson2JsonView());
        registry.freeMarker().cache(false);
    }
    @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer() {
        FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
        configurer.setTemplateLoaderPath("/freemarker");
        return configurer;
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    override fun configureViewResolvers(registry: ViewResolverRegistry) {
        registry.enableContentNegotiation(MappingJackson2JsonView())
        registry.freeMarker().cache(false)
    }
    @Bean
    fun freeMarkerConfigurer() = FreeMarkerConfigurer().apply {
        setTemplateLoaderPath("/freemarker")
    }
}

Statik resurslar

Ushbu imkoniyat Resource asosida joylashuvlar ro'yxatidan statik resurslarni boshqarish uchun qulay usulni taqdim etadi.

Quyidagi misolda, agar so'rov /resources bilan boshlangan bo'lsa, nisbiy yo'l web ilovasining ildizi /public ga yoki /static ga classpath ichidan statik resurslarni qidirish va boshqarish uchun ishlatiladi. Resurslar bir yilga amal qilish muddati bilan taqdim etiladi, bu brauzer keshini maksimal darajada ishlatish va brauzer tomonidan qilingan HTTP so'rovlarini kamaytirish uchun. Last-Modified ma'lumotlari Resource#lastModified dan olinadi, bu esa shartli HTTP so'rovlarini "Last-Modified" headerlari bilan ta'minlaydi.

Quyidagi ro'yxatda Java-konfiguratsiyasi bilan buni qanday qilish kerakligi ko'rsatilgan:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/public", "classpath:/static/")
                .setCacheControl(CacheControl.maxAge(Duration.ofDays(365)));
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/public", "classpath:/static/")
                .setCacheControl(CacheControl.maxAge(Duration.ofDays(365)))
    }
}

Quyidagi misolda XML bilan bunday konfiguratsiyani qanday olish mumkinligi ko'rsatilgan:

<mvc:resources mapping="/resources/**"
    location="/public, classpath:/static/"
    cache-period="31556926" />

Resurslarni boshqaruvchi ushbu resurslar optimallashtirish uchun ResourceResolver va ResourceTransformer ga mos keluvchi toolkitchani yaratish uchun zanjirli implementatsiyalar qo'llab-quvvatlanadi.

VersionResourceResolver ni resursli URL-larni, masalan, kontentdan hisoblangan MD5 hash asosida ko'rsatiladigan yoki o'zgarmaydigan dastur versiyasi asosida ishlatishingiz mumkin. ContentVersionStrategy (MD5 hash) bir necha oz xos istisnolarga qaraganda yaxshi tanlovdir, masalan, moduli yuklash vositasi bilan ishlatiladigan JavaScript resurslari.

Quyidagi misolda, VersionResourceResolver ni Java-konfiguratsiyada qanday ishlatish kerakligi ko'rsatilgan:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/public/")
                .resourceChain(true)
                .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/public/")
                .resourceChain(true)
                .addResolver(VersionResourceResolver().addContentVersionStrategy("/**"))
    }
}

Quyidagi misolda XML bilan bunday konfiguratsiyani qanday olish mumkinligi ko'rsatilgan:

<mvc:resources mapping="/resources/**" location="/public/">
    <mvc:resource-chain resource-cache="true">
        <mvc:resolvers>
            <mvc:version-resolver>
                <mvc:content-version-strategy patterns="/**"/>
            </mvc:version-resolver>
        </mvc:resolvers>
    </mvc:resource-chain>
</mvc:resources>

Keyinchalik ResourceUrlProvider ni URL manzillarini qayta yozish va to'liqligicha aniqlash va transformatorlar zanjirini qo'llash uchun foydalanishingiz mumkin. MVC konfiguratsiyasi ResourceUrlProvider bean'ini taqdim etadi, uni boshqa bean'larda qo'llash mumkin. Shuningdek, ResourceUrlEncodingFilter ni Thymeleaf, JSP, FreeMarker va boshqalarga shaffof qo'llashni mumkin qiladi, ularda URL teglar HttpServletResponse#encodeURL ga tayanadi.

Shuni esda tutingki, EncodedResourceResolver (masalan, gzip, brotli yoki boshqa siqilgan resurslarni boshqarish uchun) va VersionResourceResolver ni birga ishlatish holatida, ular aynan shu tartibda ro'yxatdan o'tkazilishi kerak. Bu asosiy fayl asosidagi kontentni ishonchli ravishda hisoblashni ta'minlaydi.

WebJars ham, sinf yo'lida org.webjars:webjars-locator-core mavjud bo'lganda avtomatik ravishda ro'yxatdan o'tadigan WebJarsResourceResolver orqali qo'llab-quvvatlanadi. Aniqlovchi URL manzillarni qayta yozishi mumkin, jumladan, Jar versiyasini o'z ichiga olishi mumkin, shuningdek, /jquery/jquery.min.js dan /jquery/1.2.0/jquery.min.js ga mos kelishi mumkin.

Java-konfiguratsiya asosidagi ResourceHandlerRegistry nazokatli nazorat qilish uchun qo'shimcha imkoniyatlarni taqdim etadi, masalan, oxirgi o'zgartirish mantiqi va optimallashtirilgan resurslarni aniqlash.

Standart servlet

Spring MVC freymvorki DispatcherServlet ni / ga ko'chirish imkonini beradi (shu bilan konteyner standart servlet ko'chirishini qayta yozib), statik resurs so'rovlarini konteyner standart servleti boshqaradi. U DefaultServletHttpRequestHandler ni /** URL ko'chirish va boshqa URL ko'chirishlarga nisbatan eng past ustuvorlik bilan sozlaydi.

Ushbu boshqaruvchi barcha so'rovlarni standart servletga yo'naltiradi. Shuning uchun u boshqa URL ko'chirishlaridan avval o'rta bo'lishi kerak. Bu <mvc:annotation-driven> ishlatilganda sodir bo'ladi. Shuningdek, agar HandlerMapping ni o'zingiz yaratgan bo'lsangiz, uning order xususiyatini DefaultServletHttpRequestHandler dan kamroq qiymatga o'rnatishni unutmang. Bu Integer.MAX_VALUE dir.

Quyidagi misolda, ushbu funksiyani standart sozlamalarni ishlatib faollashtirish qanday ko'rsatilgan:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    override fun configureDefaultServletHandling(configurer: DefaultServletHandlerConfigurer) {
        configurer.enable()
    }
}

Quyidagi misolda XML bilan bunday konfiguratsiyani qanday olish mumkinligi ko'rsatilgan:

<mvc:default-servlet-handler/>

/ ko'chirishni qayta yozishda ogohlantirish shundaki, standart servlet uchun RequestDispatcher nom orqali topilishi kerak, yo'l bilan emas. DefaultServletHttpRequestHandler konteyner uchun standart servletni ishga tushirish vaqtida avtomatik ravishda aniqlash uchun mashhur nomlar ro'yxatini ishlatadi, aksariyat asosiy servlet konteynerlari uchun (Tomcat, Jetty, GlassFish, JBoss, Resin, WebLogic va WebSphere shu jumladan). Agar standart servlet boshqa nom bilan maxsus konfiguratsiyalangan yoki standart servlet nomi noma'lum bo'lgan boshqa servlet konteyneri ishlatilayotgan bo'lsa, quyidagi misolda ko'rsatilganidek, standart servlet nomini aniq ko'rsating:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable("myCustomDefaultServlet");
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    override fun configureDefaultServletHandling(configurer: DefaultServletHandlerConfigurer) {
        configurer.enable("myCustomDefaultServlet")
    }
}

Quyidagi misolda XML bilan bunday konfiguratsiyani qanday olish mumkinligi ko'rsatilgan:

<mvc:default-servlet-handler default-servlet-name="myCustomDefaultServlet"/>

Yo'l moslamalari

Yo'l moslamalari va URLni qayta ishlash bilan bog'liq variantlarni sozlashingiz mumkin. Har bir variant haqida batafsil ma'lumotni PathMatchConfigurer javadoc'da topasiz.

Quyidagi misolda, Java-konfiguratsiyada yo'l moslamalarini qanday sozlashni ko'rsatadi:

Java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer
            .setPatternParser(new PathPatternParser())
            .addPathPrefix("/api", HandlerTypePredicate.forAnnotation(RestController.class));
    }
    private PathPatternParser patternParser() {
        // ...
    }
}
Kotlin
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
    override fun configurePathMatch(configurer: PathMatchConfigurer) {
        configurer
            .setPatternParser(patternParser)
            .addPathPrefix("/api", HandlerTypePredicate.forAnnotation(RestController::class.java))
    }
    fun patternParser(): PathPatternParser {
        //...
    }
}

Quyidagi misolda XML bilan bunday konfiguratsiyani qanday olish mumkinligi ko'rsatilgan:

<mvc:annotation-driven>
    <mvc:path-matching
        trailing-slash="false"
        path-helper="pathHelper"
        path-matcher="pathMatcher"/>
</mvc:annotation-driven>
<bean id="pathHelper" class="org.example.app.MyPathHelper"/>
<bean id="pathMatcher" class="org.example.app.MyPathMatcher"/>

Kengaytirilgan Java konfiguratsiyasi

@EnableWebMvc DelegatingWebMvcConfiguration'ni import qiladi, bu:

  • Spring ilovalari uchun standart Spring konfiguratsiyasini taqdim etadi

  • WebMvcConfigurer implementatsiyalarini aniqlaydi va ushbu konfiguratsiyani sozlash uchun delegat qiladi.

Kengaytirilgan rejimda, @EnableWebMvc annotatsiyasini olib tashlashingiz va DelegatingWebMvcConfigure'dan to'g'ridan-to'g'ri foydalanishingiz mumkin, quyidagi misolda ko'rsatilganidek:

Java
@Configuration
public class WebConfig extends DelegatingWebMvcConfiguration {
    // ...
}
Kotlin
@Configuration
class WebConfig : DelegatingWebMvcConfiguration() {
    // ...
}

Sizning WebConfig dagi hozirgi metodlarni saqlab qolishingiz mumkin, ammo endi asosiy sinfning bean e'lonlarini override qilishingiz va classpathda boshqa har qanday WebMvcConfigurer implementatsiyalariga ega bo'lishingiz mumkin.

Kengaytirilgan XML-konfiguratsiyasi

MVC nom maydoni kengaytirilgan rejimni ta'minlamaydi. Agar boshqa usul bilan o'zgartirib bo'lmaydigan bean xususiyatini sozlash talab qilinsa, BeanPostProcessor lifecycle interceptor'idan foydalanib, Spring ApplicationContextda quyidagi misolda ko'rsatilganidek foydalanishingiz mumkin:

Java
@Component
public class MyPostProcessor implements BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException {
        // ...
    }
}
Kotlin
@Component
class MyPostProcessor : BeanPostProcessor {
    override fun postProcessBeforeInitialization(bean: Any, name: String): Any {
        // ...
    }
}
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION