En el trabajo, he sido encargado de convertir un montón de HTML archivos en un simple JSP proyecto. Es estática, no serverside lógica de programa. Debo mencionar que soy completamente nuevo en Java. Archivos JSP parece que sea fácil trabajar con común incluye y variables, como PHP, pero me gustaría saber una manera sencilla de obtener algo parecido a la herencia de plantillas (Django estilo) o, al menos, ser capaz de tener una base.archivo jsp que contiene el encabezado y el pie de página, así que puede insertar contenido más tarde.

Ben Lings parece ofrecer algo de esperanza en su respuesta aquí:
JSP de la herencia de plantillas
Puede alguien explicar cómo lograr esto?

Dado que no tengo mucho tiempo, creo que el enrutamiento dinámico es un poco mucho, así que estoy feliz de simplemente tener la Url del mapa directamente en .jsp archivos, pero estoy abierto a sugerencias.

Gracias.

edición: no me quiere usar alguna de las librerías externas, porque incrementaría la curva de aprendizaje para mí y otras personas que trabajan en el proyecto, y la empresa para la que trabajo ha sido contratado para ello.

Otra edición: no estoy seguro de si JSP tags será útil, ya que mi contenido realmente no tiene ninguna plantilla de variables. Lo que necesitamos es una manera de ser capaz de hacer esto:

base.html:

<html><body>
{ content.body }
</body></html>

somepage.html

<wrapper:base.html>
<h1>Welcome</h1>
</wrapper>

con el de la salida:

<html><body>
<h1>Welcome</h1>
</body></html>

Creo que esto me daría la suficiente versatilidad para hacer todo lo que necesito. Podría lograrse con includes pero entonces yo tendría una parte superior y una parte inferior para cada contenedor, que es una especie de desorden.

InformationsquelleAutor Scott | 2009-08-18

