2009-05-13 7 views
4

Ich habe ein JSP-Tag, das ich in meiner JSF/Seam-Anwendung verwenden möchte. Könnte mir bitte jemand eine Anleitung geben, wie ich meine Umgebung dazu bringen kann, das Etikett zu akzeptieren. Kann ich einfach eine Datei faclets * .taglib.xml auf mein altes Tag verweisen oder muss ich eine Komponente schreiben, die das vorherige Tag vielleicht erweitert?Konvertieren eines JSP-Tags in eine JSF-Komponente

Beifall für jede Info, Lee

Antwort

3

Ich würde sehr zurückhaltend sein, zu versuchen und direkt eine JSP-Tag außerhalb eines JSP Kontext aufzurufen. Wie die documentation points out, die Ähnlichkeiten zwischen JSP und Facelets sind ziemlich oberflächlich.

Ein Hack (ich vermute, dass jede Lösung ein Hack sein wird) könnte darin bestehen, die JSP einzuschließen, indem man auf die Servlet-API hinunterwirbelt.

Diese Funktion enthält eine gegebene Ressource unter Verwendung eines 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); 
    } 
    } 

} 

diese Funktion in einer Datei Facelet TagLib WEB-INF/Facelets/include.taglib.xml definiert ist:

<?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> 

Dies wird als eine Bibliothek in der WEB-INF/web.xmlusing a context parameter:

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

Anwendungsbeispiel

JSP includeme.jsp enthalten, werden:

<?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, die die JSP enthält:

die Verwendung
<!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> 

Hinweis von $ {demo: include ('/ includeme.jsp')}, um den Request-Dispatcher aufzurufen (die Funktion gibt einen leeren String zurück). Die Funktion ist im Attribut enthalten. Xmlns: demo = "http: // demo". Die Anforderungsbereichsvariable foo ist an das Textfeld gebunden und wird von der JSP aufgenommen.


Alles, was ich dazu sagen kann ist, dass es für mich gearbeitet und es gibt wahrscheinlich ein Dutzend Gründe, warum es nicht mit einer bestimmten Kombination von Tags funktionieren würde, oder bei bestimmten Kombinationen von JSF-Bibliotheken. Vorbehaltsteller

+0

Danke für die Antwort. Sieht so aus, als müsste ich einfach den Hit nehmen und JSF als Komponenten gut erstellen. –

+0

Wenn ich versuche, den requestDispatcher in Icefaces zu bekommen, bekomme ich eine nicht unterstützte Ausnahme .... gibt es eine andere Möglichkeit, es zu bekommen –