Tapestry5.3.8 创建和定制BeanModel控制Grid的操作

Tapestry5.3.8 Grid组件的用法,整理出来的代码,以备后用;

1、页面Java类:

// [用户实体模型 START]
	@Inject
	private BeanModelSource beanModelSource;
	@Inject
	private ComponentResources componentResources;
	@Inject
	private Messages messages;
	private BeanModel<People> peopleBeanModel;

	public BeanModel<People> getPeopleBeanModel() {
		if (peopleBeanModel == null) {
			peopleBeanModel = beanModelSource.createEditModel(People.class,
					messages);
			peopleBeanModel.get("name").label("用户名");
			peopleBeanModel.get("age").label("年龄");
			peopleBeanModel.get("gender").label("性别");
			peopleBeanModel.get("birthday").label("生日");
			peopleBeanModel.get("hobby").label("兴趣爱好");
			peopleBeanModel.add("view", new selfPropertyConduit()).label("详情");
			peopleBeanModel.add("delete", new selfPropertyConduit())
					.label("删除");
		}
		return peopleBeanModel;
	}

	class selfPropertyConduit implements PropertyConduit {

		/*
		 * (non-Javadoc)
		 *
		 * @see
		 * org.apache.tapestry5.ioc.AnnotationProvider#getAnnotation(java.lang
		 * .Class)
		 */
		@Override
		public <T extends Annotation> T getAnnotation(Class<T> arg0) {
			// TODO Auto-generated method stub
			return null;
		}

		/*
		 * (non-Javadoc)
		 *
		 * @see org.apache.tapestry5.PropertyConduit#get(java.lang.Object)
		 */
		@Override
		public Object get(Object arg0) {
			// TODO Auto-generated method stub
			return "";
		}

		/*
		 * (non-Javadoc)
		 *
		 * @see org.apache.tapestry5.PropertyConduit#getPropertyType()
		 */
		@SuppressWarnings("rawtypes")
		@Override
		public Class getPropertyType() {
			// TODO Auto-generated method stub
			return String.class;
		}

		/*
		 * (non-Javadoc)
		 *
		 * @see org.apache.tapestry5.PropertyConduit#set(java.lang.Object,
		 * java.lang.Object)
		 */
		@Override
		public void set(Object arg0, Object arg1) {
			// TODO Auto-generated method stub

		}

	}
	// [用户实体模型 END]

2、页面 tml模板:

<t:grid source="peoples" row="people" model="peopleBeanModel" rowsPerPage="10">
		<t:parameter name="nameCell">
			<t:pagelink page="edit" context="people.id">${people.name}</t:pagelink>
		</t:parameter>
		<t:parameter name="viewCell">
			<t:actionlink t:id="view" context="people.id" zone="viewZone">View</t:actionlink>
		</t:parameter>
		<t:parameter name="deleteCell">
			<t:actionlink t:id="delete" context="people.id">Delete</t:actionlink>
		</t:parameter>
	</t:grid>

注意事项:

1、元素的name决定了需要覆写处理方式的属性,而name的命名规则是在属性名的后面加上后缀Cell(此外,表格中每列的属性名也可以通过添加Header前缀进行覆写)

2、本例中的元素名为nameCell,因此,Grid组件将通过PageLink组件来处理表格中包含用户名的列。PageLink组件显示的HTML链接将用户导向在page参数中指定的页面,调用这个指定的页面所需的额外信息则在 context参数中定义。本例中,编辑用户资料的是Edit页面,调用该页面时还需要传递一个用户id参数。此外,还需要一个属性来存储即将被编辑的用户对象才能在调用编辑页面的时候传递该用户对应的name和id值。为了实现这个目的,我们需要在Start类中添加一个叫做user的属性,再把这个新建属性捆绑到Grid组件的row参数上。

3、页面的表格中添加一个不属于User类属性的列;Grid组件通过先生成一个BeanModel来决定如何显示一个bean,例如本例中的User对象。我们可以通过创建和定制这个BeanModel来完完全全地控制Grid的操作方式

4、在Start页面的模板中,我们还需要修改另外两处:首先要显示地告知Grid组件它应该应用哪个模型。其次,为显示这个新添加的delete列提供一个定义。ActionLink组件可以用来监控什么时候用户作出了删除某个用户记录的指令。在收到这个指令的时候,ActionLink会触发Start页面上的一个事件。通过为该事件函数提供特殊命名来观察这个事件。通常来说,id为“delete”的组件在被触发了某个action的时候会调用名为 onActionFromDelete()的函数

5、究竟要删除的是哪个用户记录?这时候我再一次需要将用户的id作为上下文参数传递,id的值会作为参数传递给所触发的事件处理函数

6、事件处理函数没有必要一定是公有的,其实最好的选择是作为整个类包的私有函数(也就是函数不需要显式声明修饰符)。Tapestry可以调用这样的函数,同时同一个类包中的其它类也能够调用该函数(比如单元测试),但这个函数并不属于该页面类的公共API

