Voici un troisième billet dans la série sur Les bonnes pratiques avec Struts.

Introduction

A partir du moment où une application doit être internationalisée, il est intéressant d’utiliser l’encodage UTF-8 par défaut. Dès lors, un problème d’affichage des valeurs des formulaires se pose avec certains caractères[1].

Solutions

Il existe deux solutions courantes pour répondre à ce problème, qui s’implémentent :

  • dans les méthodes reset() et validate() de la classe ActionForm
  • avec des filtres des servlets

ActionForm.reset & ActionForm.validate

Il suffit simplement d’implémenter ces deux méthodes dans tous vos ActionForm :

public void reset(ActionMapping mapping, HttpServletRequest request) {
 	try {
 		request.setCharacterEncoding("UTF-8");
 	} catch (UnsupportedEncodingException e) {
 		e.printStackTrace();
 	}
 	super.reset(mapping, request);
 }
 public void validate(ActionMapping mapping, HttpServletRequest request) {
 	try {
 		request.setCharacterEncoding("UTF-8");
 	} catch (UnsupportedEncodingException e) {
 		e.printStackTrace();
 	}
 	super.validate(mapping, request);
 }

Cette méthode fonctionne bien. Mais elle pose deux problèmes :

  • Il faut implémenter ces méthodes dans tous les ActionForm. Ce problème peut être contourné par l’implémentation d’une classe de base BaseActionForm.
  • Le comportement des DynaActionForm n’est pas impacté par cette astuce.

Filtres de servlet

Il faut écrire un filtre de servlet qui va modifier l’encodage de toutes les requêtes :

import java.io.IOException;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 public class EncodingFilter implements javax.servlet.Filter {
 	private String encoding;
 	public void init(FilterConfig filterConfig) throws ServletException {
 		this.encoding = filterConfig.getInitParameter("encoding");
 	}
 	public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
 		request.setCharacterEncoding(encoding);
 		filterChain.doFilter(request, response);
 	}
 	public void destroy() {
 	}
 }

Ensuite, il faut déclarer le filtre dans le fichier /WEB-INF/web.xml ainsi (avant tous les autres filtres) :

<filter>
 	<filter-name>Encoding Filter</filter-name>
 	<filter-class>EncodingFilter</filter-class>
 	<init-param>
 		<param-name>encoding</param-name>
 		<param-value>UTF-8</param-value>
 	</init-param>
 </filter>
 <filter-mapping>
 	<filter-name>Encoding Filter</filter-name>
 	<url-pattern>/*</url-pattern>
 </filter-mapping>

Maintenant toutes les requêtes sont correctement lues avec l’encodage UTF-8.

Conclusion

La seconde solution est non-intrusive et plus sûre. De plus, elle n’est pas spécifique à Struts et peut être utilisée pour n’importe quel type d’application web J2EE.

Il ne reste plus qu’à traduire vos applications en chinois. 😀

Notes

[1] Comme les caractères accentués tels que é, è, à, ô, …