`
snail_gtt
  • 浏览: 48202 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Tapestry组件运用总结(Form内组件)

阅读更多
A) Insert 组件
e.g.
    <input type="text" jwcid="name@Insert" value="ognl:user.name"/>
    页面表现时,将会到页面类中寻找getUser().getName()方法获取初值并输出
    相当于在页面上显示数据.

B) TextField  组件
e.g.
    <input type="text" jwcid="username@TextField" value="ognl:username"/>
    页面表现时,将会到页面类中寻找getUsername()方法获取初值
    *如果是修改信息页面,通常初始值要在页面表现之前由setUsername()手动设置从数据库中读取出来的值
    表单提交时,通过setUsername()写入新值(即用户输入值),在类中通过getUsername()获取新值
    相当于在修改个人信息时,首先读出用户名赋予文本框(用户名)初值,用户修改时填入新值,后台获取之
    *Hidden属性区分是普通文本输入框(默认false)和密码输入框(hidden="ognl:true")
    readonly属性设置只读 readonly="true"为只读(后台可读取)
    *disabled属性设置是否可写 diabled="true"为不可写(后台也不可读取)

C) TextArea 组件
e.g.
    <textarea jwcid="content@TextArea" value="ognl:content" cols="40" rows="10"></textarea>
    页面表现时,将会到页面类中寻找getContent()方法获取初值
    工作原理同TextField

D) RadioGroup/Radio 组件
e.g.
    <span jwcid="headImage@RadioGroup" selected="ognl:headImage">
      <input jwcid="@Radio" type="radio" value="1"/>头像1
      <input jwcid="@Radio" type="radio" value="2"/>头像2
      <input jwcid="@Radio" type="radio" value="3"/>头像3
      <input jwcid="@Radio" type="radio" value="4"/>头像4
      <input jwcid="@Radio" type="radio" value="5"/>头像5
      <input jwcid="@Radio" type="radio" value="6"/>头像6
    </span>
    RadioGroup为每一个Radio提供一个唯一的ID。RadioGroup跟踪当前被选中的属性值,并且只有一个Radio能够被选中.
    页面提交时,RadioGroup组件就利用OGNL表达式向headImage字段写入被选中的Radio组件的value参数值.
    页面表现时(修改页面),将会到页面类中寻找getHeadImage()方法获取初值,然后寻找@Radio组件中与其相同的组件并勾选上.

E) PropertySelection 组件
    使用PropertySelection组件必须要构造一个类来实现IPropertySelectionModel接口,并且重写该接口的5个方法.
    public int getOptionCount() //提供下拉菜单的长度
    public Object getOption(int index) //提供select标签的option
    public String getLabel(int index) //提供select标签的Label值,也就是下拉菜单显示的内容
    public String getValue(int index) //提供select标签的value值
    public Object translateValue(String value) //selected后的返回值,value值未必就是我们需要的返回值,可以在这个方法里面对返回的value做对应的转换或修改.
e.g.1. 性别下拉框
    <select jwcid="gender@ProPertySelection" name="genderSelect" value="ognl:gender" model="supportedGender">
      <option selected>先生</option>
      <option>女士</option>
    </select>
GenderSelectionModel.java
public class GenderSelectionModel implements IPropertySelectionModel {

	public static final String male = "先生";

	public static final String female = "女士";

	public static final String[] genderOptions = { male, female };

	public int getOptionCount() {
		return genderOptions.length;
	}

	public Object getOption(int index) {
		return this.translateValue(genderOptions[index]);
	}

	public String getLabel(int index) {
		return genderOptions[index].toString();
	}

	public String getValue(int index) {
		return genderOptions[index];
	}

	public Object translateValue(String value) {
		if (value.equals("先生")) {
			return "1";
		} else {
			return "0";
		}
	}
}

ModUserInfo.java
public IPropertySelectionModel getSupportedGender() {
	return new GenderSelectionModel();
}


    存入数据库中"1"代表先生,"0"代表女士,通过translateValue(String value)方法转换
    页面表现时,通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedGender().
    然后通过getGender()方法获取初值,比如获取"0",则在页面显示时寻找value值为"0"的选项即为"女士",并选择之作为初始选择项.


e.g.2. 日志类型下拉框
    <select jwcid="logType@PropertySelection" name="typeSelect" value="ognl:logType" model="supportedType">
      <option>心情日记</option>
      <option>情感天地</option>
      <option>生活感触</option>
    </select>
TypeSelectionModel.java
public class TypeSelectionModel implements IPropertySelectionModel {
	
	private List typeList = new ArrayList();

	public TypeSelectionModel(List typeList) {
		this.typeList = typeList;
	}

	public int getOptionCount() {
		return typeList.size();
	}

	public Object getOption(int index) {
		return ((LogType)typeList.get(index)).getValue();
	}

	public String getLabel(int index) {
		return ((LogType) typeList.get(index)).getName();
	}

	public String getValue(int index) {
		return ((LogType) typeList.get(index)).getValue();
	}

	public Object translateValue(String value) {
		return value;
	}
}

ModLog.java
public IPropertySelectionModel getSupportedType() {
	TypeSelectionModel typeSelectionModel = 
                           new TypeSelectionModel(loadType(getUser().getUserId()));
	return typeSelectionModel;
}

private List loadType(int userid) {
	...//从数据库载入该用户的日志类型列表
}

    页面表现时,通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedType().
    然后通过value属性给出的初始值即,getLogType()方法获取初值,比如获取"2",则在页面显示时寻找value值为"2"的选项即为"生活感触",并选择之作为初始选择项.


F) Form组件
e.g.
    <form jwcid="logForm@Form">
      ...
    </form>
    Form的监听(listener)方法可以有两种方式:
      1. 在Form组件中声明.
        <form jwcid="logForm@Form" listener="ognl:listener:onLogin">
          ...
        </form>
      2. 在submit类型组件中声明.
        <input type="submit" jwcid="onLogin@Submit" listener="listener:onLogin" value="发表"/>或者
        <span jwcid="@ImageSubmit" image="..." listener="listener:onLogin"><img src="..." width="" height=""/></span>
      前一种方式当Form中只要有submit就会触发监听方法,后一种方式是Form中有多个submit,各自实现不同的监听方法.

G) Foreach 组件
e.g.
    <span jwcid="@Foreach" source="ognl:logList" value="ognl:item">
    循环组件,遍历source参数,在表现其内容前更新value参数,将Foreach组件所包含的内容重复表现,其中可以通过value参数获取所需显示内容.
    本例中,页面表现时通过getLogList()方法获取日志列表,循环取出其中数据更新item(日志对象)并予以显示.其中item需要在页面规范(.page)文件中声明:
    <property name="item"/>
    *class参数用来寻找类似CSS的文件对Foreach进行修饰.
    Foreach组件: class="ognl:beans.evenOdd.next"
    Page文件:    <bean name="evenOdd" class="org.apache.tapestry.bean.EvenOdd"/>
    CSS文件:     tr.odd{background-color: #ffffff;}tr.even{background-color: #eeeeee;}

H) Conditional 组件
e.g.
    <span jwcid="@Conditional" condition='ognl:item.sex.equals("1")'>先生</span>
    <span jwcid="@Conditional" condition='ognl:item.sex.equals("0")'>女士</span>
    conditional参数为true时运行Conditional组件中的HTML模板内容.
    在Tapestry4.0以后就不支持该组件了, 可以使用其他组件来实现:
    1. Contrib:Choose和Contrib:When
    <library id="contrib" specification-path="classpath:/org/apache/tapestry/contrib/Contrib.library"/>(.application文件中引入Contrib类包)
    <span jwcid="@contrib:Choose">
      <span jwcid="@contrib:When" condition='ognl:user.gender.equals("1")'>先生</span>
      <span jwcid="@contrib:When" condition='ognl:user.gender.equals("0")'>女士</span>
    </span>
    2. If组件
    <span jwcid="@If" condition='ognl:item.sex.equals("1")'>先生</span>
    <span jwcid="@If" condition='ognl:item.sex.equals("0")'>女士</span>
分享到:
评论

相关推荐

    tapestry5 自定义组件

    总结起来,创建一个自定义的邮件组件在 Tapestry 5 中涉及编写组件类、模板文件和元数据配置,并将其集成到应用中。这个过程需要对 Tapestry 5 的组件模型有深入理解,包括生命周期、事件处理、依赖注入等概念。通过...

    关于Tapestry的一些个人总结

    ### 关于Tapestry的一些个人总结 #### 一、Tapestry简介与核心特性 Tapestry是一个基于Servlet的框架,它可以运行在任何支持Servlet的容器(如Tomcat)或者包含Servlet容器的应用服务器(例如JBoss)之上。该框架...

    tapestry hibernate Spring应用及组件的使用

    在Tapestry和Hibernate之间,Spring起到了粘合剂的作用,通过Spring的IoC(Inversion of Control)容器,我们可以轻松地配置和管理Tapestry组件与Hibernate的数据访问层之间的依赖关系。同时,Spring的事务管理确保...

    深入浅出Tapestry4一书源代码(2)

    总的来说,通过学习这本书的源代码,开发者不仅可以掌握Tapestry4的基本用法,还能深入理解框架的内部工作原理,从而更好地运用到实际项目中,提高开发效率和代码质量。无论是初学者还是有经验的开发者,都可以从这...

    Tapestry开发

    Form组件:** - **用途:**用于创建表单。 - **示例代码:** ```xml &lt;tapestry:form&gt; &lt;tapestry:textField name="username" label="Username" /&gt; &lt;tapestry:passwordField name="password" label="Password" /...

    Tapestry 5.1 实例教程(全部)

    1. **内置组件**:Tapestry 5.1内建了许多有用的组件,如表单、验证、Ajax支持等。探索这些组件的用法,例如`Form`、`TextField`、`TextArea`、`Checkbox`、`RadioButton`等,以及如何实现客户端验证。 2. **自定义...

    Tapestry API

    Tapestry API提供了`org.apache.tapestry5.corelib.components`包下的基础控件,如`Form`和`Submit`,它们作为控制器的一部分,帮助开发者实现MVC模式。 3. **事件与绑定** Tapestry支持事件驱动的编程,组件之间...

    Tapestry教程

    例如,`Login.html`文件包含了页面的布局和交互元素,其中`jwcid`属性用于指定Tapestry组件。在本例中,我们看到一个简单的用户登录表单,使用`@Shell`定义整个页面,`@Conditional`处理错误消息,以及`@Form`和`@...

    Tapestry开发指南

    #### 二、Tapestry组件实战详解 Tapestry提供了丰富的组件库,覆盖了Web应用中的大部分需求: 1. **Foreach组件**:用于迭代集合或数组中的元素。 2. **Insert组件**:允许动态插入HTML或组件到页面中。 3. **...

    Tapestry 5.1 实例教程

    通过`Form`组件和`Submit`按钮,可以轻松创建交互式表单。 ### 6. 事件处理和事件传播 Tapestry的事件处理机制允许组件之间进行通信。通过`onAction`方法处理用户触发的事件,并可以使用`EventContext`传递数据。 ...

    Tapestry5使用文档

    6. **Form 组件** - **同步**:传统的表单提交方式,整个页面都会重新加载。 - **异步**(局部刷新):通过 AJAX 实现表单的局部刷新,提高用户体验。 7. **Submit 组件**:用于提交表单的按钮组件。 8. **...

    tapestry 5.3中文教程

    - 使用 Tapestry 的 `Form` 组件来收集用户输入。 - 通过 `@Persist` 注解保存数据。 - **查询数据**: - 通过 Hibernate 查询数据,并使用 `Model` 展示数据。 - **修改数据**: - 使用 `Form` 组件编辑现有记录...

    Manning - Tapestry In Action

    - **组件化开发**:重点讲解了Tapestry的核心理念——组件化开发。通过组件化的思想,开发者可以将Web页面拆分成独立的、可重用的部分,这些部分可以单独开发和测试,从而极大地提高了开发效率和代码质量。 - **与...

    Tapestry字典

    通过配置,组件可以限制在特定的包内使用,有助于代码的组织和管理。 **4.5 给模板传值** 组件可以通过属性向模板传递数据,实现动态内容的展示。 **4.6 建立library** 创建组件库可以提高代码复用率,减少重复...

    tapestry4.0简易教程

    - **概念理解:** 在Tapestry中实现页面间的跳转,主要通过`PageLink`组件或`@Redirect`注解来完成。 - **具体实践:** 使用`&lt;t:pageLink page="TargetPage"/&gt;`或者在某个方法上加上`@Redirect`注解,并指定目标页面...

Global site tag (gtag.js) - Google Analytics