如何从同名的tapestry文本域获取数据?

时间:2018-02-19 03:35:51

标签: java spring tapestry

我是如此新的使用挂毯, 我有几个使用它的问题,如何从同名的tapestry文本域获取价值?

例如:

<t:form t:id="names">
    <t:errors/>
    <div class="input-box">
        <t:textfield type="text" name="birthdate[Day]"/>
        <t:textfield type="text" name="birthdate[Month]"/>
        <t:textfield type="text"  name="birthdate[Year]"/>
    </div>
    <div class="input-box">
        <div class="col-md-12">
            <input type="submit" name="proceed" class="btn" value="Proceed" />
        </div>
    </div>
</t:form>

我尝试用birthdate [Day] = 20,生日[Month] = 08,birthdate [Year] = 1992填充它,并在后端调试它,如下所示:

@Property
@Persist(PersistenceConstants.FLASH)
private List<String> birthdate;

Object onSuccess() {
    logger.info("data birthdate:            "+birthdate);  // print null
    logger.info("data birthdate toString:   "+birthdate.toString());  // print null
    logger.info("data birthdate 0:          "+birthdate.get(0));  // print null

    return null;
}

所有这些只返回null ..

如何解决这个问题?

提前谢谢

2 个答案:

答案 0 :(得分:1)

来自Spring和Hibernate时代,Tapestry感觉很奇怪。根据我10分钟的阅读时间,你没有正确地映射字段,并且遗漏了一些内容,例如

  • 您没有使用t:id
  • 您的.tml中有3个文本字段,然后.java中的列表不确定您打算在那里做什么

作为一个例子,我做了以下Names.java

之类的事情
package com.raf.test.pages;

import java.util.Date;

import org.apache.tapestry5.PersistenceConstants;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.slf4j.Logger;

public class Names {
    @Inject
    private Logger logger;

    @Property
    @Persist(PersistenceConstants.FLASH)
    private String birthDay;

    @Property
    @Persist(PersistenceConstants.FLASH)
    private String birthMonth;

    @Property
    @Persist(PersistenceConstants.FLASH)
    private String birthYear;

    @Property
    @Persist(PersistenceConstants.FLASH)
    private String aDate;

    @Property
    @Persist(PersistenceConstants.FLASH)
    private String monthAndYear;

    @Property
    @Persist(PersistenceConstants.FLASH)
    private Date actualDateField;

    Object onSuccess() {
       logger.info("birthDay: " + birthDay);
       logger.info("birthMonth: " + birthMonth);
       logger.info("birthYear: " + birthYear);

       if(aDate != null && !aDate.isEmpty()) {
           String[] chunks = aDate.split("-");
           if(chunks.length > 2) {
               logger.info("aDate [Year]: " + chunks[0]);
               logger.info("aDate [Month]: " + chunks[1]);
               logger.info("aDate [Day]: " + chunks[2]);
           }
       }

       logger.info("monthAndYear: " + monthAndYear);

       logger.info("actualDateField: " + actualDateField);

       return null;
    }
}

Names.tml如下

<html t:type="layout" title="test com.example"
      xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"
      xmlns:p="tapestry:parameter">

<t:form t:id="names">
    <t:errors/>
    <div class="input-box">
        <t:textfield type="text" name="birthdate[Day]" placeholder="birthdate[Day]" t:id="birthDay"/>
        <t:textfield type="text" name="birthdate[Month]" placeholder="birthdate[Month]" t:id="birthMonth"/>
        <t:textfield type="text"  name="birthdate[Year]" placeholder="birthdate[Year]" t:id="birthYear"/>
        <!-- Uses html5 date type-->
        <t:textfield type="date"  name="normladate" placeholder="Normal date" t:id="aDate"/>

        <!-- Uses html5 month -->
        <t:textfield type="month"  name="justmonth" placeholder="Month Year" t:id="monthAndYear"/>

        <!-- Actual date field -->
        <t:datefield  name="actualDateField" placeholder="Actual date" t:id="actualDateField"/>
    </div>
    <div class="input-box">
        <div class="col-md-12">
            <input type="submit" name="proceed" class="btn" value="Proceed" />
        </div>
    </div>
</t:form>
</html>

这是eclipse中的示例输出

[INFO] pages.Names birthDay: bb
[INFO] pages.Names birthMonth: aa
[INFO] pages.Names birthYear: 2nineteen
[INFO] pages.Names aDate [Year]: 2018
[INFO] pages.Names aDate [Month]: 02
[INFO] pages.Names aDate [Day]: 18
[INFO] pages.Names monthAndYear: 2018-02
[INFO] pages.Names actualDateField: Fri Feb 16 00:00:00 EST 2018

正如您所见,Names.tml中的每个字段都映射到Names.java POJO中的相应字段。

答案 1 :(得分:1)

您似乎认为Tapestry的TextField与相同的东西与HTML&#34;输入类型=文本&#34; HTML元素。它不是。 TextField是一个Tapestry组件,输出&#34;输入类型=文本&#34; HTML元素,但它使用&#34;值&#34;标识正在编辑的对象。参数,而不是&#34;名称&#34;,如文档中所述:http://tapestry.apache.org/current/apidocs/org/apache/tapestry5/corelib/components/TextField.html

我提供了3种可能的方法:

1)如果可能,请不要使用3元素列表作为日期部分。这只会让一切变得更加困难。相反,每个人都有一个单独的属性,名为birthDay,birthMonth和birthYear:

@Property
@Persist(PersistenceConstants.FLASH)
private String birthDay, birthMonth, birthYear;

您的模板中包含以下内容:

<t:textfield t:id="birthDay" value="birthDay"/>
<t:textfield t:id="birthMonth" value="birthMonth"/>
<t:textfield t:id="birthYear" value="birthYear"/>

或在模板中使用以下内容,这是等效的(因为Tapestry使用查找与t:id参数匹配的属性,如果它没有找到值参数)并且更加清晰:

<t:textfield t:id="birthDay"/>
<t:textfield t:id="birthMonth"/>
<t:textfield t:id="birthYear"/>

2)或者,如果你真的想通过使用相同的&#34;名称&#34;来让你的网页设计师感到高兴。每个字段的属性,您可以这样写,等效地:

<input type="text" t:type="textfield t:id="birthDay" name="birthday"/>
<input type="text" t:type="textfield t:id="birthMonth" name="birthday"/>
<input type="text" t:type="textfield t:id="birthYear" name="birthday"/>

(如果你在Tapestry组件上添加&#34; name&#34;参数,那么它的值将被忽略,并且将出现在生成的HTML中。相反,HTML TextField发出(通常)包括一个name属性,其值与t:id属性匹配。)

3)最后,你可以完全跳过TextField组件,只使用普通的旧HTML表单元素和3元素的字符串列表:

<input type="text" name="birthday" value="${birthdate.get(0)}"/>
<input type="text" name="birthday" value="${birthdate.get(1)}"/>
<input type="text" name="birthday" value="${birthdate.get(2)}"/>

然后您可以使用以下方法检索提交的值:

@Inject
private Request request;
...
String[] birthDateParts = request.getParameters("birthday");
birthdate = Arrays.asList(birthDateParts);

那很尴尬。而且您丢失了所有Tapestry的有用验证和错误报告功能,您必须自己管理所有细节。所以我不推荐这条路线。