JSP Custom 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
Это возможно? Как?
Благодарю.
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, но я верю, что он все равно должен работать в других контекстах. Если это не так, я хотел бы знать:)
НТН
Что вам действительно нужно иметь это:
<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 установлено значение 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-теги в строку.