Forcer le rechargement Javascript ou CSS

Parfois, un développeur peut éprouver quelques difficultés à forcer le rechargement d’une partie du site Web, sans pour autant ignorer le cache du navigateur.

Bien souvent, Internet Explorer pour n’en citer qu’un (mais sans doute le pire), continue de se baser sur une version obsolète d’un fichier Javascript, car présent dans son cache, ce parfois même en tentant de rafraîchir à grands coups de F5.

Pour forcer le navigateur à recharger un fichier fraîchement mis à jour, il suffit en fait de modifier son URL, en ajoutant un attribut derrière le « ? ». Dans ce cas, pourquoi ne pas se baser sur la date de modification du-dit fichier pour générer cet attribut ? C’est justement ce que le bout de code ci-dessous permet de faire depuis une JSP.

<%
	final String CSS = "css/main.css";
	final String JS = "js/main.js";
	final String ABSOLUTE_PATH = request.getSession().getServletContext().getRealPath(".") + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr-FR" lang="fr-FR">
<head>
	<title>Date de modification d'un fichier depuis une JSP</title>
	<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
	<meta http-equiv="content-language" content="fr-FR" />
	<meta name="language" content="fr-FR" />
	<link rel="stylesheet" type="text/css" href="<%= CSS + "?" + (new java.io.File(ABSOLUTE_PATH + CSS)).lastModified() %>" />
	<script type="text/javascript" src="<%= JS + "?" + (new java.io.File(ABSOLUTE_PATH + JS)).lastModified() %>"></script>
...

Attention ! Si votre page Web est présente dans un sous-répertoire de la racine du site, pensez à ajouter ce sous-répertoire derrière le slash final dans la constante ABSOLUTE_PATH, comme ceci : / --> /sous-repertoire/
Dans le cas contraire, aucune Exception ne sera provoquée lors de l’exécution du Servlet, mais la méthode lastModified() se contentera de retourner 0 pour un fichier qui n’a tout simplement pas été trouvé.

Produire un fichier CSV à partir d’une JSP

Les différences entre les navigateurs, mais aussi entre les numéros de version des navigateurs, sont la source de nombreux problèmes quand il s’agit de développer une fonction a priori simple. Produire un vulgaire fichier CSV à la volée via une JSP en est le parfait exemple : si l’on se contente d’écrire le contenu directement dans le flux de sortie out (e.g. « <%= maVariable %> » ), aucune version d’Internet Explorer antérieure à la 9 n’est en mesure de télécharger correctement le fichier produit. Pour ce faire, et ce n’est pas moi qui ai trouvé la solution mais mon chef *, il est nécessaire de passer par un StringBuffer et d’écrire l’ensemble du flux via le Writer de l’instance response.

<%@ page contentType="application/octet-stream" import="java.util.*, java.io.*" %><%
	response.setContentType("application/vnd.ms-excel");
	response.setHeader("Content-Disposition", "attachment; filename=\"donnees.csv\"");
	
	final String sep = ";"; // separateur de colonnes a la Excel
	final String crlf = "\r\n"; // fin de ligne a la ouin-ouin

	StringBuffer stringBuffer = new StringBuffer();
	
	stringBuffer.append("Chaine" + sep + "Nombre" + crlf);
	stringBuffer.append("\"Hello world\"" + sep + "123,45" + crlf);
	
	PrintWriter pw = response.getWriter();
	pw.println( stringBuffer.toString() );
%>

* Les chefs, c’est aussi fait pour ça !

Notre grande amie Hadopi

Suite à la récente campagne de publicité lancée par l’Hadopi, Numerama vient de mettre en place un outil de détournement de ces affiches, dans le strict respect des droits d’auteurs (parce qu’au moins, eux, ils maîtrisent réellement le sujet) : Sans Hadopi

Sans Hadopi
Sans Hadopi *

Regardons le bon côté des choses : grâce à l’Hadopi, place à la création !

* Image en haute résolution