Domanda

Ho un tag JSP che vorrei utilizzare nella mia JSF / applicazione Seam. Qualcuno potrebbe darmi qualche indicazione a ottenere mio ambiente di accettare il tag. Posso solo sottolineare un faclets file * .taglib.xml al mio vecchio tag o devo scrivere un componente che si estende il tag precedente, forse?

Applausi per qualsiasi informazione, Lee

È stato utile?

Soluzione

Sarei molto riluttante a provare e direttamente richiamare un tag JSP di fuori di un contesto JSP. Come il documentazione sottolinea , le somiglianze tra JSP e Facelets sono piuttosto superficiali.

Una trucco (ho il sospetto che qualsiasi soluzione sta per essere un hack) potrebbe essere quella di includere il JSP lanciando verso il basso per l'API servlet.

Questa funzione include una data risorsa utilizzando 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);
    }
  }

}

Questa funzione è definita in un file di 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>

Questa è specificato come una libreria nel WEB-INF / web.xml utilizzando un parametro di contesto :

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

Utilizzo Esempio

JSP da includere, 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 che comprende 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>

Si noti l'uso di $ {demo: include ( '/ includeme.jsp')} per invocare il dispatcher richiesta (la funzione restituisce una stringa vuota). La funzione è compresa dai attributo xmlns: demo = "http: // demo" . La variabile richiesta di portata pippo è destinata a campo di testo e raccolto dal JSP.


Tutto quello che posso dire su questo è che ha funzionato per me e ci sono probabilmente una dozzina di ragioni per cui non avrebbe funzionato con una certa combinazione di tag, o con alcune combinazioni di librerie JSF. Caveat emptor.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top