当前位置:  编程技术>java/j2ee
本页文章导读:
    ▪JSP页面的继承(extends)      1.分析运用过python django模板的应该清晰,django里边有一个激动人心的功用就是模板能够运用类的承继联系。 即模板是能够承继的,而且不限承继的层次。如1. child.html extends base.html2. grandchi.........
    ▪dotcms学习记录--建站-入门      建立第一个内容类型内容类型就是一列格式化字段,内容发布者利用它来为特定的内容类型填写需要的信息。有点像建一个网页表单。以下通过创建内容结构类型来存储存储“Staff”类.........
    ▪TreeMap源码分析——基础分析(基于JDK1.6)            常见的数据结构有数组、链表,还有一种结构也很常见,那就是树。前面介绍的集合类有基于数组的ArrayList,有基于链表的LinkedList,还有链表和数组结合的HashMap,今天介.........

[1]JSP页面的继承(extends)
    来源:    发布时间: 2013-10-14
1.分析
运用过python django模板的应该清晰,django里边有一个激动人心的功用就是模板能够运用类的承继联系。 即模板是能够承继的,而且不限承继的层次。
1. child.html extends base.html
2. grandchild.html extends child.html
这样,咱们在base.html中界说好html规划,然后在“子类”(咱们这样称号吧)重界说需求父页面内容即可
 
