我是如此新的使用挂毯, 我有几个使用它的问题,如何从同名的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 ..
如何解决这个问题?
提前谢谢
答案 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的有用验证和错误报告功能,您必须自己管理所有细节。所以我不推荐这条路线。