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
هل هذا ممكن؟ كيف؟
شكرًا.
المحلول
تياجو ، لا أعرف كيف أحل بالضبط مشكلة ولكن يمكنك تفسير رمز 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 المترجمة (اقرأ: 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 اختياريا إلى السلسلة.