【问题标题】:JSP Custom Taglib: Nested EvaluationJSP 自定义标记库:嵌套评估
【发布时间】:2010-02-24 15:08:12
【问题描述】:

假设我有我的自定义标签库:

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

这可行吗?怎么样?

谢谢。

【问题讨论】:

  • 好的,在没有最终答案的情况下暂时离开这个问题并亲自调查问题后,结论是不可能可能。干杯。

标签: java jsp taglib


【解决方案1】:

Tiago,我不知道如何解决您的exact 问题,但您可以从文件中解释 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

【讨论】:

  • 我还没有真正测试过这个,因为在某些时候要求已经改变,我不需要再解决这个特定问题,所以我接受你的解决方案,因为它是最好的答案和你自己测试过。谢谢:)
【解决方案2】:

你真正需要的是:

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

【讨论】:

  • 将 taglib 直接嵌套在 JSP 中不是一种选择,因为我会从第三方库中动态生成它。
【解决方案3】:

为什么要在 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 标记添加到字符串。

【讨论】:

  • 因为这样的 JSTL 标签会来自第三方模板评估。
猜你喜欢
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2015-01-27
相关资源
最近更新 更多