1.自定义标签类:
javax.servlet.jsp.tagext.BodyTagSupport——导入此包
public class SubNodesTag extends BodyTagSupport {
/**
*
*/
private static final long serialVersionUID = 1396571704883585147L;
private BbsMessage bbsMessage;
private String proposalId;
private int level = 0;
private static final String DATE_FORMAT = "yyyy/MM/dd HH:mm:ss";
/**
* @param bbsMessage
* the bbsMessage to set
*/
public void setBbsMessage(final BbsMessage bbsMessage) {
this.bbsMessage = bbsMessage;
}
/**
* @param proposalId
* the proposalId to set
*/
public void setProposalId(final String proposalId) {
this.proposalId = proposalId;
}
/**
* {@inheritDoc}
*/
@Override
public int doEndTag() throws JspException {
this.getSubNodes(bbsMessage, proposalId);
return EVAL_PAGE;
}
/**
* 取得每一层消息的子结点
* @param bbsMessage BbsMessage
* @param proposalId String
*/
private void getSubNodes(final BbsMessage bbsMessage, final String proposalId) {
// 取得首层子结点
List<BbsMessage> subNodes = bbsMessage.getSubNodes();
level++;
if (subNodes.size() > 0) {
// 遍历子结点
for (BbsMessage m : subNodes) {
try {
pageContext.getOut().print("<tr><td>");
for (int i = 0; i < level; i++) {
pageContext.getOut().print(" ");
}
pageContext.getOut().print("<a href=/"bulletinBoard.do?proposalId=");
pageContext.getOut().print(proposalId);
pageContext.getOut().print("&messageId=");
pageContext.getOut().print(m.getMessageId());
pageContext.getOut().print("/">");
pageContext.getOut().print(TagUtils.convertHtml(m.getTitle()));
pageContext.getOut().print("</a>");
pageContext.getOut().print(" 亅");
pageContext.getOut().print(TagUtils.convertHtml(m.getDisplayUserName()));
pageContext.getOut().print(" 亅");
pageContext.getOut().print(new SimpleDateFormat(DATE_FORMAT).format(m.getCreatedDatetime()));
pageContext.getOut().print("</td></tr>");
this.getSubNodes(m, proposalId);
level--;
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
}
这样就完成了对一个自定义标签的定义
2.配置:
在.tld文件里进行如下配置:
<tag>
<description>
Display the subNodes.
</description>
<name>subNodes</name>
<tag-class>xxx.products.sms.sourcing.web.tag.SubNodesTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<description>BbsMessageModel</description>
<name>bbsMessage</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>ProposalId</description>
<name>proposalId</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
其中attribute表示标签使用时所需要的参数。
3.完成对bbsMessage的初始化(取到所有子结点):
private List<BbsMessage> getSubNodes(String parentMessageId) throws DataConnectException, DataPropertyException, DataAccessException {
// 在DB层取出第一层子结点
List<BbsMessage> subNodes = bbsMessageDao.getBbsMessageByParentMessageId(parentMessageId);
if (subNodes.size() > 0) {
// 遍历子结点;
bbsMessage.setSubNodes(getSubNodes(bbsMessage.getMessageId(), ));
}
}
return subNodes;
}
4.在jsp页面中进行引用:
<table>
<c:if test="${not empty bbsMessage.subNodes}">
<nbs:subNodes bbsMessage="${bbsMessage}"
proposalId="${proposalId}"></nbs:subNodes>
</c:if>
</table>
这样就可以实现在页面里的树状消息体,类似于windows资源管理器的功能,并可以实现消息的显示,