`
hxzon
  • 浏览: 17889 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

tapestry5初体验 -hxzon

阅读更多
tapestry5初体验 -hxzon

-------------------------------------------------

1,生成的URL很友好。漂亮的URL使用了两次请求的机制,不严重影响性能的情况下觉得值得。

2,用@OnEvent(value=EventConstants.ACTIVATE)获取页面参数,而用@SetupRender初始化数据。

@OnEvent(value = EventConstants.PASSIVATE)

3,编辑页面,用@OnEvent(value=EventConstants.ACTIVATE)获取编辑对象的ID并初始化非常惬意,比struts2的两次parameter拦截舒服得多。

4,组合搜索物料,表单获取参数,通过两次请求机制,重写的url带有搜索条件,可被收藏。

     //init()->initalize->onPassivate->init(xxx)->display
    public Object initialize(Material material,long size,long first){
        this.material=material;
        page.setPageSize(size);
        page.setCurrentPage(first);
        return this;
    }
   
    @OnEvent(value=EventConstants.ACTIVATE)
    Object init(){
        return null;
    }
   
    @OnEvent(value=EventConstants.ACTIVATE)
    Object init(String code, String name, String spec, String desc, String pcb, String state,
            String foot, String brand, String supplier, String remark,long size,long first){
        this.material=MaterialUtil.toMaterial(code, name, spec, desc, pcb, state, foot, brand, supplier, remark);
        page.setPageSize(size);
        page.setCurrentPage(first);
        return null;
    }
   
    @SetupRender
    Object display(){
        if(material!=null){
            page.setRowCount(materialSer.countLike(material));
            list=materialSer.getLike(material, page.getCurrentRow(), page.getPageSize());
            logger.debug("search result size:"+page.getRowCount());
        }
        return null;
    }
   
    @OnEvent(value=EventConstants.PASSIVATE)
    Object onPassivate(){
        return MaterialUtil.toUrl(material, page.getPageSize(), page.getCurrentPage());
    }

5,捕获异常。

     Object onException(Throwable cause) {
        logger.error("error", cause);
        // ComponentEventException
        message = cause.getMessage();
        if (cause.getCause() instanceof AuthenticationException) {
            return login;
        }
        return this;// null
    }

6,URL中含有空格等,通过URLRewriterRule可以解决,即把路径中的空格都去除。

7,一开始不知道用方括号来传递URL的onActivate参数。

<t:pagelink page="bom/list" context="[50,1]">

--------------------------------------------------

css,js,图片的路径

2,tapestry使用/assets/来处理css,js,图片路径,但是js中的图片路径无法被处理。

不过这个问题可以用URLRewriterRule来解决,即把对图片的请求改写为/assets/请求。

3,/assets/存在安全漏洞,可以用它输出WEB-INF下的文件。

这个问题也可以用URLRewriterRule来解决,即把对WEN-INF下的文件请求改写到其它路径。

---------------------------------------------------

1,页面类注入    @Inject
    private HttpServletRequest request;即可发送和读取cookie。

需注意cookie的路径,例如设为"/",否则可能读取不到。

2,使用@Persist和@SessionState来存储会话数据很方便。

---------------------------------------------------

组件

1,通用库的添加。希望改为有顺序的配置,这样可以有同名组件,例如用我的扩展的textfield组件替换掉自带的textfield组件。

     public static void contributeComponentClassResolver(Configuration<LibraryMapping> configuration) {
        configuration.add(new LibraryMapping("core", "org.hxzon.tapestry5"));
    }

2,上传用Upload组件,但是一个参数名只能上传一个文件。不过自己写一个参数名上传多个文件的组件非常容易。

3,下载也很容易,return new FileStreamResponse(upload.getFileName(), upload.getFileType(), targetFile);即可。

4,Grid组件很强大,不过一开始没看到怎么重写grid的标题栏,甚至以为得自己写一个组件覆盖或封转它,直到看源代码才发现不用。


org.apache.tapestry5.corelib.components.GridColumns
    public Block getBlockForColumn()
    {
        Block override = overrides.getOverrideBlock(columnModel.getId() + "Header");
        if (override != null) return override;
        return standardHeader;
    }
//================================
public class GridCell extends AbstractPropertyOutput
{
    Object beginRender(MarkupWriter writer)
    {
        return renderPropertyValue(writer, getPropertyModel().getId() + "Cell");
    }
}

5,用layout组件完成页面模板的功能,但是只有<t:body />,没有与sitemesh类似的<t:head/>和<t:title/>。不过通过在layout组件中添加title参数,并在页面使用时传进可类似解决。

但还是喜欢sitemesh,sitemesh是制定规则,然后符合规则的会被应用模板,而tapestry必须每个页面写上这个layout组件,像struts1的Tiles一样。

6,使用@Property注解,省掉了很多getter和setter方法,看起来比较简洁,不过也有一定不便。

@Property强制为private,希望可以放宽至protected。也希望在存在getter或setter时就不要再动态生成该方法,而不是抛出错误。

7,想给textfield组件添加trim功能时发现需要覆盖protected void processSubmission(String elementName)方法,

这时发现所要用的属性都是private的,并且没有getter和setter方法,以为要另起炉灶。

不过尝试发现,只要把属性复制一遍到子类中即可,不会报错。

8,textfield组件把空字符串变为null,替换NullFieldStrategy即可。

     public static void contributeNullFieldStrategySource(MappedConfiguration<String, NullFieldStrategy> configuration) {
        configuration.override("default", new EmptyNullFieldStrategy());
    }

9,struts2中通过parameter拦截器可以统一对所有参数进行拦截处理,tapestry通过对textfield组件的值处理,以及用URLRewriterRule,

也算是能进行统一的处理。

10,if组件功能较弱,因为原先使用ognl动态调用效率太低,不过自己还是写了一个ognlIf。

11,没有CheckboxGroup,自己写了一个,也是用ognl完成的。

12,写了一个分页的组件,SplitPageBar,基于简单的URL。


-------------------------------------------------------

模板

1,表达式用惯了ognl,jsp,所以tapestry的表达式感觉比较弱。
分享到:
评论

相关推荐

    tapestry-bin-5.1.0.5

    5. **tapestry-upload-LICENSE.txt**:关于Tapestry中文件上传功能的许可信息,帮助开发者处理用户通过表单提交的文件。 6. **tapestry-spring-LICENSE.txt**:Tapestry与Spring框架集成的许可,Spring是一个广泛...

    tapestry-project-4.1.5

    在"tapestry-project-4.1.5"这个压缩包中,我们有机会深入探索 Tapestry 4.1.5 版本的特性和应用。 首先,让我们关注"Tapestry-libraries"这个文件夹。它包含了Tapestry 框架运行所需的各种库文件,这些库文件是...

    apache-tapestry-5.3.8-bin.zip

    `apache-tapestry-5.3.8-bin.zip` 是Apache Tapestry 5.3.8版本的二进制发行包,包含了运行和开发Tapestry应用所需的各种库文件。 1. **Tapestry框架**:Tapestry是由Howard Lewis Ship创建的一个MVC(Model-View-...

    Tapestry5和jQuery集成tapestry5-jquery.zip

    Tapestry5和jQuery集成.使用jQuery以极少的兼容问题完全替换Prototype 和 Scriptaculous库 标签:tapestry5

    apache-tapestry-5.3.7-bin.zip

    `tapestry-jpa-5.3.7.jar`和`tapestry-hibernate-5.3.7.jar`则与持久层集成有关,它们支持JPA(Java Persistence API)和Hibernate ORM框架,使开发者能够轻松地在Tapestry应用中处理数据库操作。 总的来说,Apache...

    tapestry-ioc-5.0.3-src

    在"tapestry-ioc-5.0.3-src"这个压缩包中,我们可能找到Tapestry IOC框架的源代码,这对于开发者深入理解其工作原理和定制功能非常有价值。 1. **依赖注入(DI)**:Tapestry IOC的核心概念就是DI,它允许对象在...

    tapestry-spring-5.2.6.jar

    tapestry-spring-5.2.6.jar,java spring框架依赖,可以直接使用

    tapestry-bin-5.0.14.zip

    标题中的“tapestry-bin-5.0.14.zip”指的是Tapestry的最新版本5.0.14的二进制发行包,它包含了开发人员构建基于Tapestry应用所需的所有组件和库。 Tapestry 5.0.14的发布旨在提供更加稳定和高效的开发环境,为...

    优化大使tapestry-bin-5.0.18.zip

    这个压缩包包含了多个以"Tapestry"开头的子文件,如 "tapestry-core", "tapestry-hibernate", "tapestry-ioc", "tapestry-upload", 和 "tapestry-spring",这些都是Tapestry框架的不同模块或插件。这些文件的后缀是...

    tapestry教程资料文档合集

    Tapestry5最新中文教程.doc 作者 Renat Zubairov & Igor Drobiazko译者 沙晓兰 发布于 2008年7月2日 下午9时30分 社区 Java 主题 Web框架 ----------------------------------------- Tapestry5.1实例教程.pdf ...

    Tapestry-3-Getting Started.doc

    - **项目名称**:Tapestry-3-Getting Started - **项目目标**:开发一个基于Web的货币转换器应用。 - **技术栈**:Tapestry 3、Eclipse IDE、Apache Tomcat。 #### 二、开发环境搭建 ##### 1. Eclipse IDE安装 - **...

    tapestry5 build web application-alexander

    《Tapestry 5:构建Web应用程序》是关于Tapestry 5框架的一本权威指南。Tapestry 5是一个强大的Java Web应用框架,由Apache软件基金会开发并维护,它致力于提供一种更高效、更优雅的方式来构建动态、交互式的Web应用...

    tapestry-monitoring-1.0.1.zip

    在压缩包"tapestry-monitoring-master"中,我们可以期待找到项目的源代码、文档和可能的构建脚本。源代码将展示如何与Tapestry5集成,并通过JMX提供监控数据。这通常包括配置文件、MBean的实现以及与Tapestry5交互的...

    Tapestry4.1.2 入门-介绍

    【Tapestry4.1.2 入门-介绍】 Tapestry 是一个基于Java的Web应用程序框架,它提供了一种面向组件的开发方式,极大地简化了Web应用的构建过程。在Tapestry中,开发者无需关注HTTP请求的处理细节,如链接、请求流向和...

    tapestry-src-5.1.0.5.zip

    包含: tapestry 的源代码, tapestry集成spring2.0 tapestry快速启动 tapestry upload tapestry hibernate tapestry annotations

    Tapestry5最新中文入门实例教程

    本教程旨在通过实际案例帮助读者掌握Tapestry 5的基本概念和核心功能,并体验其带来的高效开发流程。 #### 二、Tapestry 5简介 Tapestry 5作为Tapestry系列的新版本,继承了前代的优秀特性,并在此基础上进行了多项...

    tapestry5中文文档

    Tapestry 5 强调易用性,不仅对终端用户友好,同时也优化了开发者的体验。它具有类重载特性,允许开发者在修改代码后立即看到效果,无需重新部署。此外,Tapestry 提供详细的异常报告,有助于快速定位和解决问题。 ...

    Tapestry-3.0.4-bin.zip

    这个是开发tapestry3所用的JAR包

Global site tag (gtag.js) - Google Analytics