当前位置: 首页 > 工具软件 > Tapestry > 使用案例 >

Tapestry学习2

邹高懿
2023-12-01

1、Foreach组件:
  Foreach是一个循环组件,它遍历source参数,并在表现其内容前更新value参数。这是Tapestry组件参数的至关重要特性:将一个属性与一个组件参数绑定,组件不仅读取被绑定的属性,而且更新属性。
  Foreach组件使用<span>标签,当其表现(render)时,并不直接生成任何HTML代码。它仅仅是将其包含的HTML标签和包含的组件重复表现。
  <span jwcid="@Foreach" source="ognl:knowlodgeList" value="ognl:item" index="ognl:foreachIndex">
  这里source参数通过OGNL从StudyTapestry.java里面的获取getKnowlodgeList()方法,
  这里返回的是一个List,source参数可以接收List类型或者Object[]类型。
  value="ognl:item"通过OGNL表达式,获取item,而item的值就是Foreach在每次循环遍历List时,赋的值。打个比方,Foreach就好象实现了如下代码:
  for(int i=0, i<knowlodgeList.size(); i++) {
  item = (Knowledge)list.get(i);
  foreachIndex = i;
  // 可以取出item里面的属性使用
  }
  item要获得Foreach每次循环赋予的对象,我们需要对其进行声明,在StudyTapestry.page文件中,
  <property-specification name="item" type="省略"/>
  在这里,Tapestry就是利用了Java的反射机制使得Tapestry能够访问类的方法,属性和构造函数。
  Tapestry自己构造一个StudyTapestry.java的子类,写入item的JavaBean方法。
  所以java文件里面并没有getItem()和setItem()方法,仍然可以通过OGNL表达式赋值给item或者获取item的值。

2、Insert组件:
  这个组件很简单,就是实现out.print()的功能。
  <span jwcid="@Insert" value="ognl:item.biaotiName"/>
  刚刚在Foreach组件每次循环遍历list的时候,把对象赋予item,现在我们就是取出item对象中的biaotiName字段的值。
  这里我们使用了OGNL表达式。等同于:item.getBiaotiName()。
  在组件规范中,Insert组件还有一个参数raw,该参数是boolean类型,其默认值为false。
  如果设为true,Insert组件会解析value参数的值中所包含的HTML标签。

3、Image组件:
  <img jwcid="@Image" image="ognl:getAsset(item.head)" alt="头像" src="images/1.gif" width="32" height="32" border="0"/>
  Image组件是Tapestry标准组件,用于插入<img>标签,通过image参数生成标签src的属性。标签alt用来显示图片名称。
  src参数在这里是为了静态显示,实际上该组件在运行时,会在page文件中寻找匹配image参数的图片路径动态替换src的路径。
  Asset被用访问静态文件如images和stylesheets。Image组件的image参数必须是IAsset类型的对象而不是String,
  并通过getAsset()方法作为一个IAsset的对象返回。Asset对象执行IAsset接口,getAsset()方法从AbstractComponent基础类中继承,
  能够访问在页面规范中标示为<context-asset>的元素。

  当我们需要动态获取图片路径并显示时:
  public IAsset getNewsImage() {
  return new ExternalAsset(getPictureUp(), null);
  }
  getPictureUp()方法获取了数据库中的图片路径,然后返回一个ExternalAsset对象,在Home.html:
  <img jwcid="@Image" image="ognl:newsImage" height="99" border="0"/>
  即可根据数据库动态地表现图片。

4、Conditional组件
  该组件只有一个参数condition,如果condition参数的值为true,就运行Conditional组件的<span>标签范围内的HTML模板,相反则不运行。
  <span jwcid="@Conditional" condition='ognl:item.biaotiId.equals("1")'>
   标题1
  </span>
  <span jwcid="@Conditional" condition='ognl:item.biaotiId.equals("2")'>
   标题2
  </span>

  在组件规范里面,有另外一个组件包Contrib,其中有两个组件:contrib:When和contrib:Otherwise。
  它们的功能和Conditional组件一样。就如同f-else,这两个组件可以成套使用,
  如果contrib:When的参数condition为true,则执行contrib:When范围内的HTML模块,如果为false,
  则直接跳到contrib:Otherwise的范围去执行其包围的HTML模块。另外,还有一个组件contrib:Choose也有相似功能。

5、GenericLink组件
  <a jwcid="@GenericLink" href="ognl:'http://' + item.internetUrl" disabled="ognl:item.knowledgeUrl==null">
  <img src="images/biaoti.gif" width="16" height="16"/>标题1</a>
  这个组件有个href参数,就是提供一个链接地址,从item.internetUrl中可以取出地址。
  组件GenericLink通常用于跳转到应用程序范围以外的链接。
  GenericLink有个参数disabled,该参数默认为false,当为true时,不能被“点击”。

 

 类似资料: