سؤال

قل لدي 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 اختياريا إلى السلسلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top