Può includere un jsp in una classe TagSupport personalizzato, e specificare dove il corpo dovrebbe andare?

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

  •  22-08-2019
  •  | 
  •  

Domanda

Voglio usare tag JSP personalizzati per aiutare a costruire un menu nella mia applicazione. Tuttavia, voglio tutto il codice HTML effettivo di vivere in file JSP, piuttosto che nella classe Java.

Quindi, supponiamo di avere un tag in questo modo:

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

Ho poi può avere la classe per il mio tag Menu, che assomiglia a questo:

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();
    }
}

Il mio file menu.jsp, che è il wrapper per il menu stesso, quindi potrebbe essere simile a questo:

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

Quello che voglio fare è mettere il corpo del mio tag mytags:Menu, che genererà il codice HTML per le voci di menu effettivi, nel menu.jsp, tra il tag di apertura e di chiusura. So che potrei suddividerlo in due diversi file JSP, una per il tag di apertura e uno per il tag di chiusura, ma che sembra sciatto.

E 'possibile fare questo?

Grazie!

È stato utile?

Soluzione

Vi consiglio di usare jsp 2.0 file tag invece dell'approccio lei suggerisce. Jsp file di tag 2.0 sono stati creati per affrontare i problemi come quello che descrivi. In combinazione con JSTL (e possibilmente classi Java se è davvero complesso), si dovrebbe essere in grado di raggiungere gli stessi scopi, ma con mezzi molto più pulito, con una separazione molto più bello di codice e presentazione.

Altri suggerimenti

Se ogni pagina del webapp ha bisogno lo stesso menu, allora si potrebbe considerare Tiles , per la definizione di < a href = "http://tiles.apache.org/framework/tutorial/pattern.html" rel = "nofollow noreferrer"> composite Visualizzazioni

È possibile creare tag personalizzato come ...

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>

Implementazione

<%@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);
%>

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

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