Peut inclure un jsp dans une classe TagSupport personnalisée et spécifiez où le corps doit aller?

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

  •  22-08-2019
  •  | 
  •  

Question

Je veux utiliser des balises personnalisées jsp pour aider à construire un menu dans mon application. Cependant, je veux tout le code HTML réel de vivre dans des fichiers JSP, plutôt que dans la classe Java.

Alors, supposons que j'ai un tag comme ceci:

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

Je pourrais alors la classe pour mon tag Menu, qui ressemble à ceci:

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

Mon fichier menu.jsp, qui est l'enveloppe pour le menu lui-même, alors pourrait ressembler à ceci:

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

Ce que je veux faire est de mettre le corps de mon étiquette mytags:Menu, qui va générer le code HTML pour les éléments de menu réels, dans le menu.jsp, entre les balises d'ouverture et de fermeture. Je sais que je pouvais le casser en deux fichiers jsp différents, l'un pour la balise de début et une pour la balise de fin, mais qui semble bâclée.

Est-il possible de le faire?

Merci!

Était-ce utile?

La solution

Je suggère vraiment que vous utilisez jsp 2.0 fichiers tag au lieu de l'approche que vous proposez. Jsp 2.0 fichiers de tags ont été créés pour répondre à des problèmes comme celui que vous décrivez. Combiné avec jstl (et peut-être des classes Java si elle est vraiment complexe), vous devriez être en mesure d'atteindre les mêmes fins, mais avec des moyens plus propres, avec une séparation beaucoup plus agréable de code et de présentation.

Autres conseils

Si chaque page de votre webapp a besoin du même menu, vous pouvez envisager Carreaux , pour définir < a href = "http://tiles.apache.org/framework/tutorial/pattern.html" rel = "nofollow noreferrer"> Vues composites

Vous pouvez créer des balises personnalisées comme ...

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>

Mise en œuvre

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

Référence: http://docs.oracle.com/javaee/1.4/tutorial/doc /JSPTags5.html

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