2010-02-24 22 views
5

說我有我的自定義標籤庫:JSP定製標記庫:嵌套的評價

<%@ 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 

這可行嗎?怎麼樣?

謝謝。

+0

確定,離開這個問題了,而沒有最終的答案和調查自己的問題後,得出的結論是*不*可能的。乾杯。 – 2010-03-18 16:06:59

回答

2

蒂亞戈,我不知道如何解決你的確切的問題,但你可以從文件解釋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

+0

我沒有真正測試過,因爲在某些時候需求已經改變,我不需要再解決這個特殊問題,所以我接受你的解決方案,因爲這是最好的答案,你自己測試了。謝謝 :) – 2010-07-04 10:52:06

1

你真的需要的是這樣的:

<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主體內容設置在TLD把jsp:

<bodycontent>JSP</bodycontent> 
+0

直接在JSP中嵌套taglib不是一個選項,因爲我會從第三方庫動態生成它。 – 2010-02-24 15:50:20

0

爲什麼你在你的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標籤添加到字符串中。

+1

因爲這樣的JSTL標籤會來自第三方模板評估。 – 2010-03-18 16:05:08