Pode incluir um jsp em uma classe personalizada TagSupport, e especificar onde o corpo deve ir?

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

  •  22-08-2019
  •  | 
  •  

Pergunta

Eu quero usar marcas personalizadas jsp para ajudar a construir um menu em meu aplicativo. No entanto, quero todo o HTML real para viver em arquivos JSP, em vez de na classe Java.

Assim, suponha que eu tenho uma tag como esta:

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

Eu, então, pode ter a classe para o meu tag Menu, que se parece com isso:

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

Meu arquivo menu.jsp, que é o wrapper para o próprio menu, em seguida, pode ter esta aparência:

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

O que eu quero fazer é colocar o corpo da minha tag mytags:Menu, que irá gerar o código HTML para os itens de menu reais, no menu.jsp, entre a abertura e marcas de fechamento. Eu sei que eu poderia dividi-lo em dois arquivos JSP diferentes, um para a marca inicial, e um para a marca de fim, mas que parece desleixado.

É possível fazer isso?

Obrigado!

Foi útil?

Solução

Eu realmente sugiro que você use JSP 2.0 arquivos de marca em vez da abordagem que você sugere. arquivos 2.0 JSP Tag foram criados para resolver problemas como o que você descreve. Combinado com JSTL (e aulas possivelmente java se é realmente complexo), você deve ser capaz de alcançar os mesmos fins, mas com meios mais limpos muito, com uma separação mais agradável tanto de código e apresentação.

Outras dicas

Se cada página em seu webapp precisa o mesmo menu, então você pode considerar Tiles , para a definição < a href = "http://tiles.apache.org/framework/tutorial/pattern.html" rel = "nofollow noreferrer"> Vistas compostas

Você pode criar tag personalizado como ...

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>

Implementação

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

Referência: http://docs.oracle.com/javaee/1.4/tutorial/doc /JSPTags5.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top