Conseils Pratiques pour Servlet, Partie 3
Autres Conseils pour Servlet
Voici quelques petites choses à se rappeler lorsque l’on travaille avec les servlets.
Utilisez Content-Disposition lors de l’Envoi d’un Fichier
Pendant que nous sommes dans le sujet des incantations magiques concernant les en-têtes, les développeurs de servlets ont souvent du mal à trouver la bonne combinaison d’en-têtes pour transmettre un fichier à faire enregistrer par le navigateur, et non pas à afficher, en proposant la boîte de dialogue “Enregistrer Sous”. Pour la solution à ce problème, j’ai une bonne et une mauvaise nouvelle.
La mauvaise nouvelle est que bien que les spécifications HTTP décrivent le mécanisme pour le téléchargement de fichiers (voir HTTP/1.1, Section 19.5.1), de nombreux navigateurs essaient de deviner les intentions du serveur et font ce qu’ils pensent être le mieux plutôt que ce qu’ils devraient faire. Ces navigateurs—tels que Microsoft Internet Explorer et Opéra—vérifient l’extension du fichier pour en déduire le contenu. S’ils voient HTML ou le contenu d’une image, ils affichent sur la page le contenu du fichier au lieu de proposer la boîte de dialogue. Il apparaît alors qu’il n’existe pas une manière infaillible d’effectuer le téléchargement d’un fichier qui soit compatible avec tous les navigateurs. Peut-être que les programmeurs sont comme des alchimistes, plutôt que des magiciens, qui essaient de transformer le plomb en or.
La bonne nouvelle est qu’il existe quand même une combinaison d’en-têtes qui est suffisamment efficace pour pouvoir effectuer des téléchargements. Avec ces en-têtes spéciaux, un navigateur compatible affichera une boîte de dialogue Enregistrer Sous, alors qu’un navigateur non compatible affichera la boîte de dialogue pour tout contenu autre que les fichiers HTML et images. Pour ces types de fichier, le navigateur affichera leur contenu et l’utilisateur pourra le sauvegarder en utilisant le menu contextuel. L’exemple 3-9 montre la meilleure technique pour l’envoi de fichiers.
Exemple 3-9: Envoi d’un fichier pour téléchargement
// Initialisation des en-têtes.
res.setContentType("application/x-download");
res.setHeader("Content-Disposition", "attachment; filename=" + filename);
// Envoi du fichier.
OutputStream out = res.getOutputStream( );
returnFile(filename, out); // méthode décrite dans les parties précédentes
Premièrement, initialiser l’en-tête Content-Type à une valeur non-standard telle que application/x-download. Il est très important que cet en-tête ne soit pas reconnu par le navigateur sinon le navigateur essaiera de faire quelque chose de spécial en reconnaissant le type du contenu. Ensuite, initialiser l’en-tête Content-Disposition à la valeur attachement; filename=foo, dans laquelle foo est substitué au nom du fichier à utiliser par défaut dans la boîte de dialogue Enregistrer Sous. Enfin, envoyez le contenu fichier sous forme de bytes. Ceux-ci peuvent provenir du système de fichiers ou être générés au vol.
En utilisant ces en-têtes, le contenu du fichier dans la réponse sera proposé à l’enregistrement, ou dans le pire des cas, son résultat affiché pourra être sauvegardé. Il n’existe pas de technique standard pour télécharger plusieurs fichiers dans une même réponse.
Enfin, il peut être utile d’inclure en information supplémentaire pour la servlet le nom du fichier téléchargé. La servlet peut utiliser le nom du fichier pour déterminer le nom du fichier à télécharger, ou elle peut ignorer cette information. Dans tous les cas, c’est utile, parce que le nom apparaît sur le navigateur comme le nom de la ressource retrouvée, et les navigateurs utilisent souvent ce même nom dans la boîte de dialogue Enregistrer Sous. Par exemple, au lieu d’envoyer le contenu depuis /servlet/FileDownload?fileid=5, envoyez le depuis /servlet/FileDownload/inventory.pdf?fileid=5
Engagez un Designeur pour l’interface
Mon dernier conseil personnel ne vient pas de collègues programmeurs, mais des utilisateurs pour qui nous travaillons tous : “S’il vous plaît, je vous en supplie, engagez un designeur d’interface”.
Voici quelques faits : peu de gens sont de bons designeurs, et peu de gens sont de bons programmeurs Java. La chance de trouver une personne douée dans les deux domaines est extrêmement faible. Il y a donc une forte probabilité pour que vous ne soyez pas un bon designeur. S’il vous plaît, engagez quelqu’un qui le soit, et passez votre temps sur le code serveur avec nous qui ne sommes pas aussi doués pour le design. Mais d’un autre côté, nous sommes plus marrants.

Textes originaux en anglais sur O’Reilly : Servlet Best Practices par The O’Reilly Java Authors
Chargement
Commentaires récents