Скажите, что у меня есть свой пользовательский 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
Действительно ли это выполнимо? Как?
Спасибо.
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
вам действительно нужно следующее:
<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>
Почему вы пишете тег 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-теги к строке.