可以在自定义TagSupport类中包含一个jsp,并指定正文应该去哪里?

时间:2009-02-10 17:45:57

标签: jsp jsp-tags

我想使用自定义jsp标记来帮助在我的应用程序中构建菜单。但是,我希望所有实际的HTML都存在于JSP文件中,而不是Java类中。

所以,假设我有这样的标签:

<mytags:Menu>
  <mytags:MenuItem name="foo"/>
  <mytags:MenuItem name="bar"/>
  <mytags:MenuItem name="baz"/>
</mytags:Menu>

然后我可能会拥有我的Menu标记的类,如下所示:

public class MenuPill extends TagSupport {
    public int doStartTag() throws JspException {
        try {
            pageContext.include("/menu/menu.jsp");
        } catch (ServletException e) {
            throw new JspException(e);
        } catch (IOException e) {
            throw new JspException(e);
        }
        return super.doStartTag();
    }
}

我的menu.jsp文件,它是菜单本身的包装器,然后可能如下所示:

<div id="menu>
  <%somehow include the body here%>
</div>

我想要做的是将我的mytags:Menu标记的正文(将生成实际菜单项的HTML)放入开始和结束标记之间的menu.jsp。我知道我可以把它分成两个不同的jsp文件,一个用于开始标记,一个用于结束标记,但这看起来很草率。

是否可以这样做?

谢谢!

3 个答案:

答案 0 :(得分:2)

我真的建议您使用jsp 2.0 tag files而不是您建议的方法。创建Jsp 2.0标记文件是为了解决您描述的问题。结合jstl(以及可能是java类,如果它真的很复杂),你应该能够实现相同的目的,但有更清晰的方法,更好的代码和表示分离。

答案 1 :(得分:1)

如果您的网络应用中的每个网页都需要相同的菜单,那么您可以考虑Tiles来定义Composite Views

答案 2 :(得分:0)

您可以创建自定义标记,例如...

<强> template.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
  <tlib-version>1.0</tlib-version>
  <short-name>template</short-name>
  <uri>/template</uri>
  <tag-file>
    <name>block</name>
    <path>/META-INF/tags/template/block.tag</path>
  </tag-file>
  <tag-file>
    <name>stringBlock</name>
    <path>/META-INF/tags/template/stringBlock.tag</path>
  </tag-file>
</taglib>

<强>实施

<%@tag import="org.mentawai.template.*" pageEncoding="UTF-8"%>
<%@attribute name="id" required="true"%>

<%
  Page page = (Page)request.getAttribute(TemplateServlet.PAGE_ATTR);
  Page block = page.getBlock(id);
  String view = "";
  if (block == null) {
      throw new ServletException("Block " + id + " doesn't exists");
  }
  request.setAttribute(TemplateServlet.PAGE_ATTR, block);
  view = block.getView();
  TemplateServlet.executeListener(block, request, response, application);

  String oldView = (String)request.getAttribute("_view");
  request.setAttribute("_view", "/" + view);
%>

<jsp:include page="${_view}" flush="true"/>

<%
  request.setAttribute("_view", oldView);
  request.setAttribute(TemplateServlet.PAGE_ATTR, page);
%>

参考: http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html