Kann eine jsp in einer benutzerdefinierten TagSupport Klasse gehört, und angeben, wo sollte der Körper gehen?

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

  •  22-08-2019
  •  | 
  •  

Frage

Ich mag benutzerdefinierte JSP-Tags verwenden, um ein Menü in meiner Anwendung zu erstellen. Allerdings möchte ich alle der eigentliche HTML-Code in JSP-Dateien zu leben, anstatt in der Java-Klasse.

Also, nehme ich habe einen Tag wie folgt:

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

ich dann könnte die Klasse für meinen Menu-Tag, das wie folgt aussieht:

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

Meine menu.jsp-Datei, die der Wrapper für das Menü selbst ist, dann aussehen könnte wie folgt aus:

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

Was ich tun möchte, um den Körper meines mytags:Menu-Tag legen, die den HTML-Code für die eigentlichen Menüpunkte generieren, in die menu.jsp, zwischen dem Öffnen und Schließen-Tags. Ich weiß, ich könnte es brechen in zwei verschiedene jsp Dateien, ein für den Start-Tag, und einem für den End-Tag, aber das scheint schlampig.

Ist es möglich, dies zu tun?

Danke!

War es hilfreich?

Lösung

ich wirklich empfehlen Ihnen, jsp 2.0 Tag-Dateien anstelle der Ansatz vorschlagen, dass Sie. Jsp 2.0 Tag-Dateien erstellt wurden Probleme wie die Adresse beschreiben. In Kombination mit jstl (und möglicherweise Java-Klassen, wenn es wirklich komplex ist), sollten Sie in der Lage sein, die gleichen Ziele zu erreichen, aber mit vielen sauberen Mitteln, mit einer viel schönen Trennung von Code und Präsentation.

Andere Tipps

Wenn jede Seite in Ihrem Webapp das gleiche Menü benötigt, dann könnten Sie Fliesen betrachten, für die Definition < a href = "http://tiles.apache.org/framework/tutorial/pattern.html" rel = "nofollow noreferrer"> Composite-Ansichten

Sie können benutzerdefinierten Tag wie ...

erstellen

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>

Die Umsetzung

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

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top