Spring-Boot + Spring-MVC + Thymeleaf + Apache Tuiles
J'ai déjà existants module client avec apache tuiles et thymeleaf, ce qui fonctionne bien. Je voulais convertir printemps-boot et je voulais le faire étape par étape, mais je suis vraiment enfermant avec elle. Je ne veux pas changer beaucoup de fois, je l'aime quand quelqu'un peut me dire, ce que je devrais faire d'abord et l'amener à exécuter. J'ai déjà essayé d'écrire des servlets dans javaConfig, mais je suis enfermant alors trop. Peut-être que quelqu'un peut m'aider s'il vous plaît. Si plus d'information est nécessaire, s'il vous plaît n'hésitez pas à demander.
Autre question, dois-je changer de xml javaconfig? Je préfère le plus facile. Mais dès que j'ai ajouter le printemps-démarreur dépendance à pom, l'application ne fonctionne plus.
=======
POM:
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>at.compax.bbsng</groupId>
<artifactId>bbsng-client</artifactId>
<version>0.1.0-SNAPSHOT</version>
</parent>
<artifactId>bbsng-client-mvc</artifactId>
<name>bbsng-client-mvc</name>
<packaging>war</packaging>
<properties>
<org.apache.tiles-version>2.2.2</org.apache.tiles-version>
<org.thymeleaf-version>2.0.16</org.thymeleaf-version>
<slf4j-version>1.7.5</slf4j-version>
<jackson.version>1.9.10</jackson.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Apache Tiles -->
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-template</artifactId>
<version>${org.apache.tiles-version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-servlet</artifactId>
<version>${org.apache.tiles-version}</version>
</dependency>
<!-- ThyMeLeaf ... -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>${org.thymeleaf-version}</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring3</artifactId>
<version>${org.thymeleaf-version}</version>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-tiles2</artifactId>
<version>2.0.0</version>
</dependency>
<!-- Jackson JSON Mapper -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- Servlet ... -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- COMMONS ... -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<downloadSources>true</downloadSources>
<downloadJavadocs>false</downloadJavadocs>
<additionalBuildcommands>
<buildCommand>
<name>org.springframework.ide.eclipse.core.springbuilder</name>
</buildCommand>
</additionalBuildcommands>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<packagingExcludes>WEB-INF/web.xml</packagingExcludes>
<warName>${project.name}-${project.version}</warName>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
</plugin>
</plugins>
</build>
======
rest-servlet-context.xml
<mvc:annotation-driven>
<mvc:async-support default-timeout="120000">
<mvc:callable-interceptors>
<bean class="at.compax.bbsng.client.mvc.TimeoutCallableProcessingInterceptor" />
</mvc:callable-interceptors>
</mvc:async-support>
</mvc:annotation-driven>
<context:component-scan base-package="at.compax.bbsng.client.mvc.rest" />
=====
application-servlet-context.xml
<!-- **************************************************************** -->
<!-- RESOURCE FOLDERS CONFIGURATION -->
<!-- Dispatcher configuration for serving static resources -->
<!-- **************************************************************** -->
<mvc:resources location="/images/" mapping="/images/**" />
<mvc:resources location="/css/" mapping="/css/**" />
<!-- **************************************************************** -->
<!-- SPRING ANNOTATION PROCESSING -->
<!-- **************************************************************** -->
<mvc:annotation-driven>
<mvc:async-support default-timeout="120000">
<mvc:callable-interceptors>
<bean class="at.compax.bbsng.client.mvc.TimeoutCallableProcessingInterceptor" />
</mvc:callable-interceptors>
</mvc:async-support>
</mvc:annotation-driven>
<context:component-scan base-package="at.compax.bbsng.client.mvc.web" />
<!-- **************************************************************** -->
<!-- MESSAGE EXTERNALIZATION/INTERNATIONALIZATION -->
<!-- Standard Spring MessageSource implementation -->
<!-- **************************************************************** -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="Messages" />
</bean>
<!-- **************************************************************** -->
<!-- THYMELEAF-SPECIFIC ARTIFACTS -->
<!-- TemplateResolver <- TemplateEngine <- ViewResolver -->
<!-- **************************************************************** -->
<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver" />
<property name="additionalDialects">
<set>
<bean class="org.thymeleaf.extras.tiles2.dialect.TilesDialect"/>
</set>
</property>
</bean>
<!-- Configures the Tiles layout system using a specific thymeleaf-enabled Tiles Configurer -->
<bean id="tilesConfigurer" class="org.thymeleaf.extras.tiles2.spring.web.configurer.ThymeleafTilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/**/views.xml</value>
</list>
</property>
</bean>
<!-- Resolves view names returned by Controllers as names of Tiles definitions -->
<bean id="tilesViewResolver" class="org.thymeleaf.spring3.view.ThymeleafViewResolver">
<property name="viewClass" value="org.thymeleaf.extras.tiles2.spring.web.view.ThymeleafTilesView"/>
<property name="templateEngine" ref="templateEngine"/>
</bean>
<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".html" />
<property name="templateMode" value="HTML5" />
</bean>
=========
DEUXIÈME ÉTAPE EDIT:
J'ai fait quelques pas, de sorte que je peux maintenant commencer mon application en cours d'exécution applicationClass à partir d'ECLIPSE.
Ce que j'ai fait jusqu'à maintenant:
====
POM:
Veuillez conserver une vue, que j'ai enlevé thymeleaf-démarreur de chemin de classe, parce que je n'ai pas commencer avec thymeleaf-démarreur
...
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- <dependency> -->
<!-- <groupId>org.springframework.boot</groupId> -->
<!-- <artifactId>spring-boot-starter-thymeleaf</artifactId> -->
<!-- </dependency> -->
<!-- Apache Tiles -->
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-template</artifactId>
<version>${org.apache.tiles-version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-servlet</artifactId>
<version>${org.apache.tiles-version}</version>
</dependency>
<!-- ThyMeLeaf ... -->
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-tiles2-spring4</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
...
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
====
WebMvcConfig pour la configuration ThyMeLeaf
@Configuration
@ComponentScan
public class WebMvcConfig {
@Bean
public ThymeleafTilesConfigurer tilesConfigurer() {
final ThymeleafTilesConfigurer configurer = new ThymeleafTilesConfigurer();
configurer.setDefinitions("/WEB-INF/**/views.xml");
return configurer;
}
@Bean
public ThymeleafViewResolver viewResolver() {
final ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setViewClass(ThymeleafTilesView.class);
resolver.setTemplateEngine(templateEngine());
resolver.setCharacterEncoding(UTF_8);
return resolver;
}
private SpringTemplateEngine templateEngine() {
final SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(templateResolver());
engine.setAdditionalDialects(dialects());
return engine;
}
private ServletContextTemplateResolver templateResolver() {
final ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".html");
resolver.setTemplateMode("HTML5");
resolver.setCharacterEncoding(UTF_8);
return resolver;
}
private Set<IDialect> dialects() {
final Set<IDialect> set = new HashSet<IDialect>();
set.add(new TilesDialect());
return set;
}
}
=====
Printemps De Démarrage Démarreur Classe
ThyMeLeaf configuration automatique a été désactivé, cos je n'ai pas le faire fonctionner avec apache tuiles
@Configuration
@Import({ ServiceConfig.class, RestMvcConfig.class, WebMvcConfig.class })
@EnableAutoConfiguration(exclude = { ThymeleafAutoConfiguration.class })
public class ApplicationClientMvc implements WebApplicationInitializer {
public static void main(final String[] args) {
SpringApplication.run(ApplicationClientMvc.class, args);
}
@Bean
public ServletRegistrationBean applicationDispatcherRegistration(final DispatcherServlet dispatcherServlet) {
final ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet);
registration.setName("applicationServlet");
registration.addUrlMappings("/app/*");
registration.setAsyncSupported(true);
registration.setLoadOnStartup(1);
registration.addInitParameter("contextConfigLocation", "at.compax.bbsng.client.mvc.web.WebMvcConfig");
registration.setOrder(1);
return registration;
}
@Bean
public ServletRegistrationBean restDispatcherRegistration(final DispatcherServlet dispatcherServlet) {
final ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet);
registration.setName("restServlet");
registration.addUrlMappings("/rest/*");
registration.setAsyncSupported(true);
registration.setLoadOnStartup(0);
registration.addInitParameter("contextConfigLocation", "at.compax.bbsng.client.mvc.rest.RestMvcConfig");
registration.setOrder(0);
return registration;
}
@Override
public void onStartup(final ServletContext servletContext) throws ServletException {
final FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encoding-filter", new CharacterEncodingFilter());
encodingFilter.setInitParameter("encoding", UTF_8);
encodingFilter.setInitParameter("forceEncoding", "true");
encodingFilter.addMappingForUrlPatterns(null, true, "/*");
}
}
====
Quand je démarre l'application via Eclipse en commençant par le Printemps-Démarrage Début de la classe, l'application fonctionne.
Vous devez vous connecter pour publier un commentaire.
Bon, les gars,
Je l'ai eu et j'espère que cela aide les autres développeurs avec des problèmes similaires.
En POM j'ai enlevé tous les Printemps-Dépendances et j'utilise seulement le Printemps-Starter-Dépendances comme l'extrait de code suivant:
Dans mon Starter-Classe I actived Thymeleaf Autoconfiguration de nouveau, ma classe ressemble à ce qui suit. Être assisté, j'utilise deux différents servlets, l'un pour le REPOS, un pour Thymeleaf.
====
Mon WebMVCConfig de Classe ressemble comme suit, est dans le paquet
....mvc.rest
:===
Mon RestConfig Classe est assez simple
===
J'ai passé tous mes fichiers html ou thymeleaf-modèles le modèle sous-répertoire src/main/resources. Également dans le même dossier, vous pouvez mettre l'ensemble de la clientèle des ressources (images, css et js dans le dossier de l'électricité statique. Le dossier statique et les modèles sont des mots-clés et sera trouvé d'ici le Printemps-Boot automatiquement. Il n'y a pas de configurations spéciales en application.les propriétés de ce qui serait nécessaire pour thymeleaf et apache tuiles.
====
Que votre application est en mesure de trouver les ressources nécessaires, vous pouvez configurer le chemin d'accès comme suit:
===
Dossier
java/src/webapp
il n'est plus nécessaire!!!====
Si cette aide pour vous, n'hésitez pas à voter ;-). Si vous avez besoin de plus d'informations, juste un commentaire, je vais essayer de répondre dans un délai de quelques jours.
======
DEUXIÈME ÉTAPE
Bon, jusqu'à maintenant il ne fonctionne que sous Eclipse. Quand je fais de l'exécutable jar, j'obtiens toujours une erreur. Peut-être quelqu'un veut de l'aide 😉
Stacktrace est :
La Structure de mon POT, c'est comme:
======
SOLUTION:
Je ne sais pas exactement pourquoi, mais j'ai corriger les chemins d'url pour mes modèles, ce qui fonctionne comme il est dans Eclipse, mais pas comme exécutable jar. Pour le faire fonctionner dans les deux environnements, j'ai eu à résoudre tous les modèles d'url comme suit, ont un regard particulier sur la valeur de l'attribut:
AVANT:
APRÈS:
Enfin, il travaille sous Eclipse et comme exécutable pots. La conversion de la normale Printemps-Projet pour le Printemps-Démarrage du Projet n'était pas vraiment facile de courir, j'espère que ça aidera d'autres développeurs, et j'espère que le post est intéressant de vote. 😉
Cet exemple montrent comment configurer Thymeleaf avec Apache tuiles, mais il est de laisser le printemps de démarrage pour configurer automatiquement Thymeleaf. De cette façon, vous pouvez toujours utiliser tous les printemps de démarrage prédéfinie variables d'environnement comme le printemps.thymeleaf.* dans votre application.propriétés
https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java#L116