【问题标题】:Struts2 Action > JSP > ActionStruts2 动作 > JSP > 动作
【发布时间】:2013-03-29 15:47:08
【问题描述】:

我正在尝试这样做

  1. 在我的操作中从 db 获取对象列表 (OK)
  2. 在 JSP 上打印(OK)
  3. 此列表作为 JSP 中的可编辑表出现。我想修改然后将其提交回相同的操作以将其保存在我的数据库中(失败。当我使用 <s:submit action="myaction" method="mymethod"> 我之前从 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;
    }
}

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>

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

【问题讨论】:

  • 当然Listnull - 您的操作会随着每个传入请求重新生成。您需要从网页返回一些 something 来告诉操作要删除什么。 This 应该给你一个起点。
  • 注意这一点:当您从页面上的表单提交时,所有表单元素都包含在请求中。这意味着如果您想从表单提交信息,它必须存储在表单中的表单元素中。将您的清单放入表格中。
  • 我要提交的所有字段都在表单内。我只有一个列表有问题。我从 jsp>action 传递输入没有问题。仅当我使用 打印列表时出现问题,因为标签迭代器没有 name 属性来绑定请求并将其发送回操作..
  • 使用隐藏字段。并展示你的 JSP。
  • 发布对象结构

标签: java jsp struts2 form-submit


【解决方案1】:
  • giorno 不是 HTML input 字段的有效属性;
  • CurrentOra 缺少 getterssetters(但我想您在此处发帖时只是省略了它们,顺便说一句,请仔细检查);

也就是说,要回传值,您需要使用 IteratorStatus.index 属性指定 indexindex

假设用户只能输入小时数,不能更改天数,尝试如下:

<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 中显示它们(使用&lt;s:property/&gt;),但不要发布它们(不要放置&lt;s:hidden /&gt;),然后发回页面,从会话中检索它们并以某种方式匹配它们(例如,您可以使用 HashMap 将它们作为值,并将计数器作为键存储在 JSP 中)......这样用户就可以搞乱键,而不是值。

【讨论】:

    【解决方案2】:

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

    @DefaultInterceptorRef(value = "defaultStack") 
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多