septembre
2008
Hier, j’ai travaillé sur 4 fichiers tag de mon framework.
Un fichier tag permet de créer une nouvelle balise executant du code Java. Par exemple insérer dans un fichier JSP :
<robusta:auth controller=${usercontroller}/>
va lancer un code permettant de récupérer dans une variable authValue au choix le cookie authtoken ou le header Authorization et d’appliquer au Controller la fonction setAuthorizationValue(authValue).
Il existe deux grandes techniques pour écrire un fichier tag :
– créer une classe implémentant l’interface Tag
– créer un fichier mélant XML et code Java.
Par exemple :
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ variable name-given="auth" scope="AT_END" %>
<%@attribute name="mypage" rtexprvalue="true" type="javax.servlet.jsp.PageContext" required="true"%>
<% /* Code JAVA */
String autho = "not found";
javax.servlet.http.HttpServletRequest myrequest =(HttpServletRequest) mypage.getRequest();
(...)
mypage.setAttribute("autho",authorizationValue, mypage.REQUEST_SCOPE);
%>
<c:set var="auth" value="${autho}"/>
La première solution :
– requiert un fichier .java, écrit 100% en Java objet
– necessite une configuration dans un fichier xml séparé (le .tld pourr les intimes)
– le fichier .java est rangé où on le souhaite
– le .tld est rangé dans /META-INF/ ou /WEB-INF/, et est analysé par Ant ou Maven lors du build
– Lorsque le serveur traduit la jsp, il associe facilement la classe Tag
la deuxième solution :
– requiert un fichier .tag mixant la configuration et du java
– le .tld est facultatif
– le .tag doit se trouver dans /WEB-INF/tags
– le serveur traduit le .tag en même temps que la jsp, le fichier .java correct.
J’ai une nette préférence pour la deuxième solution, car elle est plus souple à manipuler et j’ai choisit le JSP plutôt que le PHP, pour la facilité d’utilisation du XML.
Par contre, il me semble impossible de distribuer proprement ces fichiers .tag dans un beau fichier .jar. Cela oblige tout programmeur souhaitant utiliser mes .tag de les copier dans leur répertoire /WEB-INF/tags. Et lorsque je modifie un de mes .tag, je dois les copier dans tous les WEB-INF de mes différents Web Services.
Par comparaison, lorsque je modifie mes classes utilitaires de mon framework (une classe sur les List par exemple), tous mes web services sont mis à jour avec un clean & build.
Une belle bibliothèque .jar avec des classes implémentant Tag peut donc se recompiler proprement, et rend la distribution bien plus propre.
Objet :1 – XML : 0
Je t’ai répondu sur le forum : http://www.developpez.net/forums/d616209/java/developpement-web-java/servlets-jsp/taglibs/distribuer-fichiers-tag-taglib-jar/
C’est tout à fait possible d’intégrer un fichier *.tag dans un jar, et de le déclarer dans le tld
a++
Personnellement j’utilise la première solution quand je doit écrire un Tag qui contient beaucoup de code Java.
La seconde solution est très pratique pour écrire des tags ou il y a une majorité de HTML. On peut bien sur utiliser dans les .tag d’autre tag (JSTL, …) et donc se passer complètement du Java dedans.