Puede incluir una JSP en una clase TagSupport personalizado y especificar el lugar donde el cuerpo debe ir?

StackOverflow https://stackoverflow.com/questions/533405

  •  22-08-2019
  •  | 
  •  

Pregunta

Quiero usar etiquetas JSP personalizadas para ayudar a construir un menú en mi solicitud. Sin embargo, quiero que todo el HTML real que viven en los archivos JSP, en lugar de en la clase de Java.

Así, supongamos que tengo una etiqueta como esta:

<mytags:Menu>
  <mytags:MenuItem name="foo"/>
  <mytags:MenuItem name="bar"/>
  <mytags:MenuItem name="baz"/>
</mytags:Menu>

Entonces podría tener la clase de mi etiqueta de Menu, que se ve así:

public class MenuPill extends TagSupport {
    public int doStartTag() throws JspException {
        try {
            pageContext.include("/menu/menu.jsp");
        } catch (ServletException e) {
            throw new JspException(e);
        } catch (IOException e) {
            throw new JspException(e);
        }
        return super.doStartTag();
    }
}

Mi archivo menu.jsp, que es el contenedor para el menú en sí, entonces podría tener este aspecto:

<div id="menu>
  <%somehow include the body here%>
</div>

Lo que quiero hacer es poner el cuerpo de mi etiqueta mytags:Menu, lo que generará el código HTML para los elementos de menú reales, en el menu.jsp, entre la apertura y cierre de etiquetas. Sé que podría dividirla en dos archivos JSP diferentes, uno para la etiqueta de inicio, y otro para la etiqueta final, pero que parece descuidado.

¿Es posible hacer esto?

Gracias!

¿Fue útil?

Solución

Realmente sugiero que utilice JSP 2.0 archivos de etiquetas en lugar del enfoque que usted sugiere. JSP 2.0 archivos de etiquetas fueron creados para hacer frente a problemas como el que usted describe. Combinado con jstl (y posiblemente clases de Java si es realmente complejo), que debe ser capaz de lograr los mismos objetivos pero con medios mucho más limpio, con una separación mucho más agradable de código y presentación.

Otros consejos

Si cada página de su aplicación web necesita el mismo menú, entonces usted podría considerar Azulejos , para definir < a href = "http://tiles.apache.org/framework/tutorial/pattern.html" rel = "nofollow noreferrer"> Composite Vistas

Se pueden crear etiquetas personalizadas como ...

template.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
  <tlib-version>1.0</tlib-version>
  <short-name>template</short-name>
  <uri>/template</uri>
  <tag-file>
    <name>block</name>
    <path>/META-INF/tags/template/block.tag</path>
  </tag-file>
  <tag-file>
    <name>stringBlock</name>
    <path>/META-INF/tags/template/stringBlock.tag</path>
  </tag-file>
</taglib>

La aplicación

<%@tag import="org.mentawai.template.*" pageEncoding="UTF-8"%>
<%@attribute name="id" required="true"%>

<%
  Page page = (Page)request.getAttribute(TemplateServlet.PAGE_ATTR);
  Page block = page.getBlock(id);
  String view = "";
  if (block == null) {
      throw new ServletException("Block " + id + " doesn't exists");
  }
  request.setAttribute(TemplateServlet.PAGE_ATTR, block);
  view = block.getView();
  TemplateServlet.executeListener(block, request, response, application);

  String oldView = (String)request.getAttribute("_view");
  request.setAttribute("_view", "/" + view);
%>

<jsp:include page="${_view}" flush="true"/>

<%
  request.setAttribute("_view", oldView);
  request.setAttribute(TemplateServlet.PAGE_ATTR, page);
%>

Referencia: http://docs.oracle.com/javaee/1.4/tutorial/doc /JSPTags5.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top