tapestry50.docx
- 文档编号:23383917
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:68
- 大小:36.68KB
tapestry50.docx
《tapestry50.docx》由会员分享,可在线阅读,更多相关《tapestry50.docx(68页珍藏版)》请在冰豆网上搜索。
tapestry50
tapestry5.0之页面组件
关键字:
tapestry5
一、页面组件定义方式
1.在模板(tml)文件中明确定义
textfieldt: value="message"/> 这种方式不能在Dreamweaver中预览。 2.在模板文件中隐示定义 type="textfield"t: value="message"/> type="PageLink"t: page="Another">GotoAnotherpage 3.在页面类中定义 (1)tml中为: id="theLink">GotoAnotherpage id="theTextBox"/> (2)在类文件中用annotations来明确组件 @Component(parameters={"page=Another"}) privatePageLinktheLink; @Component(parameters={"value=message"}) privateTextFieldtheTextBox; 二、页面间传值 假定要将一个字串传给Another页面,Another定义如下: publicclassAnother{ privateStringpassedMessage; publicStringgetPassedMessage(){ returnpassedMessage; } publicvoidsetPassedMessage(StringpassedMessage){ this.passedMessage=passedMessage; } } 1.简单传值方式 @InjectPage privateAnotheranother; @OnEvent(value="submit",component="userInputForm") ObjectonFormSubmit(){ another.setPassedMessage(message); returnanother; } 运行正常,但当浏览器重新请求页面时,传递的数据将丢失。 因为Tapestry页面池在更新Another实例时,它不知道你有数据要传到这个页面。 2.将属性域持久化 @Persist privateStringpassedMessage; 这种方式最简单,它将把我们传给persistentproperty中的值,存储在HttpSession中。 这种方式有副作用,一是大量用户同时访问时占内存,二是Session到期失效。 另外每次请求这个页面,Tapestry都会putthevaluestoredforitinthesessionintothatproperty,nomatterwhatinstanceofthepage isbeingused。 3.使用pageactivationcontext 这是Tapestry5专门定义的页面传值方式。 增加方法onActivate和onPassivate,它们将在Http请求生命期中的一个适当时候被Tapestry调用。 /*TheonActivatemethodisinvokedeverytimethepageisloaded *itmightbetocheckwhethertheuserwhotriestoaccessthepage*wassuccessfullyauthenticated */ voidonActivate(Stringmessage){ System.out.println("Anotherpageisactivated! Themessageis: "+message); this.passedMessage=message; } StringonPassivate(){ System.out.println("Anotherpageispassivated..."); returnpassedMessage; } 在第一个页面实例放入到页面池之前,Tapesty将检查页面是否使用了activationcontext(theactivationcontextbyimplementingthepairofmethods,onActivateandonPassivate),如果用了,就调用页面实例的onPassivate方法。 Tapestry将记住onPassivate的返回值,并立刻使用页面的另一个新实例,将记录下的值作为参数传递给新实例的onActivate方法。 这样就达到了传值目的。 这种方式不用将值存在Session中,而是记录在URL中的。 如: http: //localhost: 8080/t5first/another/hi+there%21 (ThemessagewasrecordedintotheURLwhileredirectingtheuser'sbrowser) 三、ApplicationStateObject 在Tapestry中,应用程序的每个页面可以使用的对象被称为ApplicationStateObject(ASO)。 通常,这些是有特殊使用目的的数据对象。 假如定义了一个User类: publicclassUser{ publicStringgetFirstName(){ returnfirstName; } publicvoidsetFirstName(StringfirstName){ this.firstName=firstName; } publicStringgetLastName(){ returnlastName; } publicvoidsetLastName(StringlastName){ this.lastName=lastName; } } 1.createaprivatefieldofthetypeUserandmarkitwiththe@ApplicationStateannotation,如在登录页面定义后,在成功登录时写入相应的人员信息。 @ApplicationState privateUseruser; Tapestry将在第一次请求ASO时,创建此ASO的实例。 也就是说无论什么时候请求ASO,他将一直存在,不为空。 默认情况下,ApplicationStateObjects存储在Session中。 这就意味着,如果session还不存在,那么当第一次请求ASO时,它才会被创建。 2.在页面中使用 各个页面可以定义不同的private域,它们都指向同一个ApplicationStateObject。 @ApplicationState privateUsercurrentUser; publicUsergetCurrentUser(){ returncurrentUser; } Theuseris${currentUser.firstName}${currentUser.lastName} 3.检查ASO是否已经存在 定义一个boolean类型的ASO域,它的名称为ASO域加Exists组成。 一旦有请求ASO,它将被Tapestry实例化。 这个boolean域被置为true,在这之前为false。 以user为例: privatebooleanuserExists; publicbooleangetUserExists(){ returnuserExists; } ift: test="userExists"> Theuseris${user.firstName}${user.lastName}
if>
四、Prefixes:
propandliteral
acomponent'spropertiescanhaveeitheraproporliteraldefaultprefix.Say,thelabelpropertyoftheTextFieldcomponenthasthedefaultprefixliteral,whilethevaluepropertyofthesamecomponenthasthedefaultprefixprop.
t:
label="UserName"与t:
label="literal:
UserName"等价。
t:
label="prop:
theLabel"
InthiscaseTapestrywilllookforthegetTheLabelmethodinthepageclassandusewhateverthatmethodreturnsasthelabel.
tapestry5.0之Grid
1.tml文件
layoutxmlns: t="http: //tapestry.apache.org/schema/tapestry_5_0_0.xsd"> beaneditformt: id="user"submitlabel="CreateUser"object="user"/> gridsource="users"row="user"rowsPerPage="5"pagerPosition="bottom"empty="nodata" t: rowClass="literal: evenodd"add="operation"> parametername="userNameCell"> pagelinkpage="user/edit"context="user.id">${user.userName} pagelink> parameter> parametername="operationCell"> actionlinkt: id="delete"context="user.id">Delete actionlink> parameter> grid>ListUsers
layout>
2.java文件
packagecom.logcd.tapestry5.myapp.pages.user;
importjava.util.List;
importorg.apache.tapestry5.annotations.IncludeStylesheet;
importorg.apache.tapestry5.ioc.annotations.Inject;
importcom.logcd.myapp.dao.UserDao;
importcom.logcd.myapp.models.User;
@SuppressWarnings("unchecked")
@IncludeStylesheet("classpath:
com/logcd/tapestry5/myapp/pages/user/CreateUser.css")
publicclassCreateUser{
privateUseruser;
@Inject
privateUserDaouserDao;
publicCreateUser(){}
publicvoidsetUser(Useruser){
this.user=user;
}
publicUsergetUser(){
returnuser;
}
ObjectonSuccess(){
user.setPhones(null);
userDao.save(user);
returnCreateUser.class;
}
voidonActionFromDelete(longuserId){
userDao.delete(userDao.findById(userId));
}
publicList
}
3.properties文件
#定义表头文本
operation-label=操作
userName-label=用户名称
emailAddress-label=电子邮箱
birthday-label=出生日期
role-label=角色
也可以在java文件中定义表头
@Inject
privateBeanModelSourcebeanModelSource;
@Inject
privateComponentResourcescomponentSources;
@Inject
privateMessages_messages;
privateBeanModeluserBeanModel;
publicBeanModelgetUserBeanModel(){
returnbuildUserBeanModel(beanModelSource,componentSources);
}
publicBeanModelbuildUserBeanModel(BeanModelSourcebeanModelSource,ComponentResourcescomponentSources){
if(userBeanModel==null){
userBeanModel=beanModelSource.createEditModel(User.class,_messages);
userBeanModel.get("userName").label("用户名");
userBeanModel.get("emailAddress").label("电子邮箱");
userBeanModel.get("birthday").label("出生日期");
userBeanModel.get("role").label("角色");
userBeanModel.add("operation",newLogcdPropertyConduit()).label("操作");
}
returnuserBeanModel;
}
同时给grid标签加上model="userBeanModel"就可以了。
publicclassLogcdPropertyConduitimplementsPropertyConduit{
publicObjectget(Objectarg0){
return"";
}
@SuppressWarnings("unchecked")
publicClassgetPropertyType(){
returnString.class;
}
publicvoidset(Objectarg0,Objectarg1){
}
public
returnnull;
}
}
4.css文件
table.t-data-grid{
border-collapse:
collapse;
border-left:
1pxsolidsilver;
width:
100%;
}
table.t-data-gridtheadtrth{
background:
#990000
color:
white;
text-align:
center;
vertical-align:
middle;
font-size:
10px;
}
div.t-data-grid-pagerspan.current{
background:
#FFFFFFnonerepeatscroll0%;
border:
1pxsolid#CCCCCC;
color:
#CCCCCC;
padding:
2px5px;
text-decoration:
none;
}
div.t-data-grid-pagera:
hover{
background:
#CC0000nonerepeatscroll0%;
color:
#FFFFFF;
}
div.t-data-grid-pagera{
border:
1pxsolidsilver;
color:
#CC0000;
font-size:
medium;
margin-right:
5px;
padding:
2px5px;
text-decoration:
none;
}
div.t-data-grid-pagerspan.current{
border:
1pxsolidsilver;
color:
black;
font-size:
medium;
margin-right:
5px;
padding:
2px5px;
text-decoration:
none;
}
.evenodd{
line-height:
23px;
background-color:
expression((this.sectionRowIndex%2==0)?
"#E6EFF7":
"#F4F8FF");
}
.userName,.operation,.birthday,.role{
text-align:
center;
vertical-align:
middle;
}
∙16:
55
∙浏览(629)
∙评论(0)
∙分类:
Tapestry/Wicket/JSF2
2009-02-11
缩略显示
Tapestry5自定义组件
关键字:
tapestry5
一、普通组件
1.java文件
packageponents;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.tapestry5.ComponentResources;
importorg.apache.tapestry5.annotations.Parameter;
importorg.apache.tapestry5.annotations.Property;
importorg.apache.tapestry5.ioc.annotations.Inject;
publicclassNavBar{
@Parameter(defaultPrefix="literal",required=true)
privateStringpages;
@Inject
privateComponentResourcesresources;
@Property
privatePage_pageAttr;
publicList
List
String[]pageArr=pages.split(",");
for(inti=0;i Pagepage=newPage(); page.setName(pageArr[i].split("=")[0]); page.setUrl(pageArr[i].split("=")[1]); pageList.add(page); page=null; } returnpageList; } publicStringgetTabClass(){ if(_pageAttr.name.equalsIgnoreCase(resources.getPageName())) return"current"; returnnull; } publicclassPage{ privateStringname; publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetUrl(){ returnurl; } publicvoidsetUrl(Stringurl){ this.url=url; } privateStringurl; } } 2.NavBar.tml t="http: //tapestry.apache.org/schema/tapestry_5_0_0.xsd"> loopsource="pageNames"value="pageAttr"> [ pagelinkpage="${pageAttr.url}">${pageAttr.name} pagelink>] loop> 3.页面使用 type='NavBar'pages="首页=Index,用户管理=user/CreateUser"/> 二、布局模板组件 1.java文件 packageponents; importorg.apache.tapestry5.annotations.IncludeStyleshee
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- tapestry50