模板和标记常见问题解答

模板和标记

主要条款:组件模板

目录

为什么在使用HTML实体时会收到SAXParseException,例如 在我的模板中?

Tapestry使用标准SAX解析器读取模板。这意味着您的模板必须成形良好的:打开和关闭标记必须平衡,属性值必须用引号括起来,并且必须声明实体。完成此操作的最简单方法是将DOCTYPE添加到模板顶部:

<!DOCTYPE html PUBLIC“-//W3C//DTD XHTML 1.0严格//EN”http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.DTD">

DOCTYPE的一部分是实体的声明,例如&nbsp;

或者,您可以简单地使用数字版本:&#160; 这是完全相同的字符,将在浏览器中以相同的方式呈现。

从5.3版开始,Tapestry在没有doctype时引入了XHTML doctype;这意味着通用HTML实体将正常工作。

为什么我页面中的一些图像显示为断开的链接?

在页面模板中使用相对URL时必须小心;基本URL可能并不总是您所期望的。例如,在您的查看用户.tml文件,您可能有:

${user.name}具有管理权限

这很有道理;ViewUser.tml位于web上下文中,图标文件夹也是如此。此页面的默认URL为/viewuser(假设viewuser类位于根包装.pages包)。

但是,ViewUser页面可能使用页面激活上下文来标识要显示的用户:

公共类ViewUser@财产@页面激活上下文私人用户;. . .

有了页面激活上下文,页面的URL将包含User对象的ID,类似于/查看用户/37371。这就是为什么相对URL指向管理员.png图像被破坏:基本路径是相对于页面的URL的,而不是相对于页面模板的。(事实上,页面模板甚至可能不在web上下文中,它可能像组件模板一样存储在类路径中。)

一种解决方案是预测页面URL是什么,并为此调整路径:

${user.name}具有管理权限

但这有其自身的问题;页面激活上下文在不同时间的长度可能不同,或者所讨论的模板可能是跨多个不同页面使用的组件,因此很难预测正确的相对URL。

这个最好的针对这种情况的解决方案是使用上下文:绑定前缀:

<img class=“icon”src=“${context:icons/admin.png}”/>${user.name}具有管理权限

现在,<img>标记的src属性将绑定到一个动态计算的值:图像文件相对于web应用程序上下文的位置。这对于可能在不同页面上使用的组件尤其重要。

两者的区别是什么身份证件t: 标识?

您可能偶尔会在模板中看到类似以下内容:

<t:zone id=“status”t:id=“statusZone”>

为什么有两个ID?为什么它们不同?

这个t: 标识属性是Tapestry组件id。该id在其直接容器中是唯一的。这是用于将组件注入页面类的id:

@注入组件私有区域statusZone;

另一个id是客户端id,是客户端DOM中呈现元素的唯一id。需要访问元素的JavaScript使用此id。例如:

$('status').hide();

在许多组件中身份证件属性是一个非正式参数;模板中的一个值被盲目地回显到输出文档中。在其他情况下,组件本身具有身份证件属性。在后一种情况下,Tapestry组件id通常是违约客户端id的值。

为什么我的图像和样式表最终会有一个奇怪的URL,比如/assets/meta/zeea17aee26bc0cae/layout/layout.css?

Tapestry不依赖servlet容器来提供静态资产(图像、样式表、flash影片等)。相反,Tapestry自己处理请求,将资产流式传输到浏览器。

资产内容将被GZIP压缩(如果客户端支持压缩,并且内容是可压缩的)。此外,Tapestry将在内容上设置一个far-future expires头。这意味着浏览器不会再次请求该文件,从而大大减少了网络流量。

奇怪的十六进制字符串是指纹; 它是根据资产的实际内容计算的哈希代码。如果资产发生变化,它将有一个新的指纹,也将有一条新的路径和一个新(不可变)资源。这种方法与Tapestry提供的far-future-expires报头相结合,可以确保客户端在浏览站点时,甚至在访问之间积极缓存资产。

如何将CSS类添加到Tapestry组件?

正如他们所说,“只管做”。大多数Tapestry组件支持非正式参数,这意味着元素(模板中)中的任何额外属性都将呈现为额外属性。因此,您可以很容易地应用CSS类或样式:

<t:textfield t:id=“username”class=“big-green”/>

甚至可以在属性值中使用模板展开:

<t:textfield t:id=“username”class=“${usernameClass}”/>

公共字符串getUsernameClass(){return是Urgent()吗?“紧急”:空;}

当非正式参数绑定为null时,则根本不会写出属性。

您可以通过检查组件引用或查找@支持InformalParameters组件源文件中的注释。