我想使用自定义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文件,一个用于开始标记,一个用于结束标记,但这看起来很草率。
是否可以这样做?
谢谢!
答案 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