Frage

Ich habe einen JSP-Tag bekommt, Ich mag würde in meiner JSF / Seam-Anwendung verwenden. Könnte jemand geben Sie mir meine Umgebung einige Hinweise bitte immer den Tag zu übernehmen. Kann ich eine faclets * .taglib.xml Datei auf meinem alten Tag gerade Punkt oder muss ich vielleicht den vorherigen Tag erstreckt, um eine Komponente schreiben?

Prost für jede Info, Lee

War es hilfreich?

Lösung

würde ich sehr zurückhaltend sein, zu versuchen und direkt eine JSP-Tag außerhalb eines JSP Kontext aufzurufen. Da die Dokumentation weist darauf hin, , die Ähnlichkeiten zwischen JSP und Facelets sind ziemlich oberflächlich.

Ein Hack (ich vermute, dass jede Lösung ein Hack sein wird) könnte sein, die JSP zu schließen, indem bis auf den Servlet-API zu werfen.

Diese Funktion enthält eine bestimmte Ressource eine Request :

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 ist in einer Facelet taglib-Datei definiert ist 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>

Dies wird als eine Bibliothek in der WEB-INF / web.xml ein Kontextparameter mit:

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

Beispiel für die Verwendung

JSP aufgenommen werden, 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 das schließt die 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>

Beachten Sie die Verwendung von $ {Demo: include ( '/ includeme.jsp')} die Anfrage Dispatcher aufrufen (die Funktion gibt einen leeren String). Die Funktion wird durch den Attribut enthalten xmlns: Demo = "http: // Demo" . Der Antrag Umfang Variable foo wird in das Textfeld gebunden und nahm von der JSP-up.


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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top