Domanda

Personalizzato incorporato-tag di contenuto dinamico (nested tag) non di rendering.

Ho una pagina che tira contenuto dinamico da un javabean e passa elenco di oggetti da un tag personalizzato per la trasformazione in html.All'interno di ogni oggetto è un gruppo di html di output che contiene un secondo tag personalizzato che vorrei anche essere reso.Il problema è che il tag invocazione viene visualizzato come testo normale.

Un esempio può servire meglio di me.

1 Estrarre informazioni da un database e tornare alla pagina tramite un javabean.Inviare queste informazioni per un tag personalizzato per l'output.

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

questo tag deve emettere una scatola div piace così

*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*

Questo rende bene e come previsto

<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, nell'esempio qui sopra, per esempio, dovessi avere un tag personalizzato in importantNotice.getMessage() Stringa:

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

L'importante avviso rende bene, ma la citazione tag non saranno elaborati e semplicemente inserito la stringa e mettere come testo normale/tag 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>

Piuttosto che

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

So che questo ha a che fare con processori e pre-processori, ma io non sono sicuro di come fare questo lavoro.

È stato utile?

Soluzione

Usando solo

<bodycontent>JSP</bodycontent>

non è abbastanza.Si dovrebbe fare come soimething

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

per ottenere interiore tag reso (l'esempio è per SimpleTag doTag metodo).

Tuttavia, la questione del codice vedo che interiore tag è venuta da una stringa che non è reso come una parte di JSP, ma solo alcuni stringa casuale.Non credo che si può forzare JSP traduttore di analizzarlo.

È possibile utilizzare regexp nel vostro caso o provare a ridisegnare il tuo codice in modo da avere una jsp come questo:

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

Mi deve andare con le regexp.

Altri suggerimenti

Sarei propenso a cambiare "l'architettura del tag" a che i dati che si desidera raggiungere non dovrebbe essere un tag all'interno della classe come "markup", progettato per una pagina(anche se nell'oscurità è possibile ottenere la valutazione thread programma di JSP Servlet engine).

Che cosa si sarebbe probabilmente trovare di meglio e di più all'interno di una procedura standard è l'utilizzo di "cooperare tag" con BodyTagSupport classe di estensione e ritorno EVAL_BODY_BUFFERED in doStartTag() metodo per ripetere il processo il corpo e/o oggetto di condivisione come la memorizzazione di retrived dati nella gerarchia di applicazione della sessione o della sessione per l'utente.

Vedere oracle j2ee tag personalizzati tutorial per ulteriori informazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top