2

我正在尝试这样做

  1. 在我的操作中从 db 获取对象列表(确定)
  2. 在 JSP 上打印(OK)
  3. 该列表作为 JSP 中的可编辑表出现。我想修改然后将其提交回相同的操作以将其保存在我的数据库中(失败。当我使用 <s:submit action="myaction" method="mymethod">以前从数据库填充的列表调用我的方法时,现在是null.我该如何解决?

我发现了一些关于 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>

基本上我需要迭代以向客户展示每个客户的工作时间。然后我应该可以每小时编辑一次并将其保存回数据库

4

2 回答 2

1
  • giorno不是 HTMLinput字段的有效属性;
  • CurrentOra丢失getters并且setters(但我想您在此处发布时只是省略了它们,顺便说一句,请仔细检查它们);

也就是说,要回传值,您需要使用属性指定index的。ListIteratorStatus.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 中)......这样用户可以只弄乱键,而不是值.

于 2013-04-02T14:38:38.087 回答
1

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

@DefaultInterceptorRef(value = "defaultStack") 

确保堆栈上所有必要的拦截器,并且您的操作隐式或显式引用此堆栈。

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

最后最有趣的话题是表单字段名称应该符合 OGNL 能够从valueStack. 如果您的对象结构很简单,那么字段名将直接映射到操作属性。如果您使用集合,那么您最好看看 我的答案,这将使您更好地了解问题。

于 2013-03-30T13:07:01.797 回答