时间: 2024-10-07 09:57:25

Tapestry5.3.8 创建和定制BeanModel控制Grid的操作的相关文章

3.11 手工创建采购订单价格控制

3.11.1   业务方案描述 对Oracle标准<采购订单>界面进行手工下达时进行价格控制. 对于手工创建采购的订单,不希望通过输入采购价格,而是需要从一揽子采购协议中直接获取价格.如果没有协议价格,需要取该物料的标准成本. 3.11.2   业务方案逻辑控制 1. 单价取值逻辑: 1) 按照订单上的供应商.供应商地点.物料编码自动查找一揽子采购协议,用创建日期与一揽子采购协议上的日期分段匹配价格. 2) 如果找不到,则取一揽子协议行上的价格. 3)如果取不到,取该物料编码标准成本. 4)如

spring创建Bean对象的控制

1.spring创建Bean对象的控制 a.控制对象创建方式(使用范围),在<bean>元素中使用scope属性控制,scope可以支持singleton或prototype,默认值是singleton <bean scope= "singleton"> 该组件在spring容器里只有一个bean对象.每次取出的bean都是同一个bean,相当于单例模式 <bean scope = "prototype">该组件每次使用getBe

Android 创建Library Project(库项目)与引用操作

由于在开发过程,为了实现未曾了解的某种效果与特定功能,而求助于网上优秀的开源项目,在使用过程中发现引用开源的Library Project(库项目),的确可以解决很多问题,而且也给出了一种思路,好的软件公司也需要有自己的Library Project(库项目),这样不必要进行重复开发工作,这只是自己的想法.下面将自己的心得或体会记录如下,以下是自己的编写风格. [转载使用,请注明出处:http://blog.csdn.net/mahoking/article/details/36405219]

数据库防火墙——实现数据库的访问行为控制、危险操作阻断、可疑行为审计

转自百度百科 数据库防火墙系统,串联部署在数据库服务器之前,解决数据库应用侧和运维侧两方面的问题,是一款基于数据库协议分析与控制技术的数据库安全防护系统.DBFirewall基于主动防御机制,实现数据库的访问行为控制.危险操作阻断.可疑行为审计. 数据库安全技术之一,数据库安全技术主要包括:数据库漏扫.数据库加密.数据库防火墙.数据脱敏.数据库安全审计系统. 数据库安全风险包括:刷库.拖库.撞库. 数据库安全攻击手段包括:SQL注入攻击. 简介 数据库防火墙技术是针对关系型数据库保护需求应运而生

K8S的名称空间创建&amp;&amp;版本的升级、回滚操作(回滚到指定版本)

创建一个私有仓库. #运行一个registry容器 [[email protected] ~]# docker run -tid --name registry -p 5000:5000 --restart always registry:latest #在所有需要使用私有仓库的的节点上进行以下配置: [[email protected] ~]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H un

利用 jQuery UI 和 Ajax 创建可定制的 Web 界面

如今,网站比以往更具可定制性,允许用户更改其空间,根据自己的喜好对其进行个性化.个性化的主页或仪表板页面(例如 iGoogle.MyYahoo! 和 MyAOL)日渐普及,大多数 Web 应用程序内甚至也整合了类似的功能.jQuery 库简化了此类复杂 JavaScript 交互的编写,随着 jQuery UI 的引入,这项功能得到了进一步的简化,该库以易于访问的 jQuery 插件的形式提供了常用用户界面类型. 本文介绍了如何利用 Ajax 和 jQuery UI 创建具有各种定制功能的高度可

【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行

背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比如最大在100Mb/s,如果直接启动100个scp,则又会遇到ssh的并发连接数限制. 所以需要控制并发数,即不超过ssh的并发限制,又要让单网卡上的带宽接近饱和,尽快完成传输(假设专线带宽远大于单机网卡带宽) 实现 之前知道通过mkfifo创建一个命名管道,可以实现对并发的控制.现在来实现一个.

Kibana多用户创建及角色权限控制

1 介绍 ELK日志管理属于基础设施平台,接入多个应用系统是正常现象,如果接入多个系统的索引文件没有进行权限划分,那么很大程度会出现索引文件误处理现象,为了避免这种情况发生,多用户及权限设置必不可少. 通过Filebeat采集应用日志,发送到redis(或者kafka),通过在filebeat.yml中设置fields.log_type属性来确定是哪个应用生成的日志文件,然后在logstash中针对不同的fields.log_type发往elasticsearch时创建不同的索引文件. 针对不同

8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解

本篇目录 管理数据库创建 管理数据库连接 管理数据库初始化 填充种子数据 LINQ to Entities详解 什么是LINQ to Entities 使用LINQ to Entities操作实体 LINQ操作 懒加载和预加载 插入数据 更新数据 删除数据 本章小结 本人的实验环境是VS 2013 Update 5,windows 10,MSSQL Server 2008. 上一篇<Code First开发系列之领域建模和管理实体关系>,我们主要介绍了EF中“约定大于配置”的概念,如何创建数据