Java Struts2动作>;jsp>;行动

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;

我对下面的问题很恼火。我是Struts2的初学者。 我正试着这么做

  • 在我的操作中从db获取对象列表(确定)
  • 在JSP上打印它(OK)
  • 此列表在JSP中显示为可编辑表。。我想修改它,然后将其提交回相同的操作,以将其保存在我的db上(失败。当我使用
    我以前从db填充的列表现在为空。我如何解决这个问题
  • 我发现有一个话题是关于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;
        }
    }
    
    这是我的对象结构,在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
    检索的规则。如果对象结构简单,则字段名称直接映射到操作属性。如果使用集合,则最好查看这一点,以便更好地了解问题

    • giorno
      不是HTML
      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>