5 Comentarios

  1. 669

    Como skaffman sugerido, JSP 2.0 Archivos de Etiquetas son la abeja al panal.

    Tomemos su ejemplo sencillo.

    Poner lo siguiente en WEB-INF/tags/wrapper.tag

    <%@tag description="Simple Wrapper Tag" pageEncoding="UTF-8"%>
    <html><body>
      <jsp:doBody/>
    </body></html>

    Ahora en su example.jsp página:

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
    
    <t:wrapper>
        <h1>Welcome</h1>
    </t:wrapper>

    Que hace exactamente lo que piensa.


    Así que, vamos a ampliar en que para algo un poco más general.
    WEB-INF/tags/genericpage.tag

    <%@tag description="Overall Page template" pageEncoding="UTF-8"%>
    <%@attribute name="header" fragment="true" %>
    <%@attribute name="footer" fragment="true" %>
    <html>
      <body>
        <div id="pageheader">
          <jsp:invoke fragment="header"/>
        </div>
        <div id="body">
          <jsp:doBody/>
        </div>
        <div id="pagefooter">
          <jsp:invoke fragment="footer"/>
        </div>
      </body>
    </html>

    Utilizar este:

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
    
    <t:genericpage>
        <jsp:attribute name="header">
          <h1>Welcome</h1>
        </jsp:attribute>
        <jsp:attribute name="footer">
          <p id="copyright">Copyright 1927, Future Bits When There Be Bits Inc.</p>
        </jsp:attribute>
        <jsp:body>
            <p>Hi I'm the heart of the message</p>
        </jsp:body>
    </t:genericpage>

    Lo que hace que comprar? Mucho realmente, pero se pone aún mejor…


    WEB-INF/tags/userpage.tag

    <%@tag description="User Page template" pageEncoding="UTF-8"%>
    <%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
    <%@attribute name="userName" required="true"%>
    
    <t:genericpage>
        <jsp:attribute name="header">
          <h1>Welcome ${userName}</h1>
        </jsp:attribute>
        <jsp:attribute name="footer">
          <p id="copyright">Copyright 1927, Future Bits When There Be Bits Inc.</p>
        </jsp:attribute>
        <jsp:body>
            <jsp:doBody/>
        </jsp:body>
    </t:genericpage>

    Utilizar este:
    (supongamos que tenemos una variable de usuario en la petición)

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
    
    <t:userpage userName="${user.fullName}">
      <p>
        First Name: ${user.firstName} <br/>
        Last Name: ${user.lastName} <br/>
        Phone: ${user.phone}<br/>
      </p>
    </t:userpage>

    Pero parece que te gusta el uso que el usuario detalle de bloque en otros lugares. Así que, vamos a refactorizar es.
    WEB-INF/tags/userdetail.tag

    <%@tag description="User Page template" pageEncoding="UTF-8"%>
    <%@tag import="com.example.User" %>
    <%@attribute name="user" required="true" type="com.example.User"%>
    
    First Name: ${user.firstName} <br/>
    Last Name: ${user.lastName} <br/>
    Phone: ${user.phone}<br/>

    Ahora el ejemplo anterior se convierte en:

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
    
    <t:userpage userName="${user.fullName}">
      <p>
        <t:userdetail user="${user}"/>
      </p>
    </t:userpage>

    La belleza de Etiquetas JSP archivos es la que permite, básicamente, de la etiqueta genérica de marcado y, a continuación, refactorizarlo al contenido de su corazón.

    JSP Tag Files tiene bastante usurpado cosas como Tiles etc., al menos para mí. Me parece mucho más fácil de utilizar como la única estructura que es lo que da, nada preconcebido. Además, usted puede utilizar etiquetas JSP archivos para otras cosas (como el usuario detalle fragmento anterior).

    He aquí un ejemplo que es similar a DisplayTag que he hecho, pero todo esto se hace con los Archivos de Etiquetas (y la Stripes marco, que es el s: etiquetas..). Esto se traduce en una tabla de filas, alternando los colores, la navegación de la página, etc:

    <t:table items="${actionBean.customerList}" var="obj" css_class="display">
      <t:col css_class="checkboxcol">
        <s:checkbox name="customerIds" value="${obj.customerId}"
                    onclick="handleCheckboxRangeSelection(this, event);"/>
      </t:col>
      <t:col name="customerId" title="ID"/>
      <t:col name="firstName" title="First Name"/>
      <t:col name="lastName" title="Last Name"/>
      <t:col>
        <s:link href="/Customer.action" event="preEdit">
          Edit
          <s:param name="customer.customerId" value="${obj.customerId}"/>
          <s:param name="page" value="${actionBean.page}"/>
        </s:link>
      </t:col>
    </t:table>

    De curso de las etiquetas de trabajo con el JSTL tags (como c:if, etc.). La única cosa que no pueden hacer en el cuerpo de un archivo de etiqueta la etiqueta es agregar Java scriptlet código, pero esto no es una limitación como usted podría pensar. Si necesito scriptlet de cosas, acabo de poner la lógica en una etiqueta y colocar la etiqueta. Fácil.

    Así, los archivos de etiquetas puede ser casi cualquier cosa que usted desea ser. En el nivel más básico, es simple de cortar y pegar de refactorización. Coge un trozo de diseño, cortar, hacer algo simple parametrización, y reemplazarlo con una invocación de la etiqueta.

    A un nivel más alto, usted puede hacer sofisticado cosas como esta tabla la etiqueta que tengo aquí.

    • Gracias por este. Es el mejor tutorial que he podido encontrar en JSP archivos de etiquetas, que eran grandes para mí, viniendo de JSF. Ojalá pudiera dar más de un voto.
    • +40millones de dólares. Gracias por explicar lo de 50.000 veces mejor que cualquier mierda de tutorial que he encontrado. Procedentes de los Rieles del mundo y la falta de ERB, esto es exactamente lo que necesito. Usted debe escribir un blog.
    • Muy buen tutorial. Podría compartir con nosotros el código de la etiqueta de la tabla que has hecho? He creado yo mismo hace un tiempo, pero su enfoque es mejor.
    • Muy útil el tutorial, muchísimas gracias! Una pequeña pregunta, sin embargo: cuando usted dice «Si necesito scriptlet de cosas, acabo de poner la lógica en una etiqueta y colocar la etiqueta en.», en realidad significa taglib a la derecha? Porque de lo contrario usted parece decir que scriptlet código no puede ser utilizado en una etiqueta, pero una solución es agregar a un otro de la etiqueta en su lugar!
    • Si crea un archivo de etiqueta de la etiqueta, el contenido de esa etiqueta en el archivo JSP no puede tener scriptlet código: <t:mietiqueta> no scriptlet código aquí </t:mietiqueta>. Pero dentro de la etiqueta de archivo de la aplicación de la etiqueta en sí, que puede tener todo el código scriptlet desea, como cualquier JSP.
    • gracias por tu gran respuesta en primer lugar, tengo una pregunta: ¿cómo lidiar con la etiqueta anidada en jsp archivos de etiquetas? Por ejemplo, en su t:table etiqueta, la t:col debe en una table, entonces, ¿cómo conseguir etiqueta padre al implementar un niño etiqueta?
    • Acabo de cosas de cosas en lugares conocidos dentro de la solicitud, etc. Por ejemplo, el t:table etiqueta puede crear una lista en _tableColumns de la t:col etiqueta rellena. Luego, cuando t:table realiza jsp:doBody, el t:col añadir cosas a la lista, y al final, después de la jsp:doBody, el t:table etiqueta hace las cosas en la lista, entonces se elimina de la solicitud.
    • gracias, he entendido de tu medio, es realmente simple.
    • Nota – parece que el orden de las etiquetas es importante; jsp:atributo debe venir antes de jsp:cuerpo o se obtendrá un error. También tuve que establecer un correspondiente @atributo de la etiqueta para que coincida con jsp:invocar para evitar otro error. El Uso De GlassFish 3.2.2
    • archivos de etiquetas dar realmente un rendimiento pobre, y muy poco de la funcionalidad en comparación con azulejos-3 (pero son grandes si usted no necesita el rendimiento ni las características adicionales, y no hay nada que le impida el uso de ambos – cada uno según sus fuerzas).
    • usted puede elaborar sobre su rendimiento reclamaciones? Actualmente estoy evaluando si ir por el Apache Azulejos de la carretera o JSP 2.x los archivos de etiquetas, y a partir de esta respuesta, parece archivos de etiquetas hace las cosas mucho más fácil, en comparación con el mantenimiento de la tiles.xml archivo(s).
    • Así, en la ERB, que es capaz de definir una plantilla de página para la representación predeterminada, que usa <%= yield %>. Tratando de envolver mi cabeza alrededor de cómo hacer algo similar en JSP etiquetas.
    • Sólo una nota: Obviamente, usted tiene que poner todos los jsp:attribute antes de la jsp:body. Si yo lo hago de la otra manera, un error aleatorio como se describe en la pregunta vinculada aparece. stackoverflow.com/questions/30219719/…
    • Es posible que nos atributos en anexar manera? Por ejemplo yo quiero añadir código javascript a través del código en varios lugares y hacer que al final de la base de diseño

  2. 21

    Me hizo bastante fácil, Django estilo JSP de la herencia de plantillas de la biblioteca de etiquetas.
    https://github.com/kwon37xi/jsp-template-inheritance

    Creo que lo hacen fácil de manejar diseños sin curva de aprendizaje.

    ejemplo de código :

    base.jsp : diseño de

    <%@page contentType="text/html; charset=UTF-8" %>
    <%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%>
    <!DOCTYPE html>
    <html lang="en">
        <head>
            <title>JSP Template Inheritance</title>
        </head>
    
    <h1>Head</h1>
    <div>
        <layout:block name="header">
            header
        </layout:block>
    </div>
    
    <h1>Contents</h1>
    <div>
        <p>
        <layout:block name="contents">
            <h2>Contents will be placed under this h2</h2>
        </layout:block>
        </p>
    </div>
    
    <div class="footer">
        <hr />
        <a href="https://github.com/kwon37xi/jsp-template-inheritance">jsp template inheritance example</a>
    </div>
    </html>

    vista.jsp : contenido

    <%@page contentType="text/html; charset=UTF-8" %>
    <%@ taglib uri="http://kwonnam.pe.kr/jsp/template-inheritance" prefix="layout"%>
    <layout:extends name="base.jsp">
        <layout:put name="header" type="REPLACE">
            <h2>This is an example about layout management with JSP Template Inheritance</h2>
        </layout:put>
        <layout:put name="contents">
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin porta,
            augue ut ornare sagittis, diam libero facilisis augue, quis accumsan enim velit a mauris.
        </layout:put>
    </layout:extends>
  3. 9

    Basado en la misma idea básica como en @Se Hartung‘s respuesta, aquí está mi magia de una etiqueta extensible motor de plantillas. Además, incluye la documentación y un ejemplo 🙂

    WEB-INF/tags/bloque.tag:

    <%--
    The block tag implements a basic but useful extensible template system.
    A base template consists of a block tag without a 'template' attribute.
    The template body is specified in a standard jsp:body tag, which can
    contain EL, JSTL tags, nested block tags and other custom tags, but
    cannot contain scriptlets (scriptlets are allowed in the template file,
    but only outside of the body and attribute tags). Templates can be
    full-page templates, or smaller blocks of markup included within a page.
    The template is customizable by referencing named attributes within
    the body (via EL). Attribute values can then be set either as attributes
    of the block tag element itself (convenient for short values), or by
    using nested jsp:attribute elements (better for entire blocks of markup).
    Rendering a template block or extending it in a child template is then
    just a matter of invoking the block tag with the 'template' attribute set
    to the desired template name, and overriding template-specific attributes
    as necessary to customize it.
    Attribute values set when rendering a tag override those set in the template
    definition, which override those set in its parent template definition, etc.
    The attributes that are set in the base template are thus effectively used
    as defaults. Attributes that are not set anywhere are treated as empty.
    Internally, attributes are passed from child to parent via request-scope
    attributes, which are removed when rendering is complete.
    Here's a contrived example:
    ====== WEB-INF/tags/block.tag (the template engine tag)
    <the file you're looking at right now>
    ====== WEB-INF/templates/base.jsp (base template)
    <%@ page trimDirectiveWhitespaces="true" %>
    <%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
    <t:block>
    <jsp:attribute name="title">Template Page</jsp:attribute>
    <jsp:attribute name="style">
    .footer { font-size: smaller; color: #aaa; }
    .content { margin: 2em; color: #009; }
    ${moreStyle}
    </jsp:attribute>
    <jsp:attribute name="footer">
    <div class="footer">
    Powered by the block tag
    </div>
    </jsp:attribute>
    <jsp:body>
    <html>
    <head>
    <title>${title}</title>
    <style>
    ${style}
    </style>
    </head>
    <body>
    <h1>${title}</h1>
    <div class="content">
    ${content}
    </div>
    ${footer}
    </body>
    </html>
    </jsp:body>
    </t:block>
    ====== WEB-INF/templates/history.jsp (child template)
    <%@ page trimDirectiveWhitespaces="true" %>
    <%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
    <t:block template="base" title="History Lesson">
    <jsp:attribute name="content" trim="false">
    <p>${shooter} shot first!</p>
    </jsp:attribute>
    </t:block>
    ====== history-1977.jsp (a page using child template)
    <%@ page trimDirectiveWhitespaces="true" %>
    <%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
    <t:block template="history" shooter="Han" />
    ====== history-1997.jsp (a page using child template)
    <%@ page trimDirectiveWhitespaces="true" %>
    <%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
    <t:block template="history" title="Revised History Lesson">
    <jsp:attribute name="moreStyle">.revised { font-style: italic; }</jsp:attribute>
    <jsp:attribute name="shooter"><span class="revised">Greedo</span></jsp:attribute>
    </t:block>
    --%>
    <%@ tag trimDirectiveWhitespaces="true" %>
    <%@ tag import="java.util.HashSet, java.util.Map, java.util.Map.Entry" %>
    <%@ tag dynamic-attributes="dynattributes" %>
    <%@ attribute name="template" %>
    <%
    //get template name (adding default .jsp extension if it does not contain
    //any '.', and /WEB-INF/templates/prefix if it does not start with a '/')
    String template = (String)jspContext.getAttribute("template");
    if (template != null) {
    if (!template.contains("."))
    template += ".jsp";
    if (!template.startsWith("/"))
    template = "/WEB-INF/templates/" + template;
    }
    //copy dynamic attributes into request scope so they can be accessed from included template page
    //(child is processed before parent template, so only set previously undefined attributes)
    Map<String, String> dynattributes = (Map<String, String>)jspContext.getAttribute("dynattributes");
    HashSet<String> addedAttributes = new HashSet<String>();
    for (Map.Entry<String, String> e : dynattributes.entrySet()) {
    if (jspContext.getAttribute(e.getKey(), PageContext.REQUEST_SCOPE) == null) {
    jspContext.setAttribute(e.getKey(), e.getValue(), PageContext.REQUEST_SCOPE);
    addedAttributes.add(e.getKey());
    }
    }
    %>
    <% if (template == null) { //this is the base template itself, so render it %>
    <jsp:doBody/>
    <% } else { //this is a page using the template, so include the template instead %>
    <jsp:include page="<%= template %>" />
    <% } %>
    <%
    //clean up the added attributes to prevent side effect outside the current tag
    for (String key : addedAttributes) {
    jspContext.removeAttribute(key, PageContext.REQUEST_SCOPE);
    }
    %>
  4. 4

    Uso azulejos. Me salvó la vida.

    Pero si no se puede, hay la incluyen la etiqueta de, lo que es similar a la de php.

    De la etiqueta de cuerpo en realidad no podría hacer lo que usted necesita, a menos que usted tiene super simple contenido. El cuerpo de la etiqueta se utiliza para definir el cuerpo de un elemento especificado. Echa un vistazo a este ejemplo:

    <jsp:element name="${content.headerName}"   
    xmlns:jsp="http://java.sun.com/JSP/Page">    
    <jsp:attribute name="lang">${content.lang}</jsp:attribute>   
    <jsp:body>${content.body}</jsp:body> 
    </jsp:element>

    Especifica el nombre del elemento, los atributos de un elemento que pueda tener («lang» en este caso) y, a continuación, el texto que va en ella, el cuerpo. Así que si

    • content.headerName = h1,
    • content.lang = fr, y
    • content.body = Heading in French

    La salida sería

    <h1 lang="fr">Heading in French</h1>
  5. -1

    Sé que esta respuesta viene años después de los hechos y ya hay una gran JSP respuesta Se Hartung, pero hay Facelets, incluso se menciona en las respuestas de la pregunta vinculada en la pregunta original.

    Facelets TAN descripción de la etiqueta

    Facelets es un lenguaje basado en XML de la vista de la tecnología para la JavaServer Faces marco. Diseñado específicamente para JSF, Facelets es la intención de ser más simple y más potente alternativa a JSP puntos de vista. Inicialmente un proyecto independiente, la tecnología fue estandarizado como parte de JSF 2.0 y Java EE 6 y ha dejado de utilizar JSP. Casi todos los JSF 2.0 dirigido componente de las bibliotecas no soporte JSP, pero sólo Facelets.

    Tristemente la mejor llano descripción de tutorial que encontré en Wikipedia y no un tutorial en el sitio. De hecho, la sección que describe plantillas incluso a lo largo de las líneas de lo que la pregunta original estaba pidiendo.

    Debido al hecho de que en Java EE 6 ha dejado de utilizar JSP yo recomendaría ir con Facelets a pesar del hecho de que parece no podría ser más necesaria para el poco o ningún aumento de más de JSP.

    • Java EE 6 no ha desaprobado JSP, sólo obsoleto el uso de JSP como el punto de vista de la tecnología para JSF.
    • Ya que en este caso ambos estaban hablando acerca de la tecnología de vista, lo que está mal acerca de haber dicho que es obsoleto?
    • La pregunta no tiene nada que ver con JSF. Es de puro JSP. Su respuesta es el uso de Facelets, que es para JSF.

Dejar respuesta

Please enter your comment!
Please enter your name here