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 internationnalisé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 :
<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 correctements 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 é, è, à, ô, …
struts utf8