В моей предыдущей статье я писал о Scala 4 Spring MVC без Web.XML и о том, как обрабатывать статические ресурсы, доступные клиенту AngularJS. В этой статье я покажу, как подключить приложение к Apache Tiles 3.0. Apache Tiles позволяет определять фрагменты страниц и объединять их в один. В целом Tiles 3.0 — это хороший и чистый способ многократного использования передних частей. Одной из этих частей являются локализованные сообщения (см. Рис. 1: Структура проекта).
Включение Apache Tiles3 требует немного больше изменений в конфигурации проекта (рис.1). Класс Scala WebConfig должен быть расширен с помощью WebMvcConfigurerAdapter ( предыдущая статья )
Мы также определяем набор аннотаций, которые нам нужно отсканировать по пакету проекта. Причина такого определения — показать возможности настройки Scala самой Spring Framework.
@Configuration @ComponentScan(basePackages = Array("miko.scala.helloexample"), useDefaultFilters = false, includeFilters = Array( new ComponentScan.Filter(`type` = FilterType.ANNOTATION, value = Array(classOf[Controller], classOf[Service])))) @EnableWebMvc class WebConfig extends WebMvcConfigurerAdapter{ ...
В WebConfig мы заменяем @Bean setupViewResolver (), который реализует интерфейс ViewResolver, который позволяет напрямую разрешать имена символических представлений, на getTilesConfigurer @Bean , который предоставляет TilesConfigurer .
Класс TilesConfigurer предоставляет механизм заманчивости для веб-проекта (приложения), использующего JSP и другие интерфейсные движки.
@Bean def getTilesConfigurer: TilesConfigurer = { val configurer:TilesConfigurer = new TilesConfigurer() configurer.setCheckRefresh(true) configurer.setDefinitions({"/WEB-INF/pages/tiles.xml"}) configurer }
Кроме того, мы должны определить ViewResolver для плиток с помощью getTilesViewResolver @Bean description .
@Bean def getTilesViewResolver: ViewResolver = { val resolver:TilesViewResolver = new TilesViewResolver() resolver.setContentType("text/html") resolver }
Полная конфигурация должна определить и переопределить также пару других Бинов, связанных с нашим намерением локализации (l10n / l18n). Окончательный класс WebConfig Scala будет выглядеть следующим образом.
@Configuration @ComponentScan(basePackages = Array("miko.scala.helloexample"), useDefaultFilters = false, includeFilters = Array( new ComponentScan.Filter(`type` = FilterType.ANNOTATION, value = Array(classOf[Controller], classOf[Service])))) @EnableWebMvc class WebConfig extends WebMvcConfigurerAdapter{ private val logger = LoggerFactory.getLogger(getClass) override def configureDefaultServletHandling(configurer: DefaultServletHandlerConfigurer) = { configurer.enable() } override def addViewControllers(registry: ViewControllerRegistry): Unit ={ registry.addViewController("/") } @Bean def getTilesViewResolver: ViewResolver = { val resolver:TilesViewResolver = new TilesViewResolver() resolver.setContentType("text/html") resolver } @Bean def getTilesConfigurer: TilesConfigurer = { val configurer:TilesConfigurer = new TilesConfigurer() configurer.setCheckRefresh(true) configurer.setDefinitions({"/WEB-INF/pages/tiles.xml"}) configurer } override def addInterceptors(registry:InterceptorRegistry) = { val localeChangeInterceptor = new LocaleChangeInterceptor() localeChangeInterceptor.setParamName("lang") registry.addInterceptor(localeChangeInterceptor) } /** * equivalents for <mvc:resources> tags * @param registry */ override def addResourceHandlers(registry: ResourceHandlerRegistry) = { logger.debug("Resources HANDLER") registry.addResourceHandler("/app/**").addResourceLocations("/app/").setCachePeriod(31550522) registry.addResourceHandler("/WEB-INF/layouts/**").addResourceLocations("/WEB-INF/layouts/").setCachePeriod(31550522); registry.addResourceHandler("/WEB-INF/pages/template/**").addResourceLocations("/WEB-INF/pages/template/").setCachePeriod(31550522); } @Bean(name = Array("localeResolver")) def getLocaleResolver: LocaleResolver = { val cookieLocaleResolver: CookieLocaleResolver = new CookieLocaleResolver() cookieLocaleResolver.setDefaultLocale(new Locale("en")) cookieLocaleResolver } override def configureContentNegotiation(configurer: ContentNegotiationConfigurer) = { configurer.favorPathExtension(true).ignoreAcceptHeader(true) .useJaf(false).defaultContentType(MediaType.TEXT_HTML) .mediaType("html", MediaType.TEXT_HTML) .mediaType("xml", MediaType.APPLICATION_XML) .mediaType("json", MediaType.APPLICATION_JSON) } @Bean(name = Array("messageSource")) def getMessageSource: MessageSource = { val msgSrc:ReloadableResourceBundleMessageSource = new ReloadableResourceBundleMessageSource() msgSrc.setBasename("classpath:/messages/message") msgSrc } }
После включения Tiles с l10n / l18n на задней стороне мы можем перейти к front-end и сообщить Tiles, какой тип шаблона он должен использовать для правильного отображения страниц для пользователя ( рис.1. ~ Структура проекта ). Конечно, с CSS или возможными библиотеками JavaScript.
Но я сделаю это в следующем сообщении в блоге.
Теперь наслаждайтесь настройкой вашего класса WebConfig scala. ( мои блоги о скале )