Tapestry4应用指南-安装及实例

本文档详细介绍了Tapestry4的安装步骤,包括ApplicationServlet配置、库文件添加和新建Home页面。此外,还展示了如何创建一个简单的登录实例,涉及页面模板、页面规范和页面类的编写,以及服务端校验的实现。通过实例,读者将理解Tapestry4的组件使用和绑定机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.安装

1.1.ApplicationServlet配置
在应用配置文件web.xml中增加

<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE web-app
      PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
      "http://java.sun.com/dtd/web-app_2_3.dtd"
>

< web-app >
  
< display-name > Tapestry Tutorial: Hello </ display-name >
  
< servlet >
    
< servlet-name > tapestryGuide1 </ servlet-name >
    
< servlet-class > org.apache.tapestry.ApplicationServlet </ servlet-class >
    
< load-on-startup > 0 </ load-on-startup >
  
</ servlet >
  
< servlet-mapping >
    
< servlet-name > tapestryGuide1 </ servlet-name >
    
< url-pattern > /app </ url-pattern >
  
</ servlet-mapping >
</ web-app >

1.2增加tapestry所需Jar包

backport-util-concurrent-3.1.jar
commons-beanutils-1.7.0.jar
commons-codec-1.3.jar
commons-fileupload-1.2.jar
commons-io-1.4.jar
commons-lang-2.3.jar
commons-logging-1.0.3.jar
commons-pool-1.4.jar
hivemind-1.1.1.jar
hivemind-lib-1.1.1.jar
javassist-3.6.ga.jar
ognl-2.7.2.jar
oro-2.0.8.jar
tapestry-contrib-4.1.5.jar
tapestry-framework-4.1.5.jar

1.3新建Home页面

< html >
  
< head >
    
< title > Tutorial: HelloWorld </ title >
  
</ head >
  
< body >
    
< h1 > HelloWorld Tutorial </ h1 >
    
< p >
  The current data and time is: 
  
< strong >< span  jwcid ="@Insert"  value ="ognl:new java.util.Date()" > June 26 2005 </ span ></ strong >
</ p >     

< p >
  
< href ="#"  jwcid ="@PageLink"  page ="Home" > refresh </ a >
</ p >
    
  
</ body >
</ html >

1.4页面规范Home.page

<? xml version="1.0" encoding="UTF-8"  ?>
<! DOCTYPE page-specification PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 4.1//EN"
  "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_1.dtd"
>
< page-specification >
</ page-specification >

1.5小结

以上的页面模板,页面规范,页面类及后面例子中的应用配置文件 位于应用WEB-INF目录下

Tapestry页面模板就是在普通的HTML文件中给对应DOM元素增加jwcid属性,可以利用HTML设计
工具打开,真正做到"所见即所得".
jwc是java web component的简写
jwcid值有三种情况
假设要展现一表示用户名(username)的输入域,有如下三种方式
a.<input type="text" jwcid="username" size="20"/>
jwcid="username" 指定名称为username的组件,其定义在页面规范中定义
中如
<component id="username" type="TextField">
  <binding name="value" value="username"/>
</component>
b.<input type="text" jwcid="@TextField" value="ognl:username" size="20"/>
c.<input type="text" jwcid="username@TextField" size="20"/>
以上三种页面输出
<input type="text" name="username" id="username" value="" size="20"/>

第一种为显示调用输入组件,生成组件id="username"
第二种为隐式调用输入组件,组件id由系统自动生成
第三种即显示又隐式调用,生成组件id="username"
以上三种方式组件值都绑定到页面类的username属性

2.实例登陆

2.1应用规范配置tapestryGuide1.application

<? xml version="1.0" ?>
<! DOCTYPE application PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 4.1//EN"
  "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_1.dtd"
>
< application  name ="Tapestry Guide" >
    
< meta  key ="org.apache.tapestry.template-encoding"  value ="GB2312" />
    
< meta  key ="org.apache.tapestry.messages-encoding"  value ="GB2312" />
    
< meta  key ="org.apache.tapestry.output-encoding"  value ="GB2312" />
    
< meta  key ="org.apache.tapestry.page-class-packages"  value ="org.jceun.example" />    
</ application >

2.2页面模板Home.html

< html  jwcid ="@Shell"  title ="Login" >  
  
< body  jwcid ="@Body" >
  
< style >
.fieldMissing 
{
    background
: #bedef4;
}


.fieldInvalid 
{
    background
: #ffaf7e;
    font-weight
: bold;
}

.alertButton 
{
        width
: auto;
        border
: none;
        background-color
: #699ED9;
        color
: #fff;
        padding
: 0.1em;
        border-bottom
: 1px solid #5885b6 !important;
        border-right
: 1px solid #5885b6 !important;
        border-top
: 1px solid #92b8e2 !important;
        border-left
: 1px solid #92b8e2 !important;
        cursor
: hand;
        cursor
: pointer;
}


.alertDialog 
{
    width
: 30em;
    border
: 2px solid #ff660a;
    padding
: 1em;
    background
: #ffffff;
    -moz-border-radius
: 10px;
}


.alertContent .alertButton 
{
    float
:right;
    position
:relative;
    bottom
:1em;
}


.missingList, .invalidList 
{
    padding-bottom
: 0.6em;
    padding-top
: 0.2em;
    padding-left
:0.1em;
    padding-right
:0.2em;
    margin
: 0;
}


.missingList 
{
    border-top
: 4px solid #bedef4;
}


.invalidList 
{
    border-top
: 4px solid #ffaf7e;
}


.missingList li, .invalidList li 
{
    list-style
:none;
    font-style
:italic;
}

  
</ style >
  
< br >< br >< br >
  
< center >
  
< font  color ="red" >< span  jwcid ="@Insert"  value ="ognl:errorMsg" /></ font >
  
