簡體   English   中英

JSP Custom Taglib:嵌套評估

[英]JSP Custom Taglib: Nested Evaluation

說我有我的自定義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 portlet中測試了這段代碼,但我相信它應該適用於其他環境。 如果沒有,我想知道:)

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());
 }
}

確保在tld中將jsp body內容設置為jsp:

<bodycontent>JSP</bodycontent>

為什么要在doTag方法中編寫JSTL標記? println直接進入已編譯的JSP(讀取:servlet)當它在瀏覽器中呈現時,它將按原樣打印,因為瀏覽器不理解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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM