2009-02-10 5 views
1

Je veux utiliser des balises jsp personnalisées pour aider à construire un menu dans mon application. Cependant, je veux que tout le HTML actuel vive dans les fichiers JSP, plutôt que dans la classe Java.Peut inclure un jsp dans une classe TagSupport personnalisée, et spécifier où le corps devrait aller?

Ainsi, 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 le wrapper 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 ma balise 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 pourrais le décomposer en deux fichiers jsp différents, un pour la balise de début, et un pour la balise de fin, mais cela semble bâclé.

Est-ce possible?

Merci!

Répondre

2

Je vous suggère vraiment d'utiliser jsp 2.0 tag files au lieu de l'approche que vous suggérez. Les fichiers JSP 2.0 ont été créés pour résoudre des problèmes tels que celui que vous décrivez. Combiné avec jstl (et éventuellement les classes java si c'est vraiment complexe), vous devriez être capable d'atteindre les mêmes fins mais avec des moyens beaucoup plus propres, avec une séparation beaucoup plus agréable du code et de la présentation.

0

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 oeuvre

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

Questions connexes