2009-05-13 7 views
4

J'ai une balise JSP que j'aimerais utiliser dans mon application JSF/Seam. Quelqu'un pourrait-il me donner des conseils pour que mon environnement accepte l'étiquette? Puis-je simplement pointer un fichier facettes * .taglib.xml sur mon ancienne balise ou dois-je écrire un composant qui étend la balise précédente peut-être?Conversion d'une balise JSP en composant JSF

Vive toute information, Lee

Répondre

3

Je serais très réticent à essayer et appeler directement une balise JSP en dehors d'un contexte JSP. Comme le documentation points out, les similitudes entre JSP et Facelets sont assez superficielles.

Un piratage (je soupçonne que toute solution va être un hack) pourrait être d'inclure le JSP en effectuant un cast vers l'API de servlet.

Cette fonction comprend une ressource donnée à l'aide d'un RequestDispatcher:

public class Includer { 

    public static String include(String resource) { 
    FacesContext context = FacesContext 
     .getCurrentInstance(); 
    ExternalContext ext = context.getExternalContext(); 
    include(ext.getContext(), ext.getRequest(), ext 
     .getResponse(), resource); 
    return ""; 
    } 

    private static void include(Object context, 
     Object request, Object response, String resource) { 
    ServletContext servletContext = (ServletContext) context; 
    ServletRequest servletRequest = (ServletRequest) request; 
    ServletResponse servletResponse = (ServletResponse) response; 
    RequestDispatcher dispatcher = servletContext 
     .getRequestDispatcher(resource); 
    try { 
     dispatcher.include(servletRequest, servletResponse); 
    } catch (IOException e) { 
     throw new FacesException(e); 
    } catch (ServletException e) { 
     throw new FacesException(e); 
    } 
    } 

} 

Cette fonction est définie dans un fichier taglib Facelet WEB-INF/facelets/include.taglib.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE facelet-taglib PUBLIC 
    "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" 
    "http://java.sun.com/dtd/facelet-taglib_1_0.dtd"> 
<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet"> 
    <namespace>http://demo</namespace> 
    <function> 
    <function-name>include</function-name> 
    <function-class>inc.Includer</function-class> 
    <function-signature> 
     java.lang.String include(java.lang.String) 
    </function-signature> 
    </function> 
</facelet-taglib> 

Ceci est spécifié en tant que bibliothèque dans le fichier WEB-INF/web.xmlusing a context parameter:

<context-param> 
    <param-name>facelets.LIBRARIES</param-name> 
    <param-value>/WEB-INF/facelets/include.taglib.xml</param-value> 
    </context-param> 

Exemple d'utilisation

JSP à inclure, includeme.jsp:

<?xml version="1.0" encoding="UTF-8" ?> 
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"> 
    <jsp:directive.page language="java" 
    contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" /> 
    <b>Some data: ${foo}</b> 
</jsp:root> 

Facelet qui comprend la JSP:

<!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" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:demo="http://demo"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title>JSP include hack</title> 
</head> 
<body> 
<h:form> 
    <p> ${demo:include('/includeme.jsp')} </p> 
    <h:inputText type="text" value="#{foo}" /> 
    <h:commandButton type="submit" /> 
</h:form> 
</body> 
</html> 

Notez l'utilisation de $ {demo: include ('/ includeme.jsp')} pour appeler le répartiteur de demande (la fonction renvoie une chaîne vide). La fonction est incluse dans l'attribut xmlns: demo = "http: // demo". La variable de portée de demande foo est liée au champ de texte et récupérée par la JSP.


Tout ce que je peux dire à ce sujet est que cela a fonctionné pour moi et il y a probablement une douzaine de raisons pour lesquelles il ne fonctionnerait pas avec une certaine combinaison de balises, ou avec certaines combinaisons de bibliothèques JSF. Caveat emptor.

+0

Merci pour la réponse. On dirait que je vais juste devoir prendre le coup et créer JSF en tant que composants bien. –

+0

Lorsque j'essaie d'obtenir le requestDispatcher dans Icefaces, je reçois une exception non supportée .... existe-t-il une autre façon de l'obtenir? –