From a2d00e3bf7043875f128ff59f0da00e612dab329 Mon Sep 17 00:00:00 2001 From: Alexander Alexeev Date: Sun, 20 Nov 2016 04:05:12 +0700 Subject: configuration and build files --- .gitmodules | 2 +- juick-spring-www/build.gradle | 12 ++- .../juick/www/configuration/WwwInitializer.java | 43 ++++++++ .../www/configuration/WwwServletConfiguration.java | 112 +++++++++++++++++++++ juick-spring-www/src/main/resources/help | 1 + .../src/main/resources/messages.properties | 0 6 files changed, 166 insertions(+), 4 deletions(-) create mode 100644 juick-spring-www/src/main/java/com/juick/www/configuration/WwwInitializer.java create mode 100644 juick-spring-www/src/main/java/com/juick/www/configuration/WwwServletConfiguration.java create mode 160000 juick-spring-www/src/main/resources/help create mode 100644 juick-spring-www/src/main/resources/messages.properties diff --git a/.gitmodules b/.gitmodules index 5b7ebbf7..54466eb1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,4 @@ url = https://github.com/juick/help.git [submodule "juick-spring-www/src/main/resources/help"] path = juick-spring-www/src/main/resources/help - url = https://github.com/juick/help.git \ No newline at end of file + url = https://github.com/juick/help.git diff --git a/juick-spring-www/build.gradle b/juick-spring-www/build.gradle index 2f8c0377..fb403337 100644 --- a/juick-spring-www/build.gradle +++ b/juick-spring-www/build.gradle @@ -19,13 +19,19 @@ apply plugin: 'org.akhikhl.gretty' apply plugin: 'com.github.ben-manes.versions' def springFrameworkVersion = '4.3.4.RELEASE' +def thymeleafVersion = '3.0.2.RELEASE' dependencies { compile project(':juick-server') - compile 'com.sun.mail:javax.mail:1.5.6' + compile "com.sun.mail:javax.mail:1.5.6" + compile "org.pegdown:pegdown:1.6.0" compile "org.springframework:spring-webmvc:${springFrameworkVersion}" - providedCompile 'javax.servlet:javax.servlet-api:3.1.0' - providedRuntime 'mysql:mysql-connector-java:5.1.40' + compile "org.thymeleaf:thymeleaf:${thymeleafVersion}" + compile "org.thymeleaf:thymeleaf-spring4:${thymeleafVersion}" + compile "org.thymeleaf.extras:thymeleaf-extras-java8time:3.0.0.RELEASE" + testRuntime "org.thymeleaf:thymeleaf-spring4:${thymeleafVersion}" + providedCompile "javax.servlet:javax.servlet-api:3.1.0" + providedRuntime "mysql:mysql-connector-java:5.1.40" } compileFrontend.dependsOn 'npmInstall' diff --git a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwInitializer.java b/juick-spring-www/src/main/java/com/juick/www/configuration/WwwInitializer.java new file mode 100644 index 00000000..852ec554 --- /dev/null +++ b/juick-spring-www/src/main/java/com/juick/www/configuration/WwwInitializer.java @@ -0,0 +1,43 @@ +package com.juick.www.configuration; + +import com.juick.configuration.DataConfiguration; +import com.juick.configuration.SearchConfiguration; +import org.springframework.web.filter.CharacterEncodingFilter; +import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; + +import javax.servlet.Filter; + +/** + * Created by aalexeev on 11/20/16. + */ +public class WwwInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { + + @Override + protected Class[] getRootConfigClasses() { + return new Class[]{DataConfiguration.class, SearchConfiguration.class}; + } + + @Override + protected Class[] getServletConfigClasses() { + return new Class[]{WwwServletConfiguration.class}; + } + + @Override + protected String[] getServletMappings() { + return new String[]{"/"}; + } + + @Override + protected Filter[] getServletFilters() { + CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); + characterEncodingFilter.setEncoding("UTF-8"); + + return new Filter[]{characterEncodingFilter}; + } + + @Override + protected String getServletName() { + return "WWW-spring dispatcher servlet"; + } +} + diff --git a/juick-spring-www/src/main/java/com/juick/www/configuration/WwwServletConfiguration.java b/juick-spring-www/src/main/java/com/juick/www/configuration/WwwServletConfiguration.java new file mode 100644 index 00000000..8edc1b6c --- /dev/null +++ b/juick-spring-www/src/main/java/com/juick/www/configuration/WwwServletConfiguration.java @@ -0,0 +1,112 @@ +package com.juick.www.configuration; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.support.ReloadableResourceBundleMessageSource; +import org.springframework.context.support.ResourceBundleMessageSource; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import org.thymeleaf.spring4.SpringTemplateEngine; +import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver; +import org.thymeleaf.spring4.view.ThymeleafViewResolver; +import org.thymeleaf.templatemode.TemplateMode; + +import java.util.List; + +/** + * Created by vitalyster on 28.06.2016. + */ +@Configuration +@ComponentScan(basePackages = {"com.juick.www.controllers"}) +@PropertySource("classpath:juick.conf") +public class WwwServletConfiguration extends WebMvcConfigurationSupport { + + @Bean + public SpringResourceTemplateResolver templateResolver() { + // SpringResourceTemplateResolver automatically integrates with Spring's own + // resource resolution infrastructure, which is highly recommended. + SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); + templateResolver.setApplicationContext(getApplicationContext()); + templateResolver.setPrefix("/WEB-INF/templates/"); + templateResolver.setSuffix(".html"); + // HTML is the default value, added here for the sake of clarity. + templateResolver.setTemplateMode(TemplateMode.HTML); + // Template cache is true by default. Set to false if you want + // templates to be automatically updated when modified. + templateResolver.setCacheable(true); + return templateResolver; + } + + @Bean + public SpringTemplateEngine templateEngine() { + // SpringTemplateEngine automatically applies SpringStandardDialect and + // enables Spring's own MessageSource message resolution mechanisms. + SpringTemplateEngine templateEngine = new SpringTemplateEngine(); + templateEngine.setTemplateResolver(templateResolver()); + // Enabling the SpringEL compiler with Spring 4.2.4 or newer can + // speed up execution in most scenarios, but might be incompatible + // with specific cases when expressions in one template are reused + // across different data types, so this flag is "false" by default + // for safer backwards compatibility. + templateEngine.setEnableSpringELCompiler(true); + return templateEngine; + } + + @Bean + public ThymeleafViewResolver viewResolver() { + ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); + viewResolver.setTemplateEngine(templateEngine()); + // NOTE 'order' and 'viewNames' are optional + viewResolver.setOrder(1); + viewResolver.setViewNames(new String[]{".html", ".xhtml"}); + return viewResolver; + } + + @Override + public RequestMappingHandlerMapping requestMappingHandlerMapping() { + RequestMappingHandlerMapping mapping = super.requestMappingHandlerMapping(); + mapping.setUseSuffixPatternMatch(false); + return mapping; + } + + @Override + protected void configureMessageConverters(List> converters) { + Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() + .serializationInclusion(JsonInclude.Include.NON_DEFAULT) + .serializationInclusion(JsonInclude.Include.NON_NULL) + .serializationInclusion(JsonInclude.Include.NON_ABSENT) + .serializationInclusion(JsonInclude.Include.NON_EMPTY); + + MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build()); + converter.getObjectMapper().registerModule(new Jdk8Module()); + converters.add(converter); + + super.configureMessageConverters(converters); + } + + @Override + protected void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.setOrder(0); + registry.addResourceHandler("/scripts.js").addResourceLocations("/"); + registry.addResourceHandler("/style.css").addResourceLocations("/"); + } + + @Bean + public ResourceBundleMessageSource messageSource() { + ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); + + messageSource.setBasename("messages"); + messageSource.setDefaultEncoding("UTF-8"); + messageSource.setFallbackToSystemLocale(false); + + return messageSource; + } +} diff --git a/juick-spring-www/src/main/resources/help b/juick-spring-www/src/main/resources/help new file mode 160000 index 00000000..491a2f16 --- /dev/null +++ b/juick-spring-www/src/main/resources/help @@ -0,0 +1 @@ +Subproject commit 491a2f167939a81fc6da354c67a1efdb7d60845a diff --git a/juick-spring-www/src/main/resources/messages.properties b/juick-spring-www/src/main/resources/messages.properties new file mode 100644 index 00000000..e69de29b -- cgit v1.2.3