TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
一、这个简单的应用用到了模型-视图-控制器模式。
其中HTreeViewForHTML.java是我们的树型目录的模型,它有一个如下形式的构造方法public HTreeViewForHtml(MutableDefaultTreeNode root)也就是说我们可以用平常在JAVA GUI编程中构造树型目录的方法事先构造一个树,然后再把树的根结点作为参数传递给这个构造函数从而得到HTreeViewForHtml的一个实例。HTreeController实际上是一个Servlet它继承自HttpServlet。
原理图:
二、目录结构
工程根目录
index.jsp
WEB-INF
web.xml
classes
shilei
HTreeViewForHtml.java
HTreeController.java
三、具体实现
3.1、HTreeViewForHtml.java
package shilei;
import javax.servlet.http.*;
import java.util.*;
import java.io.PrintWriter;
import java.io.IOException;
import javax.swing.tree.*;
import javax.swing.JTree;
public class HTreeForHtml{
//根结点
private MutableTreeNode root;
//根据id查找结点或者根据结点查找id
private Map<Integer,MutableTreeNode> idToNode;
private Map<MutableTreeNode,Integer> nodeToId;
//根据结点查找它的允许孩子可见性
private Map<MutableTreeNode,Boolean> childrenVisible;
//HTreeForHtml对象在HTreeController中的唯一标识
private Integer id;
public HTreeForHtml(MutableTreeNode root){
this.root=root;
this.idToNode=new HashMap<Integer,MutableTreeNode>();
this.nodeToId=new HashMap<MutableTreeNode,Integer>();
this.childrenVisible=new HashMap<MutableTreeNode,Boolean>();
//对所有树结点编码
this.coder(root,0);
//注册到HTreeController
this.id=HTreeController.register(this);
}
public String getTreeViewForHtml(){
String result="<table width="100%" border="0" cellspacing="0px" cellpadding="5px" bgcolor="#CCCCCC">";
return result+this.deepFirstVisitor(root,0)+"</table>";
}
public String deepFirstVisitor(MutableTreeNode node,int level){
String result="";
if(level!=0)result+="<tr><td height="1px" bgcolor="#FFFFFF"></td></tr>";//打印一条白线
result+="<tr bgcolor="#336699" width="100%"><td>";
//控制缩进
for(int i=0;i<level;i++)result+=" ";
//如果node不是叶子节点
if(!node.isLeaf()){
result+="<a href="HTreeController?receiverId="+this.id+
"&nodeId="+this.nodeToId.get(node)+"">";
result+="<font color="#FFFFFF">";//设置字体颜色
//如果node不允许孩子节点可见
if(!((Boolean)this.childrenVisible.get(node)).booleanValue()){
result+=">>"+node.toString()+"</font></a></td></tr>
";
}else{
result+=">>"+node.toString()+"</font></a></td></tr>
";
//遍历孩子
Enumeration children=node.children();
if(!children.hasMoreElements())return result;//do nothing
else{
level++;
while(children.hasMoreElements())
result+=deepFirstVisitor((MutableTreeNode)children.nextElement(),level);
}
}
}//如果node是叶子节点
else if(node.isLeaf()){
result+="<font color="#FFFFFF">*"+
node.toString()+"</font></a></td></tr>
";
}
return result;
}
public void nodeIsClicked(String nodeId){
MutableTreeNode node=(MutableTreeNode)this.idToNode.get(new Integer(nodeId));
Boolean originalVisible=this.childrenVisible.get(node);
this.childrenVisible.put(node,new Boolean(!originalVisible.booleanValue()));
}
private void coder(MutableTreeNode node,int id){
Integer sign=new Integer(id++);
this.idToNode.put(sign,node);
this.nodeToId.put(node,sign);
//默认所有结点的孩子均可见
this.childrenVisible.put(node,new Boolean(true));
Enumeration children=node.children();
while(children.hasMoreElements())
coder((MutableTreeNode)children.nextElement(),id);
}
public static void main(String[] args){
DefaultMutableTreeNode root=new DefaultMutableTreeNode("root");
root.add(new DefaultMutableTreeNode("shilei"));
System.out.println(new HTreeForHtml(root).getTreeViewForHtml());
}
}
3.2、HTreeController.java
package shilei;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*; public class HTreeController extends HttpServlet {
//存放消息接收者与代表其唯一身份的ID
private static Map<Integer,HTreeForHtml> receivers=
new HashMap<Integer,HTreeForHtml>();
//用于产生对于HTreeContorller来说是唯一的标识符
private static int ID=0;
public static Integer register(HTreeForHtml tree){
Integer result=new Integer(ID++);
receivers.put(result,tree);
return result;
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
String receiverId=(String)request.getParameter("receiverId");
String nodeId=(String)request.getParameter("nodeId");
((HTreeForHtml)receivers.get(new Integer(receiverId))).nodeIsClicked(nodeId);
response.sendRedirect("index.jsp");
}
}
3.3、web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app 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 http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"
version="2.5"> <display-name>Welcome to Tomcat</display-name>
<description>Welcome to Tomcat </description>
<servlet>
<servlet-name>HTreeController</servlet-name>
<servlet-class>shilei.HTreeController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HTreeController</servlet-name>
<url-pattern>/HTreeController</url-pattern>
</servlet-mapping>
</web-app>
3.4、index.jsp
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="javax.swing.tree.*" %>
<%@ page import="shilei.*" %>
<%!
HTreeForHtml hTree;
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>树形目录</title>
</head>
<body bgcolor="#999999">
<%
if(hTree==null){
DefaultMutableTreeNode root=new DefaultMutableTreeNode("root");
root.add(new DefaultMutableTreeNode("shilei"));
DefaultMutableTreeNode firstDir=new DefaultMutableTreeNode("firstDir");
firstDir.add(new DefaultMutableTreeNode("<a href="http://sina.com" target="blank">sina</a>"));
root.add(firstDir);
hTree=new HTreeForHtml(root);
}
out.println(hTree.getTreeViewForHtml());
%>
</body>
</html>
4、测试
将我们的工程根目录部署在tomcat的webapps目录下,假设我们的工程根目录名称为test,在浏览器中键入http://localhost:8080/Test/index.jsp,就可以测试我们的简单应用了。如图:

5、说明:具体应用中我们可以按照实际情况构造树型目录(用JDK中的API),然后借助于我们上面提供的类使树形目录在网页中显示出来。
源码下载:http://file.javaxxz.com/2014/10/1/192515000.zip |
|