2011-09-04 2 views
4

J'utilise Sping MVC avec des vues Freemarker. J'ai mis en place un FreeMarkerViewResolver pour résoudre les vues et cela fonctionne jusqu'ici mais maintenant j'ai des problèmes d'encodage. Toutes mes vues sont HTML 5 pages en encodage UTF-8 et j'ai également ajouté un <meta charset="UTF-8" /> à la page HTML mais les caractères sont toujours imprimés avec le mauvais encodage. J'ai vérifié les en-têtes HTTP avec boucle et trouvé ceci:Comment définir le type de contenu dans les vues Freemarker lors de l'utilisation de Spring MVC?

[email protected]:~$ curl -I http://localhost:8080/testweb/test.view 
HTTP/1.1 200 OK 
Content-Type: */*;charset=ISO-8859-1 

Mais quand je demande une ressource non-existante (ce qui génère une erreur Tomcat) j'obtiens ceci:

[email protected]:~$ curl -I http://localhost:8080/testweb/nothere.html 
HTTP/1.1 200 OK 
Content-Type: text/html;charset=utf-8 

Alors Tomcat lui-même renvoie le type de contenu correct, mais les vues Spring MVC Freemarker ne le font pas.

Pour une JSP, je peux définir le type de contenu dans l'en-tête JSP mais où puis-je le définir pour un modèle Freemarker? Je suppose que je dois le faire quelque part dans la configuration du haricot de printemps, mais je ne trouve pas le bon endroit.

Répondre

8

La vue résolveur (devrait être dans votre dispatcher-servlet.xml) a une contentType propriété pour que:

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
    <property name="prefix" value=""/> 
    <property name="suffix" value=".ftl"/> 
    <property name="contentType" value="text/html;charset=UTF-8"/> 
</bean> 
5

J'ai aussi rencontré un problème montrant caractères UTF-8 (caractères spéciaux comme æ ø et å etc. .), lors de l'utilisation de l'armature de ressort et du modèle Freemarker.

Ce que j'ai fait était.

1. Assurez-vous que votre page .ftl est codé avec utf-8 Ceci est une chose importante pour assurer, qu'une page non codé avec charset UTF-8, pourrait montrer les mauvais chiffres, même si vous avez tous l'autre ensemble d'exigences. Vérifiez vos paramètres IDE, pour savoir quel encodage par défaut définit vos fichiers. Je pense cependant qu'aujourd'hui, Eclipse et NetBeans définissent tous les fichiers avec un codage UTF-8 en standard. Vous devez vous assurer qu'il code UTF-8 sans nomenclature.

2. Inclure le fichier balise Meta dans votre fichier de modèle pour définir le charset Dans votre modèle (.ftl), qui détient votre balise <head>, définissez un <meta>, avec l'attribut charset="UTF-8". Ceci est si vous utilisez HTML 5. Si vous utilisez xhtml ou HTML 4, votre balise meta doit ressembler à ceci

  • HTML 5 <meta charset="UTF-8" />
  • HTML 4/XHTML <meta http-equiv="content-type" content="text/html; charset=utf-8"/>

3. Assurez-vous de définir un filtre de codage de caractères dans votre fichier de descripteur de déploiement. Vous devez filtrer toutes les demandes entrantes/sortantes via un filtre de codage de caractères. Ce filtre est défini dans votre descripteur de déploiement (web.xml/ou l'équivalent java WebApplicationInitializer).

WebApplicationInitializer (Java fichier)

@Override 
public void onStartup(ServletContext servletContext) throws ServletException { 
    registerCharacterEncodingFilter(servletContext); 
} 

/** 
* Filter all incoming requests with character encoding UTF-8 
* @param servletContext 
*/ 
private void registerCharacterEncodingFilter(ServletContext servletContext) { 
    CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter(); 
    encodingFilter.setEncoding("UTF-8"); 
    encodingFilter.setForceEncoding(true); 
    FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("characterEncodingFilter", encodingFilter); 
    characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*"); 
} 

web.xml

<filter> 
    <filter-name>encodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>encodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

4. Définir le codage de caractères FreeMarker dans résolveur configurateur et vue Vous devez également faire tous vos fichiers FreeMarker être standard encodée avec UTF-8, cela se fait en réglant leurs propriétés UTF-8 dans FreeMarkerConfigurer et FreeMarkerViewResolver. Ceci est défini dans votre fichier de contexte d'application de printemps (je ne montrerai que l'équivalent Java car il est le même dans le fichier XML).

/** 
* FreeMarker Configurer will help configure different settings of 
* the FreeMarker template engine. 
* 
* @return an object of the FreeMarkerConfigurer class. 
*/ 
@Bean 
public FreeMarkerConfigurer freemarkerConfig() { 
    FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer(); 
    freeMarkerConfigurer.setTemplateLoaderPath("/templates/"); 
    freeMarkerConfigurer.setDefaultEncoding("UTF-8"); 
    return freeMarkerConfigurer; 
} 

/** 
* The View resolver to use when resolving FreeMarker views. 
* 
* @return the View Resolver Object used to resolve FreeMarker views. 
*/ 
@Bean 
public FreeMarkerViewResolver viewResolver() { 
    FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver(); 
    viewResolver.setPrefix(""); 
    viewResolver.setSuffix(".ftl"); 
    viewResolver.setCache(false); //Set to true during production 
    viewResolver.setContentType("text/html;charset=UTF-8"); 
    return viewResolver; 
} 

l'espoir que cela vous aide :)

Questions connexes