Tag personalizada incorporada em conteúdo dinâmico (tag aninhada) sem renderização

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Tag personalizada incorporada em conteúdo dinâmico (tag aninhada) sem renderização.

Tenho uma página que extrai conteúdo dinâmico de um javabean e passa a lista de objetos para uma tag customizada para processamento em html.Dentro de cada objeto há um monte de HTML para saída que contém uma segunda tag personalizada que eu gostaria que também fosse renderizada.O problema é que a invocação da tag é renderizada como texto simples.

Um exemplo pode me servir melhor.

1 Extraia informações de um banco de dados e retorne-as à página por meio de um javabean.Envie essas informações para uma tag personalizada para saída.

<jsp:useBean id="ImportantNoticeBean" scope="page" class="com.mysite.beans.ImportantNoticeProcessBean"/>  <%-- Declare the bean --%>
<c:forEach var="noticeBean" items="${ImportantNoticeBean.importantNotices}"> <%-- Get the info --%>
    <mysite:notice importantNotice="${noticeBean}"/> <%-- give it to the tag for processing --%>
</c:forEach>

esta tag deve gerar uma box div assim

*SNIP* class for custom tag def and method setup etc
out.println("<div class=\"importantNotice\">");
out.println("   " + importantNotice.getMessage());
out.println("   <div class=\"importantnoticedates\">Posted: " + importantNotice.getDateFrom() + " End: " + importantNotice.getDateTo()</div>");
out.println("   <div class=\"noticeAuthor\">- " + importantNotice.getAuthor() + "</div>");
out.println("</div>");
*SNIP*

Isso fica bom e conforme o esperado

<div class="importantNotice">
    <p>This is a very important message. Everyone should pay attenton to it.</p>
    <div class="importantnoticedates">Posted: 2008-09-08 End: 2008-09-08</div>
    <div class="noticeAuthor">- The author</div>
</div>

2 Se, no exemplo acima, por exemplo, eu tivesse uma tag personalizada na string importantNotice.getMessage():

*SNIP* "This is a very important message. Everyone should pay attenton to it. <mysite:quote author="Some Guy">Quote this</mysite:quote>" *SNIP*

O aviso importante é renderizado corretamente, mas a tag de citação não será processada e simplesmente inserida na string e colocada como tag de texto simples/html.

<div class="importantNotice">
    <p>This is a very important message. Everyone should pay attenton to it. <mysite:quote author="Some Guy">Quote this</mysite:quote></p>
    <div class="importantnoticedates">Posted: 2008-09-08 End: 2008-09-08</div>
    <div class="noticeAuthor">- The author</div>
</div>

Em vez de

<div class="importantNotice">
    <p>This is a very important message. Everyone should pay attenton to it. <div class="quote">Quote this <span class="authorofquote">Some Guy</span></div></p>    // or wahtever I choose as the output
    <div class="importantnoticedates">Posted: 2008-09-08 End: 2008-09-08</div>
    <div class="noticeAuthor">- The author</div>
</div>

Eu sei que isso tem a ver com processadores e pré-processadores, mas não tenho certeza de como fazer isso funcionar.

Foi útil?

Solução

Apenas usando

<bodycontent>JSP</bodycontent>

não é o suficiente.Você deveria fazer algo como

JspFragment body = getJspBody(); 
StringWriter stringWriter = new StringWriter(); 
StringBuffer buff = stringWriter.getBuffer(); 
buff.append("<h1>"); 
body.invoke(stringWriter); 
buff.append("</h1>"); 
out.println(stringWriter);

para obter tags internas renderizadas (o exemplo é para o método SimpleTag doTag).

No entanto, no código da pergunta, vejo que a tag interna vem de uma string que não é renderizada como parte do JSP, mas apenas de uma string aleatória.Não acho que você possa forçar o tradutor JSP a analisá-lo.

Você pode usar regexp no seu caso ou tentar redesenhar seu código de forma a ter um jsp como este:

<jsp:useBean id="ImportantNoticeBean" scope="page class="com.mysite.beans.ImportantNoticeProcessBean"/>
<c:forEach var="noticeBean" items="${ImportantNoticeBean.importantNotices}">
    <mysite:notice importantNotice="${noticeBean}">
        <mysite:quote author="Some Guy">Quote this</mysite:quote>
        <mysite:messagebody author="Some Guy" />
    </mysite:notice>
</c:forEach>

Eu deveria ir com regexp.

Outras dicas

Eu estaria inclinado a mudar a "arquitetura da sua marcação", pois os dados que você deseja obter não devem ser por tag no interior da classe, pois é uma "marcação" projetada para uma página (embora na obscuridade é possível obter o thread do programa de avaliação do mecanismo JSP Servlet).

O que você provavelmente acharia melhor e mais dentro do procedimento padrão seria usar "tags cooperantes" com BodyTagSupport extensão e retorno de classe EVAL_BODY_BUFFERED no método doStartTag() para repetir o processo do corpo e/ou compartilhamento de objetos, como armazenamento de dados recuperados na hierarquia de aplicativos da sessão ou na sessão do usuário.

Ver tutorial de tags personalizadas do oracle j2ee Para maiores informações.

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