JSP пользовательский Taglib: вложенная оценка

Скажите, что у меня есть свой пользовательский taglib:

<%@ taglib uri="http://foo.bar/mytaglib" prefix="mytaglib"%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>

<mytaglib:doSomething>
  Test
</mytaglib:doSomething>

В taglib классе я должен обработать шаблон и сказать JSP переоценивать свой вывод, так например, если у меня есть это:

public class MyTaglib extends SimpleTagSupport {

  @Override public void doTag() throws JspException, IOException {
    getJspContext().getOut().println("<c:out value=\"My enclosed tag\"/>");
    getJspBody().invoke(null);
  }
}

Вывод, который я имею:

<c:out value="My enclosed tag"/>
Test

Когда я на самом деле должен произвести это:

My enclosed tag
Test

Действительно ли это выполнимо? Как?

Спасибо.

6
задан Tiago Fernandez 24 February 2010 в 15:08
поделиться

3 ответа

Tiago, я не знаю, как решить вашу точную проблему, но вы можете интерпретировать код JSP из файла. Просто создайте RequestDispatcher и включите JSP:

    public int doStartTag() throws JspException {
    ServletRequest request = pageContext.getRequest();
    ServletResponse response = pageContext.getResponse();

    RequestDispatcher disp = request.getRequestDispatcher("/test.jsp");
    try {
        disp.include(request, response);
    } catch (ServletException e) {
        throw new JspException(e);
    } catch (IOException e) {
        throw new JspException(e);
    }
    return super.doStartTag();
}

Я протестировал этот код в портлете Liferay, но я полагаю, что он должен работать в других контекстах в любом случае. Если это не так, я хотел бы знать :)

HTH

2
ответ дан 17 December 2019 в 18:15
поделиться

вам действительно нужно следующее:

<mytaglib:doSomething>
  <c:out value="My enclosed tag"/>
  Test
</mytaglib:doSomething>

и измените свой doTag на что-то вроде этого

@Override public void doTag() throws JspException, IOException {
try {
   BodyContent bc = getBodyContent();
   String body = bc.getString();
   // do something to the body here.
   JspWriter out = bc.getEnclosingWriter();
   if(body != null) {
     out.print(buff.toString());
   }
 } catch(IOException ioe) {
   throw new JspException("Error: "+ioe.getMessage());
 }
}

убедитесь, что для содержимого jsp body установлено значение jsp в tld:

<bodycontent>JSP</bodycontent>
1
ответ дан 17 December 2019 в 18:15
поделиться

Почему вы пишете тег JSTL внутри метода doTag? Println непосредственно идет в скомпилированный JSP (читай: сервлет) Когда это будет отображено в браузере, оно будет напечатано как есть, поскольку браузер не понимает JSTL-теги.

public class MyTaglib extends SimpleTagSupport {
      @Override public void doTag() throws JspException, IOException {
        getJspContext().getOut().println("My enclosed tag");
        getJspBody().invoke(null);
      }
    }

В качестве опции вы можете добавить HTML-теги к строке.

0
ответ дан 17 December 2019 в 18:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: