Может включить jsp в пользовательский класс TagSupport и указать, куда должно идти тело? - PullRequest
1 голос
/ 10 февраля 2009

Я хочу использовать пользовательские теги jsp для создания меню в моем приложении. Однако я хочу, чтобы весь фактический HTML содержался в файлах JSP, а не в классе Java.

Итак, предположим, у меня есть такой тег:

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

Тогда у меня может быть класс для моего тега Menu, который выглядит следующим образом:

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

Мой menu.jsp файл, который является оболочкой для самого меню, может выглядеть так:

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

То, что я хочу сделать, это поместить тело моего тега mytags:Menu, который будет генерировать HTML для фактических пунктов меню, в menu.jsp, между открывающим и закрывающим тегами. Я знаю, что могу разбить его на два разных jsp-файла, один для начального тега и один для конечного тега, но это выглядит небрежно.

Возможно ли это сделать?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 10 февраля 2009

Я действительно предлагаю вам использовать файлы тегов jsp 2.0 вместо предложенного вами подхода. Файлы тегов Jsp 2.0 были созданы для решения проблем, подобных той, которую вы описываете. В сочетании с jstl (и, возможно, java-классами, если он действительно сложный), вы сможете достичь тех же целей, но с более чистыми средствами, с гораздо более приятным разделением кода и представления.

1 голос
/ 10 февраля 2009

Если каждая страница в вашем веб-приложении нуждается в одном и том же меню, вы можете рассмотреть Плитки для определения Составных представлений

0 голосов
/ 24 апреля 2012

Вы можете создать собственный тег, как ...

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>

Осуществление

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

Ссылка: http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html

...