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資源管理員的功能,並可以實現訊息的顯示,