2.jsp承继示例
如今咱们来看jsp中怎么完成此功用(django与下面的声明相似)。
父页面: base.jsp,界说规划
Jsp代码  
  • <%@ taglib uri="http://www.rapid-framework.org.cn/rapid" prefix="rapid" %>  
  •   
  •    "head">base_head_content  
  •   
  •    
      
  •    "content">base_body_content  
  •   
  •   
  •  
    子页面: child.jsp
    Jsp代码  
  • <%@ taglib uri="http://www.rapid-framework.org.cn/rapid" prefix="rapid" %>  
  • <% //重界说父页面的内容为content的内容 %>  
  • "content">  
  •     child_body_content  
  •   
  •    
  •   
  • <%@ include file="base.jsp" %>  
  •  
    如上: 咱们运用了两个jsp tag: block,override,还有<@include >指令.
    下面描绘各个功用:
    • override tag:  会将标签里边的内容保存为pageContext的变量,变量称号为name的特点加前缀,如 __override__$name = tag内容
    • block tag:  依据name特点称号,若是发现__override__$name变量,则显现被重界说的内容,不然显现本身tag的内容.
    • <%@include >指令: 经过该指令来完成承继(extends)的功用(只能运用这个窍门),该指令有必要放置在页面的最后面 

    输出:

    直接拜访base.jsp输出:
    Html代码  
  • <html>  
  •  base_head_content  
  • <body>  
  •  <br />  
  •  base_body_content  
  • body>  
  • html>  
  •  拜访child.jsp输出:
    Html代码  
  • <html>  
  •  base_head_content  
  • <body>  
  •  <br />  
  •  child_body_content  
  • body>  
  • html>  
  •  能够看到,child.jsp的的body输出内容被重界说了.
    现该tag能够完成jsp的无限级的承继联系. 即 grandchild.jsp 承继 child.jsp , child.jsp承继 base.jsp 
     
    3.详细完成方法:
    Block Tag:
    Java代码  
  • public class BlockTag extends TagSupport{  
  •    
  •  private String name;  
  •    
  •  public void setName(String name) {  
  •   this.name = name;  
  •  }  
  •    
  •  @Override  
  •  public int doStartTag() throws JspException {  
  •   return getOverriedContent() == null ? EVAL_BODY_INCLUDE : SKIP_BODY;  
  •  }  
  •    
  •  @Override  
  •  public int doEndTag() throws JspException {  
  •   String overriedContent = getOverriedContent();  
  •   if(overriedContent == null) {  
  •    return EVAL_PAGE;  
  •   }  
  •     
  •   try {  
  •    pageContext.getOut().write(overriedContent);  
  •   } catch (IOException e) {  
  •    throw new Jsp
        
  • [2]dotcms学习记录--建站-入门
        来源:    发布时间: 2013-10-14

    建立第一个内容类型

    内容类型就是一列格式化字段,内容发布者利用它来为特定的内容类型填写需要的信息。有点像建一个网页表单。以下通过创建内容结构类型来存储存储“Staff”类型的内容。

    创建“Staff”内容结构类型

  • 登录dotCMS后台
  • 点击结构标签下的结构菜单项
  • 点击页面右边“添加新结构”
  • 将结构命名为“Staff”,确保“类型”字段设置成“内容”,点击“保存”
  • 点击“添加新字段”,开始添加描述staff(职员)的字段
  • 点击“显示类型”的下拉箭头,选择“文本”
  • 在标签字段,输入“First Name”,选中复选框中的“必填”、“用户可搜索”和“通过列表显示”
  • 点击“保存字段”
  • 重复5-8步,加入“Last Name”和“Email”字段
  • 重复5-8步,加入“Title”字段,但是不要选中“必填”复选框
  • 重复5-8步,加入“Middle Name”字段,但是只选中必须复选框
  • 重复5-8步,加入“Phone”字段,但是在验证RegEx边上从下拉列表选择“美国电话”(选择正则表达式),只选中“必填”复选框
  • 鼠标悬停在字段标签上,会发现光标变成手型,按住可以拖动,改变字段顺序
  • 点击“保存”
  •  

    现在可以发布“Staff”类型的内容了。点击内容标签,从“类型:”字段选择“Staff”,在页面右边点击“添加新内容”,输入staff的字段,“保存/发布”

     制作第一个高级模板

    为“Staff”内容类型创建一个容器

  • 在“Site Browser”标签下选择“容器”
  • 在页面右上方点击“添加容器”
  • 在标题字段输入“Staff Content Container”
  • 在描述字段输入“Accepts Staff Content and displays name, title, and email”
  • 选择最大内容为5
  • 在“内容类型”字段选择“Staff”
  • 在代码下面选择“添加变量”
  • 点击“Last Name”边上的“添加”,在后面加上逗号和空格
  • 在代码下面选择“添加变量”
  • 点击“First Name”边上的“添加”
  • 用velocity变量包裹,内嵌一些html风格的代码
  • 回车,在代码下面选择“添加变量”
  • 点击“Title”边上的“添加”
  • 用html标签的<em></em>包裹title字段,使之成为斜体字,用<br/>加一条横线
  • 回车,在代码下面选择“添加变量”
  • 点击“Email”边上的“添加”
  • 用html<p><p/>标签包裹title和email,代码如下:
    <h3>$!{lastName}, $!{firstName}</h3>
    <p><em>$!{title}</em><br/>
    $!{email}<p/>

     

  • 点击“保存/发布”
  • 现在容器可以用在一个或多个模板里面,用来显示staff的信息。现在需要一个模板来调用容器,一个页面来套用模板。

    现在来定制一个模板让它调用“Staff”容器。

    第一个模板

    dotCMS包含了一些示例模板。先可以复制一个模板,看看组成模板的元素,试着在模板中解析容器。然后创建一个使用自定义模板的页面,在页面的一个部分放入一些内容,用来调用自定义的“Staff”内容容器。

    创建一个模板

  • 重命名模板“1 Column (No Padding, Detail Page)--Staff”,以此表明它是被“staff页面”使用的。描述改为“One column with staff
  • 在描述下面可以看到模板代码。在模板代码里面可以看到有html和velocity风格的代码,每一个使用此模板的页面都执行此段代码。保持header和footer部分不动,找到如下velocity风格的代码:
    ## Container: Default 1 (Web Page Content)
    ## This is autogenerated code that cannot be changed
    #parseContainer('56bd55ea-b04b-480d-9e37-5d6f9217dcc3')

    删除之,保持光标在<article><article/>之内

  • 点击代码区域顶部的“添加容器”,在容器下拉菜单中选择自定义的“Staff Content Container”。(点击更多选项可看到未显示的容器)。点击添加,三行代码自动添加。
  • 点击“保存/发布”
  • 现在完成了自定义模板,可以再页面中使用此模板

  • 在“Site Browser”中选择“HTML页面”
  • 点击“添加HTML页面”
  • 给页面命名“My First Staff Page”(页面URL自动生成)
  • 在模板下拉列表中选择自定义的模板,如“1 Column (No Padding, Detail Page)--Staff”
  • 点击“保存并发布”后会在编辑模式中打开页面
  • 点击“添加内容”,选择“新内容”则输入staff相关字段,选择“重用内容”,则在弹框中选择已有staff类型内容
  • 点击“保存/发布”
  • 可以看到staff内容显示
  • 在这个页面中最多可增加5个staff类型的内容
  • 模板使用标准html代码,结合velocity来解析容器并提供页面布局。

    容器格式化内容在页面各个部分的显示方式。dotCMS页面只不过是页面标题+URL+模板链接

    本文链接


        
    [3]TreeMap源码分析——基础分析(基于JDK1.6)
        来源:    发布时间: 2013-10-14

          常见的数据结构有数组、链表,还有一种结构也很常见,那就是树。前面介绍的集合类有基于数组的ArrayList,有基于链表的LinkedList,还有链表和数组结合的HashMap,今天介绍基于树的TreeMap。

         TreeMap基于红黑树(点击查看树、红黑树相关内容)实现。查看“键”或“键值对”时,它们会被排序(次序由Comparable或Comparator决定)。TreeMap的特点在于,所得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。 

         在介绍TreeMap前先介绍Comparable和Comparator接口。 

         Comparable接口:

    1 public interface Comparable<T> {
    2 public int compareTo(T o);
    3 }

         Comparable接口支持泛型,只有一个方法,该方法返回负数、零、正数分别表示当前对象“小于”、“等于”、“大于”传入对象o。

         Comparamtor接口:

    1 public interface Comparator<T> {
    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。

    1 static final class Entry<K,V> implements Map.Entry<K,V> {
    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
        
    最新技术文章:
     




    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3