Question

J'ai une balise JSP que je voudrais utiliser dans mon application JSF / Seam. Quelqu'un pourrait-il s'il vous plaît me donner quelques conseils à obtenir mon environnement pour accepter l'étiquette. Puis-je simplement un faclets fichier * .taglib.xml à mon ancienne étiquette ou dois-je besoin d'écrire un composant extension de la balise précédente peut-être?

Vive toute information, Lee

Était-ce utile?

La solution

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

Une bidouille (je pense que toute solution va être un hack) pourrait être d'inclure la JSP par coulée vers l'API 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é comme une bibliothèque dans le WEB-INF / web.xml à l'aide d'un paramètre de contexte :

  <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 invoquer le régulateur de demande (la fonction retourne une chaîne vide). La fonction est incluse par l'attribut xmlns: demo = "http: // demo" . La variable périmètre de la requête foo est lié au champ de texte et repris 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top