这样,点击根节点它将在浏览器中显示:
--------------------------------------------------
| +-Servers +-Exchange Server +-Notes Server
--------------------------------------------------
注意:与之间没有空格。与之间也没有。如果你移动标签到下一行,一个空格将出现在图象前,这个空格将是链接的一部分,然而这样看起来并不舒服。
这些才是我们想要的.若加上一些其它的子节点,效果同样很棒:
---|---------------------
| -- Servers
| |
| -- ExchangServer
| | Peter Johnson
| |
| -- Notes Server
| | Peter Johnson
| Jakob Jenkov
-------------------------
---|---------------------
| -- Servers
| |
| -- ExchangServer
| | Peter Johnson
| |
| -- Notes Server
| | Peter Johnson
| Jakob Jenkov
-------------------------
其实hasChildren="false"是一般不会做expanded="true"展开操作,所以hasChildren与expanded两属性,
浏览器显示如下:
---|--------------------
| -- Servers
| |
| -- ExchangServer
| | Peter Johnson
| |
| -- Notes Server
| Peter Johnson
| Jakob Jenkov
------------------------
到此似乎接近完美咯,汇总一下代码,JSP显示如下:
<%-- 树定义 --%>
<%@ page
import="com.jenkov.prizetags.tree.itf.ITree,
com.jenkov.prizetags.tree.impl.Tree,
com.jenkov.prizetags.tree.itf.ITreeNode,
com.jenkov.prizetags.tree.impl.TreeNode"
%>
<%@ taglib uri="/WEB-INF/treetag.tld" prefix="tree"%>
<%
if (session.getAttribute("tree.model") == null) {
ITree tree = new Tree();
//(node's id , node's name , node's type)
ITreeNode root = new TreeNode("rootId", "Servers", "root");
ITreeNode server1 = new TreeNode("server1Id","Exchange Server", "server");
ITreeNode server2 = new TreeNode("server2Id", "Notes Server","server");
ITreeNode user1 = new TreeNode("user1Id", "Peter Johnson","user");
ITreeNode user2 = new TreeNode("user1Id", "Jakob Jenkov","user");
root.addChild(server1);
root.addChild(server2);
server1.addChild(user1);
server2.addChild(user1);
server2.addChild(user2);
tree.setRoot(root);
session.setAttribute("tree.model", tree);
}
%>
展开和收起方法:
你可以通过实现接口ITree的getExpandedNodes方法得到被展开节点的集合。
public Set getExpandedNodes();
只有被展开的节点ID被保存,以便跟踪记录树的展开状态。你可以通过以下ITree的方法实现展开或收起一个节点:
public void expand (String treeNodeId);
public void collapse (String treeNodeId);
通过ITree的isExpanded方法可以知道指定的节点是否被展开
public boolean isExpanded(String treeNodeId);
Select / Unselect 方法
和获得展开的节点一样,通过ITree的getSelectedNodes方法可以获得被选择节点的集合:
public Set getSelectedNodes();
只有被选择的节点ID被保存,以便跟踪记录树的选择状态。你可以通过以下ITree的方法实现选择或释放一个节点:
public void select (String treeNodeId);
public void unSelect (String treeNodeId);
public void unSelectAll();
通过ITree的isSelected方法可以知道指定的节点是否被选中:
public boolean isSelected(String treeNodeId);
ITree 接口
下面是全部的接口,不含注释.
public interface ITree {
public ITreeNode getRoot();
public void setRoot(ITreeNode node);
public ITreeNode findNode (String treeNodeId);
public Set findNodes(Set treeNodeIds);
public boolean isExpanded(String treeNodeId);
public void expand (String treeNodeId);
public void collapse (String treeNodeId);
public Set getExpandedNodes();
public void addExpandListener (IExpandListener expandListener);
public void removeExpandListener (IExpandListener expandListener);
public void addCollapseListener (ICollapseListener collapseListener);
public void removeCollapseListener (ICollapseListener collapseListener);
public boolean isSelected(String treeNodeId);
public void select (String treeNodeId);
public void unSelect (String treeNodeId);
public void unSelectAll();
public Set getSelectedNodes();
public void addSelectListener (ISelectListener selectListener);
public void removeSelectListener (ISelectListener selectListener);
public void addUnselectListener (IUnselectListener unselectListener);
public void removeUnselectListener (IUnselectListener unselectListener);
public void setSingleSelectionMode(boolean mode);
public boolean isSingleSelectionMode();
public Iterator iterator(boolean includeRootNode);
}
树节点:
树节点接口 ITreeNode 并且 类 Tree实现该接口。
节点 Id唯一
节点id被用来跟踪哪个节点被展开或选择,所以每个节点要用树中唯一的ID来标识。 若节点ID重复,展开或选定节点时将出错。
在生成节点时,节点的ID是TreeNodeThe构造器提供的。 节点的ID可以通过ITreeNode的方法被访问:
public String getId();
public void setId(String id);
添加子节点和设置父节点:
每个添加删除子节点,设置父节点的方法都有两个版本:
public void addChild(ITreeNode node);
public void addChildOnly(ITreeNode node);
public void removeChild(ITreeNode node);
public void removeChildOnly(ITreeNode node);
public void setParent(ITreeNode parent);
public void setParentOnly(ITreeNode parent);
parent.addChild(child) ---> child.setParentOnly(this) ---> no more calls.
child.setParent(child) ---> parent.addChildOnly(this) ---> no more calls.
child.setParent(null) ---> parent.removeChildOnly(this) ---> no more calls.
parent.removeChild(child) ---> child.setParentOnly(null) ---> no more calls.
如果每个方法只有一个版本,势必造成死递归:
parent.addChild(child) ---> child.setParent(this)---> parent.addChild(this) ---> child.setParent(this)---> ...
给树节点配置属性:
给树节点配属一个对象是很有必要的,这个对象可用来定制外观和树节点的文本.相应的方法:
public Object getObject();
public void setObject(Object object);
这章包含怎么配属,分离和定制外观.
接口ITreeNode
下面是全部的接口,不含注释.
public interface ITreeNode {
public String getName();
public void setName(String name);
public String getId();
public void setId(String id);
public String getType();
public void setType(String type);
public Object getObject();
public void setObject(Object object);
public void addChild(ITreeNode node);
public void addChildOnly(ITreeNode node);
public void removeChild(ITreeNode node);
public void removeChildOnly(ITreeNode node);
public void removeAllChildren();
public List getChildren();
public boolean hasChildren();
public ITreeNode getParent();
public void setParent(ITreeNode parent);
public void setParentOnly(ITreeNode parent);
}
在哪里产生树模型?
树模型是被作为 session属性集合存放的, 一边JSP中标签能取到数据.这并不意味这你也必须在JSP页面中生成树模型.可以在 Servlet, Struts action, 或另一个JSP页面中生成树模型. 只要最后树模型被存入session属性中可以被标签使用即可.
匹配树节点:
Tree标签中最强大的一个子标签是标签,它的反义的标签是.这些匹配标签只有在匹配或不匹配给定的标准是才去取标签体内的值.这个在你想定制个别节点外观时很有用.例如:一个头的图标代表用户,两个头的图标代表用户组.或一个文件夹图标代表一个目录!这个匹配标签能匹配树节点的不同属性.之前你也看过了标签时如何匹配是否有儿子,是否展开等节点.再看个例子:
标签体中只有当前节点的类型是"usergroup"的子标签才会被取到.如果被取到的标签体被以HTML形式得到,代码将会最终再HTML文档中显示!然后将显示一个代表用户组的图片.
相反的,
将匹配那些所有不是用户组类型的节点
这两种匹配标签属性列表:
Attribute Purpose Allowed Values Examples
--------------------------------------------------------------------------
type Matches the type Any string value. type="usergroup"
of the current node, type="folder"
as returned by the type="movies.thriller.*"
ITreeNode.getType()
method.
--------------------------------------------------------------------------- name Matches the name of the Any string value name="Peter Johnson"
current ITreeNode, as name="*Ltd"
returned by the
ITreeNode.getName()
method.
---------------------------------------------------------------------------
id Matches the id of the Any string value. id="server1"
current node, as id="server*"
returned by the
ITreeNode.getId()
method.
---------------------------------------------------------------------------
expanded Matches if the current true|false expanded="true"
node is expanded. expanded="false"
---------------------------------------------------------------------------
selected Matches if the current true|false selected="true"
node is selected selected="false"
---------------------------------------------------------------------------
hasChildren Matches if the true|false hasChildren="true"
current node hasChildren="false"
has any children
---------------------------------------------------------------------------
isFirstChild Matches if the true|false isFirstChild="true"
current node is isFirstChild="false"
the first child of
it's parent.
---------------------------------------------------------------------------
isLastChild Matches if the true|false isLastChild="true"
current node is isLastChild="false"
the last child of
it's parent
---------------------------------------------------------------------------
如果你在一个匹配标签中使用多个属性,必须保证这些属性同时都匹配,子标签体才会被获取.例子:
这个标签体在只有当前标签有子节点并且是父节点的结束节点时才被获取.
执行完上面标签的代码,这个事件源节点就可以作为request属性按以"expandedNode", "collapsedNode", "selectedNode" or
"unselectedNode"属性给定关键字使用啦.他们能被java代码或其它标签(Struts标签...etc)访问.和 标签一样,事件侦听标签在使用到"expand", "collapse", "select", or "unselect"参数时将去request中核对。如果你在标签中修改了这些参数的名称,你同样必须修改事件侦听标签中的名称,与标签的使用类似。例子:
隐藏根节点:
通过设置 属性includeRootNode="false"隐藏根节点.代码如下:
<%-- the tree --%>
如果以前的代码+现在的代码,则浏览器的显示如下:
-----------------------------------
| --★ExchangServer- extra info
| | |--■Peter Johnson
|
| --★Notes Server
| |--■Peter Johnson
| |--■Jakob Jenkov
-----------------------------------
1、网络上现成的资料
格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
linux sed 批量替换多个文件中的字符串
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`
例如:替换/home下所有文件中的www.admi
对于AJAX应用(使用XMLHttpRequests)来说,向服务器发起请求的传统方式是:获取一个XMLHttpRequest对象的引用、发起请求、读取响应、检查状态码,最后处理服务端的响应。整个过程示例如下:
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange
Hive中的排序语法 2014.06.22 ORDER BY
hive中的ORDER BY语句和关系数据库中的sql语法相似。他会对查询结果做全局排序,这意味着所有的数据会传送到一个Reduce任务上,这样会导致在大数量的情况下,花费大量时间。
与数据库中 ORDER BY 的区别在于在hive.mapred.mode = strict模式下,必须指定 limit 否则执行会报错。
post-commit hook failed (exit code 1) with output:
svn: E155004: Working copy 'D:\xx\xxx' locked
svn: E200031: sqlite: attempt to write a readonly database
svn: E200031: sqlite: attempt to write a