Java Struts2动作>;jsp>;行动
我对下面的问题很恼火。我是Struts2的初学者。 我正试着这么做Java Struts2动作>;jsp>;行动,java,jsp,struts2,form-submit,Java,Jsp,Struts2,Form Submit,我对下面的问题很恼火。我是Struts2的初学者。 我正试着这么做 在我的操作中从db获取对象列表(确定) 在JSP上打印它(OK) 此列表在JSP中显示为可编辑表。。我想修改它,然后将其提交回相同的操作,以将其保存在我的db上(失败。当我使用 我以前从db填充的列表现在为空。我如何解决这个问题 我发现有一个话题是关于struts2拦截器的,该拦截器通过反射将数据注入myaction public class CurrentOra { private int idCommessa;
我以前从db填充的列表现在为空。我如何解决这个问题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;
}
}
这是我的对象结构,在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每当您向Struts发出请求时,它都会创建一个新的action对象实例,并通过拦截器填充它。其中之一是
params
拦截器。它负责迭代一个参数映射,并将参数值注入到动作属性中。该规则采用与动作属性名称相匹配的参数名称,并在动作中具有相应的设置器。因此,您可以首先通过
@DefaultInterceptorRef(value = "defaultStack")
确保堆栈上所有必要的拦截器,并且您的操作隐式或显式引用此堆栈
然后确保在拦截器调用属性之前已初始化属性
最后,最有趣的主题是表单字段名称应符合OGNL能够从valueStack
检索的规则。如果对象结构简单,则字段名称直接映射到操作属性。如果使用集合,则最好查看这一点,以便更好地了解问题
不是HTMLgiorno
字段的有效属性input
缺少CurrentOra
和getters
(但我想你只是在这里发布时忽略了它们,顺便说一下仔细检查一下)setters
迭代器status.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>
顺便说一句,这不会阻止用户修改或percommessa.numeriogiorno的隐藏值来破解您的代码;如果保护它们不受用户操纵很重要,请在从数据库读取后将它们放入会话,然后在JSP中显示它们(使用
),但不要发布它们(不要放置
),然后在发回页面时,从会话中检索它们并以某种方式进行匹配(例如,您可以使用HashMap将它们作为值,并将计数器作为键存储在JSP中)…这样,用户就可以随意处理键,而不是值。当然,列表是null
-您的操作会随着每个传入的请求重新生成。您需要从网页返回一些内容来告诉操作要删除的内容。应该给您一个起点。请注意:提交时从页面上的表单中,所有表单元素都包含在请求中。这意味着,如果要从表单提交信息,必须将其存储在表单中的表单元素中。将列表放入表单中。Ofc我尝试提交的所有字段都在表单中。我只对列表有问题。我没有问题通过来自jsp>action的输入。我只有在打印带有标签的列表时才遇到问题,因为标记迭代器没有name属性将其绑定到请求并发送回action。使用隐藏字段。并显示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" 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>