- override tag: 会将标签里边的内容保存为pageContext的变量,变量称号为name的特点加前缀,如 __override__$name = tag内容
- block tag: 依据name特点称号,若是发现__override__$name变量,则显现被重界说的内容,不然显现本身tag的内容.
- <%@include >指令: 经过该指令来完成承继(extends)的功用(只能运用这个窍门),该指令有必要放置在页面的最后面
输出:
建立第一个内容类型
内容类型就是一列格式化字段,内容发布者利用它来为特定的内容类型填写需要的信息。有点像建一个网页表单。以下通过创建内容结构类型来存储存储“Staff”类型的内容。
创建“Staff”内容结构类型
现在可以发布“Staff”类型的内容了。点击内容标签,从“类型:”字段选择“Staff”,在页面右边点击“添加新内容”,输入staff的字段,“保存/发布”
制作第一个高级模板
为“Staff”内容类型创建一个容器
<p><em>$!{title}</em><br/>
$!{email}<p/>
现在容器可以用在一个或多个模板里面,用来显示staff的信息。现在需要一个模板来调用容器,一个页面来套用模板。
现在来定制一个模板让它调用“Staff”容器。
第一个模板
dotCMS包含了一些示例模板。先可以复制一个模板,看看组成模板的元素,试着在模板中解析容器。然后创建一个使用自定义模板的页面,在页面的一个部分放入一些内容,用来调用自定义的“Staff”内容容器。
创建一个模板
## This is autogenerated code that cannot be changed
#parseContainer('56bd55ea-b04b-480d-9e37-5d6f9217dcc3')
删除之,保持光标在<article><article/>之内
现在完成了自定义模板,可以再页面中使用此模板
模板使用标准html代码,结合velocity来解析容器并提供页面布局。
容器格式化内容在页面各个部分的显示方式。dotCMS页面只不过是页面标题+URL+模板链接
本文链接
常见的数据结构有数组、链表,还有一种结构也很常见,那就是树。前面介绍的集合类有基于数组的ArrayList,有基于链表的LinkedList,还有链表和数组结合的HashMap,今天介绍基于树的TreeMap。
TreeMap基于红黑树(点击查看树、红黑树相关内容)实现。查看“键”或“键值对”时,它们会被排序(次序由Comparable或Comparator决定)。TreeMap的特点在于,所得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
在介绍TreeMap前先介绍Comparable和Comparator接口。
Comparable接口:
2 public int compareTo(T o);
3 }
Comparable接口支持泛型,只有一个方法,该方法返回负数、零、正数分别表示当前对象“小于”、“等于”、“大于”传入对象o。
Comparamtor接口:
2 int compare(T o1, T o2);
3 boolean equals(Object obj);
4 }
compare(T o1,T o2)方法比较o1和o2两个对象,o1“大于”o2,返回正数,相等返回零,“小于”返回负数。
equals(Object obj)返回true的唯一情况是obj也是一个比较器(Comparator)并且比较结果和此比较器的结果的大小次序是一致的。即comp1.equals(comp2)意味着sgn(comp1.compare(o1, * o2))==sgn(comp2.compare(o1, o2))。
补充:符号sgn(expression)表示数学上的signum函数,该函数根据expression的值是负数、零或正数,分别返回-1、0或1。
小结一下,实现Comparable结构的类可以和其他对象进行比较,即实现Comparable可以进行比较的类。而实现Comparator接口的类是比较器,用于比较两个对象的大小。
下面正式分析TreeMap的源码。
既然TreeMap底层使用的是树结构,那么必然有表示节点的对象。下面先看TreeMap中表示节点的内部类Entry。
2 // 键值对的“键”
3 K key;
4 // 键值对的“值”
5 V value;
6 // 左孩子
7 Entry<K,V> left = null;
8 // 右孩子
9 Entry<K,V> right = null;
10 // 父节点
11 Entry<K,V> parent;
12 // 红黑树的节点表示颜色的属性
13 boolean color = BLACK;
14 /**
15 * 根据给定的键、值、父节点构造一个节点,颜色为默认的黑色
16 */
17 Entry(K key, V value, Entry<K,V> parent) {
18 this.key = key;
19 this.value = value;
20 this.parent = parent;
21 }
22 // 获取节点的key
23 public K getKey() {
24 return key;
25 }
26 // 获取节点的value
27 public V getValue() {
28 return value;
29 }
30 /**
31 * 修改并返回当前节点的value
32 */
33 public V setValue(V value) {
34 V oldValue = this.value;
35 this.value = value;
36 return oldValue;
37 }
38 // 判断节点相等的方法(两个节点为同一类型且key值和value值都相等时两个节点相等)
39 public boolean equals(Object o) {
40 if (!(o instanceof Map.Entry))
41 return false;
42 Map.Entry<?,?> e = (Map.Entry<?,?>)o;
43 return valEquals(key,e.getKey()) && valEquals(value,e.getValue());
44 }
45 // 节点的哈希值计算方法
46 public int hashCode() {
47 int