< form  jwcid ="loginForm@Form"  clientValidationEnabled ="true" >    
    
< table  border ="1"  cellpadding ="0"  cellspacing ="0"  bordercolor ="#87cefa"  bordercolorlight ="#bedef4" >
    
< tr >
    
< td  align ="right" >< span  jwcid ="@FieldLabel"  field ="component:username" > 用户名: </ span ></ td >
    
< td >< input  type ="text"  jwcid ="username@TextField"  value ="ognl:username"  displayName ="literal:用户名"  
    validators
="validators:required[用户名不能为空]"  size ="20" /></ td >
    
</ tr >
    
< tr >
    
< td  align ="right" >< span  jwcid ="@FieldLabel"  field ="component:password" > 密码: </ span ></ td >
    
< td >< input  type ="password"  jwcid ="password@TextField"  hidden ="true"  value ="ognl:password"  
    validators
="validators:required[密码不能为空]"  displayName ="literal:密码"  size ="20" /></ td >
    
</ tr >
    
< tr >
    
< td  colspan ="2" >< input  type ="submit"  jwcid ="logicBtn@Submit"  value ="登陆"  listener ="listener:login" /></ td >
    
</ tr >
    
</ table >
  
</ form >
  
</ center >
  
</ body >
</ html >

2.3页面规范Home.page

<? xml version="1.0" encoding="UTF-8"  ?>
<! DOCTYPE page-specification PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 4.1//EN"
  "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_1.dtd"
>
< page-specification  class ="org.jceun.example.Home" >
</ page-specification >

2.4页面类Home.java

package  org.jceun.example;

import  org.apache.tapestry.html.BasePage;

public   abstract   class  Home  extends  BasePage  {
    
public abstract String getUsername();

    
public abstract String getPassword();

    
public abstract void setErrorMsg(String msg);

    
public String login() {        
        System.out.println(
"username=" + getUsername());
        System.out.println(
"password=" + getPassword());
        
if (getUsername().equals("ceun"&& getPassword().equals("123456"))
            
return "Welcome";
        
else {        
            setErrorMsg(
"用户名或密码错误!");
            
return this.getPageName();
        }

    }

}

2.5服务端校验

Home.html使用的是客户端校验,下面介绍服务端校验

Home.html改成

< html >
  
< head >
    
< title > Login.html </ title >     
  
</ head >
  
  
< body >
   
< br >< br >< br >
  
< center >
  
< font  color ="red" >< span  jwcid ="@Insert"  value ="ognl:errorMsg" /></ font >
  
< span  jwcid ="error" />
  
< form  jwcid ="loginForm" >    
    
< table  border ="1"  cellpadding ="0"  cellspacing ="0"  bordercolor ="#87cefa"  bordercolorlight ="#bedef4" >
    
< tr >
    
< td  align ="right" >< span  jwcid ="@FieldLabel"  field ="component:username" > 用户名: </ span ></ td >
    
< td >< input  type ="text"  jwcid ="username"  size ="20" /></ td >
    
</ tr >
    
< tr >
    
< td  align ="right" >< span  jwcid ="@FieldLabel"  field ="component:password" > 密码: </ span ></ td >
    
< td >< input  type ="password"  jwcid ="password"  size ="20" /></ td >
    
</ tr >
    
< tr >
    
< td  colspan ="2" >< input  type ="submit"  jwcid ="logicBtn"  value ="登陆" /></ td >
    
</ tr >
    
</ table >
  
</ form >
  
</ center >
  
</ body >
</ html >

Home.page改成

<? xml version="1.0" encoding="GB2312"  ?>
<! DOCTYPE page-specification PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 4.1//EN" 
  "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_1.dtd"
>
< page-specification  class ="org.jceun.example.Home" >
    
< bean  name ="delegate"  class ="org.apache.tapestry.valid.ValidationDelegate" />
    
< component  id ="loginForm"  type ="Form" >
        
< binding  name ="delegate"  value ="beans.delegate" />
    
</ component >
    
< component  id ="error"  type ="Delegator" >
        
< binding  name ="delegate"  value ="beans.delegate.firstError" />
    
</ component >
    
< component  id ="username"  type ="TextField" >
        
< binding  name ="value"  value ="username" />
        
< binding  name ="displayName"  value ="literal:用户名" />
        
< binding  name ="validators"  value ="validators:required[用户名不能为空]" />
    
</ component >
    
< component  id ="password"  type ="TextField" >
        
< binding  name ="value"  value ="password" />
        
< binding  name ="displayName"  value ="literal:密码" />
        
< binding  name ="hidden"  value ="true" />
        
< binding  name ="validators"  value ="validators:required[密码不能为空],minLength=6" />
    
</ component >   
    
< component  id ="logicBtn"  type ="Submit" >       
        
< binding  name ="listener"  value ="listener:login" />
    
</ component >
</ page-specification >

Home.java改成

package  org.jceun.example;

import  org.apache.tapestry.html.BasePage;
import  org.apache.tapestry.valid.ValidationDelegate;

public   abstract   class  Home  extends  BasePage  {
    
public abstract String getUsername();

    
public abstract String getPassword();

    
public abstract void setErrorMsg(String msg);

    
public String login() {
        ValidationDelegate delegate 
= (ValidationDelegate) this.getBeans()
                .getBean(
"delegate");
        
if (delegate.getHasErrors()) {
            
return this.getPageName();
        }

        System.out.println(
"username=" + getUsername());
        System.out.println(
"password=" + getPassword());
        
if (getUsername().equals("ceun"&& getPassword().equals("123456"))
            
return "Home";
        
else {        
            setErrorMsg(
"用户名或密码错误!");
            
return this.getPageName();
        }

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值