2013-03-29 53 views
0

我非常恼火的下列问题。我是Struts2的初学者。 我试图做到这一点Struts2动作> jsp>动作

  1. 获取对象的列表从数据库中我的行动(OK)
  2. 打印它JSP(OK)
  3. 这份名单出来作为JSP可编辑表..我想修改,然后提交回相同的行动,以将其保存在我的数据库(失败。当我打电话给我的方法与 <s:submit action="myaction" method="mymethod">列表我以前从db填充现在是null.How我可以解决吗?

我发现一些话题谈论支柱s2拦截器用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> 

基本上我需要遍历向客户展示,并为每一位客户每小时打印处理它。然后,我应该可以编辑每个小时并将其保存回分区

+0

当然'List'是'null' - 你的动作在每一个传入请求中重新产生。您需要从网页返回一些_something_以告诉操作要删除的内容。 [This](http://code.google.com/p/struts2-jquery/wiki/EditGrid)应该给你一个出发点。 –

+0

请注意:从页面上的表单提交时,所有表单元素都包含在请求中。这意味着如果你想从表单提交信息,它必须存储在表单中的表单元素中。把你的清单放在表格中。 – DwB

+0

Ofc我试图提交的所有字段都在表单内。我只在列表中遇到问题。从jsp> action传入输入没有任何问题。我只有当我用 cuz打印一个列表时,才会出现问题标签迭代器没有名称属性来绑定请求并发回操作.. – Federik

回答

0

每次向Struts发出请求时,它都会创建一个新的Action对象实例并通过拦截器填充它。其中之一是params拦截器。它负责迭代参数映射并将参数值注入到操作属性中。该规则采用适合操作属性名称的参数名称,并在操作中具有相应的设置器。所以,你可以通过先

@DefaultInterceptorRef(value = "defaultStack") 

或明或暗地解决这个以确保堆栈上的所有必要的拦截器,和你的行动将引用此堆栈。

然后确保你的属性在拦截器调用它们之前被初始化。

最后最有趣的话题是表单字段名称应符合OGNL能够从valueStack中检索的规则。如果你的对象结构很简单,那么字段名直接映射到动作属性。如果你使用集合,那么你最好看my answers,这会让你更好地了解问题。

0
  • giorno不是HTML input字段的有效属性;
  • CurrentOra不见了getterssetters(但我想你简单地在这里发表时忽略它们,btw仔细检查它们);

这就是说,报值回来了,你需要使用IteratorStatus.index属性来指定Listindex

假设用户只能输入的小时数,并没有改变天数,尝试如下:

<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中)......这样用户就可以混淆键,而不是价值。