| Blog信息 |  
| 
 blog名称: 日志总数:1304 评论数量:2242 留言数量:5 访问次数:7646606 建立时间:2006年5月29日   |   
 
  
 
  |    | 
  
   
| 
  [Tapestry]Tapestry的数据校验功能 软件技术 
lhwork 发表于 2006/7/11 17:56:31   |  
		
		数据校验是Web应用的一个很重要的功能。 
tapestry支持配置式的数据校验,通过使用Delegate、FieldLabel和TextField对数据的显示进行修饰。在page文件中对各输入数据的校验规则进行配置。 
可以使用系统提供的Validator。出错信息也提供了多种语言的版本,很方便。 
但是问题是:如果表单有多个Submit按钮,不同的按钮需要的校验规则不同,此时该如何做? 
众多的web开源框架都存在这样的问题,包括Struts、spring等。 
我觉得表单的校验规则应当基于每个提交动作进行配置,而不是基于表单的所有提交动作。 
这个现象普遍存在我觉得很奇怪,难道老外做 |    
 |   
   
| 
  [Tapestry]Tapestry在静态页面和动态内容分工方面的研究 软件技术 
lhwork 发表于 2006/7/11 17:56:08   |  
		Tapestry的一个最耀眼的功能是其绝好的模板设计思想,它能够将动态内容以极少的侵入性而展现到HTML页面上,我对其这一功能非常赞赏,如果
Tapestry能够像Spring那样把这一部分HTML模板解析功能独立出来,打成一个Tapestry-Core.jar极不妙哉?! 
 
在工作实践当中,我发现Tapestry提供的Shell组件其实用处不大,美工人员作出的页面大多已包括HTML TITLE HEAD LINK
等标签,如果将这些删除而封装到Shell岂不多此一举?而且Shell引用CSS IMAGE的方式(Asset)比较麻烦。 
 
所以,我建议开发组不使用Shell而直接采用原来静态页面的配置,但是Tapestry对URL进行了处理而且使用Servlet之后相对路径往往会出问题,为此提供了一个简单Base组件,在HEAD中增加一个base标签即可。 
如页面头部如下: 
<html> 
<head> |    
 |   
   
| 
  [Tapestry]Tapestry中Sumbit/ImageSubmit的属性selected和tag 软件技术 
lhwork 发表于 2006/7/11 17:54:44   |  
		个人认为Submit/ImageSubmit标准组件的两个属性selected和tag的设置比较罗嗦,可能是性能和灵活性的一种权衡吧。 
其中,selected指定页面类的一个属性,tag设置该页面属性的值。selected和tag组合起来可以使页面类知道用户点击了哪个提交按钮。
Tapestry已经将多个提交按钮绑定于不同的监听方法上,似乎在很多web应用中并不需要知道用户点击了哪个提交按钮。 
我现在正在做的项目却需要根据不同的提交按钮而进行不同的数据校验! 
此时,我的实现方法是 
1,SubBasePage中提供一个属性submitName用于保存用户点击的提交按钮的名字。 
2,修改AbstractSubmit的handleClick方法: 
if (cycle.getPage() instanceof SubBasePage) { 
         &n |    
 |   
   
| 
  [Tapestry]Tapestry中配置文件page的简化处理 软件技术 
lhwork 发表于 2006/7/11 17:54:20   |  
Tapestry每个页面基本上都需要一个.page的配置文件,因为需要对模板HTML的动态内容部分进行配置,这是为静态页面和动态内容更好的分工,确实需要这么做。 
但是,每个page文件的典型配置如下: 
<page-specification class="..."> 
  <property...> 
  <bean name="delegate" ...> 
  <component ...> 
  <asset ...> 
</page-specification> 
 
其中<component...>部分我觉得是必须的,HTML上输入域只需要增加一个jwcid=...即可,其它配置写入page文件中较好。
<property...>部分作者文档推荐这么做,这一部分也可以写入page中; |    
 |   
   
| 
  [Tapestry]Tapestry的数据校验功能-修改框架初试 软件技术 
lhwork 发表于 2006/7/11 17:53:34   |  
		
		上篇文章的做法,不需要修改tapestry框架,但是前端javascript的校验功能丢失了。可以满足只需要后端校验的需要。 
本文对“配置一次,前后都用”的理想模式进行实现,经测试表明成功了! 
 
1,需要修改以下几个类和文件: Body.java 
Form.java 
AbstractSubmit.java 
Submit.java 
ImageSubmit.java 
Submit.jwc 
ImageSubmit.jwc 
 
BaseValidator.java 
MinLength.java 
...... 
 
2,增加BasePage的子类: 
SubBasePage.java,其中增加一属性submitName,保存提交组件的名字,用以各validator根据提交组件的名字决定是否需要进行校验。 
 
3,page中对各个输入组件配置validators时也发生了变化: 
如,minLe |    
 |   
   
| 
  [Tapestry]Tapestry数据校验-修改各Validator 软件技术 
lhwork 发表于 2006/7/11 17:52:58   |  
		
		
		1,BaseValidator的修改非常简单,增加了一个submitName属性及其getter和setter。用于保存校验器适用的提交按钮的ID。 
// whether skip this validator 
    public boolean isSkipValid(IFormComponent field) { 
        IPage page = field.getPage(); 
        return (page instanceof
XtradeBasePage && this.getSubmit |    
 |   
   
| 
  [Tapestry]Tapestry数据校验-修改Required Validator 软件技术 
lhwork 发表于 2006/7/11 17:52:30   |  
		
		
		Required的修改遇到麻烦事,因为BaseValidator有一个方法isRequired,这样增加一个属性required的getter和
setter,page文件中设置required=searchId时,总是去匹配isRequired方法,这样出现字符串转换为布尔型错误。 
为了对其它校验器不产生影响,我增加了一个校验器Required2,配置时required2=searchId。 
同时,required类型的校验器本来不需要参数,所以现在参数值就是提交按钮的ID,因而可以使用BaseValidator的submitName属性。代码如下: 
public class Required2 extend |    
 |   
   
| 
  [Tapestry]Tapestry存在多个提交按钮时设定按回车键动作的方法 软件技术 
lhwork 发表于 2006/7/11 17:51:56   |  
		
		
		
		
		浏览器的两个默认处理: 
1,当表单存在多个提交按钮,用户按下回车键,浏览器默认是提交左上角那个按钮; 
2,如果在javascript中document.forms[0].submit()则同样提交表单,但不传递任何提交按钮的信息。 
 
用户可能会要求设置一个默认提交按钮,而不是浏览器默认的动作。如果用户在页面上按回车键,则相当于点击其中一个提交按钮。 
 
本文提供了解决回车键提交问题(兼容Firefox和IE)的办法。 
 
1,首先提供了javascript代码,Script类; 
 |    
 |   
   
| 
  [Tapestry]Tapestry数据校验-修改Body.java和Body.js 软件技术 
lhwork 发表于 2006/7/11 17:51:06   |  
		1,Body.java: 
protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) { 
        TapestryUtils.storePageRenderSupport(cycle, this); 
       
        this.addExternalScript(TapestryUtil.getResource(
       |    
 |   
 
 
  |