JSP Custom 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
Это осуществимо? Как?
Спасибо.
Решение
Тиаго, я не знаю, как решить твою точный Проблема, но вы можете интерпретировать код 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
Другие советы
Вам действительно нужно иметь это:
<mytaglib:doSomething>
<c:out value="My enclosed tag"/>
Test
</mytaglib:doSomething>
и измените свой дотгаг на что -то подобное
@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 установлено на JSP в TLD:
<bodycontent>JSP</bodycontent>
Почему вы пишете тег JSTL в своем методе Dotag? Println напрямую входит в скомпилированный JSP (Read: Servlet), когда он будет отображаться в браузере, он будет напечатан, как это так, поскольку Teh Browser не понимает тегов JSTL.
public class MyTaglib extends SimpleTagSupport {
@Override public void doTag() throws JspException, IOException {
getJspContext().getOut().println("My enclosed tag");
getJspBody().invoke(null);
}
}
При желании можно добавить теги HTML в строку.