我正试着这么做
<s:submit action="myaction" method="mymethod">调用我的方法时,我以前从db中填充的列表现在是null.How了,我能解决这个问题吗?我发现了一些关于struts2拦截器以反射方式在myaction中注入数据的话题。
public class CurrentOra {
private int idCommessa;
private String descrizioneCommessa;
private int idCliente;
private String descrizioneCliente;
private List<OreTimesheetGiorno> orePerCommessa;
public int getIdCommessa() {
return idCommessa;
}
}和
public class OreTimesheetGiorno {
private int numeroGiorno;
private OreTimesheet oreTimesheet;
public int getNumeroGiorno() {
return numeroGiorno;
}
public void setNumeroGiorno(int numeroGiorno) {
this.numeroGiorno = numeroGiorno;
}
public OreTimesheet getOreTimesheet() {
return oreTimesheet;
}
public void setOreTimesheet(OreTimesheet oreTimesheet) {
this.oreTimesheet = oreTimesheet;
}
}这是我的对象结构,在JSP中我用
<s:iterator value="listOre" >
<tr class="giornoSettimana giornoUno">
<td><s:property value="descrizioneCliente"/></td>
<td><s:property value="descrizioneCommessa"/></td>
<s:iterator value="orePerCommessa">
<td>
<input type="text"
class="oreConsuntivazione"
maxlength="2"
giorno = "<s:property value="numeroGiorno" />"
value="<s:property value="oreTimesheet.numeroOre" />">
</td>
</s:iterator>
</tr>
</s:iterator>基本上,我需要迭代以向客户显示,并为每个客户提供工作时间。那么我应该可以编辑每一个小时并将其保存回DB。
发布于 2013-03-30 13:07:01
每次向Struts发出请求时,它都会创建动作对象的一个新实例,并通过拦截器填充它。其中之一是params拦截器。它负责迭代参数映射并将参数的值注入操作属性。该规则采用与操作属性名称相匹配的参数名称,并在操作中具有相应的setter。所以,你可以先解决这个问题
@DefaultInterceptorRef(value = "defaultStack") 以确保堆栈上所有必要的拦截器,以及您的操作隐式或显式地引用此堆栈。
然后确保在拦截器调用它们之前已经初始化了它们。
最后,最有趣的主题是表单字段名称应该符合OGNL能够从valueStack检索的规则。如果对象结构简单,则将字段名直接映射到操作属性。如果您使用集合,那么您最好看看my answers,它将使您更好地了解问题。
发布于 2013-04-02 14:38:38
giorno不是HTML字段的有效属性;CurrentOra缺少了getters和setters (但我认为您在这里发布时忽略了它们,顺便说一句,仔细检查它们);也就是说,要回发值,需要使用index属性指定List的IteratorStatus.index。
假设用户只能输入小时数,而不更改一天的时间,请尝试如下:
<s:iterator value="listOre" >
<tr class="giornoSettimana giornoUno">
<td><s:property value="descrizioneCliente"/></td>
<td><s:property value="descrizioneCommessa"/></td>
<s:iterator value="orePerCommessa" status="ctr" >
<td>
<s:hidden name="orePerCommessa[%{#ctr.index}].numeroGiorno" />
<s:property value="numeroGiorno" />
<s:textfield
name="orePerCommessa[%{#ctr.index}].oreTimesheet.numeroOre"
cssClass = "oreConsuntivazione"
maxlength="2" />
</td>
</s:iterator>
</tr>
</s:iterator>顺便说一句,这不会阻止用户黑掉您的代码,更改orePerCommessa.numeroGiorno的隐藏值;如果保护它们不受用户操作影响很重要,请将它们放在会话中,一旦从数据库读取,然后在JSP中显示它们(使用<s:property/>),但不要发布它们(不要将<s:hidden />放在后面),然后在回发页面时,从会话中检索它们并以某种方式匹配它们(例如,您可以使用带有它们的HashMap作为值,并将计数器作为密钥存储在JSP中).这样,用户就可以只处理键,而不是处理值。
https://stackoverflow.com/questions/15706576
复制相似问题