首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Struts2操作> JSP >操作

Struts2操作> JSP >操作
EN

Stack Overflow用户
提问于 2013-03-29 15:47:08
回答 2查看 1.7K关注 0票数 2

我正试着这么做

  1. 在我的操作中从db获取对象列表( OK)
  2. 在JSP上打印(确定)
  3. 这个列表在JSP中是一个可编辑的表。我想修改,然后将它提交回相同的操作,以保存在我的db (失败)。当我用<s:submit action="myaction" method="mymethod">调用我的方法时,我以前从db中填充的列表现在是null.How了,我能解决这个问题吗?

我发现了一些关于struts2拦截器以反射方式在myaction中注入数据的话题。

代码语言:javascript
复制
public class CurrentOra {
    private int idCommessa;
    private String descrizioneCommessa; 
    private int idCliente;
    private String descrizioneCliente;
    private List<OreTimesheetGiorno> orePerCommessa;
    
    public int getIdCommessa() {
        return idCommessa;
    }
}

代码语言:javascript
复制
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中我用

代码语言:javascript
复制
<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。

EN

回答 2

Stack Overflow用户

发布于 2013-03-30 13:07:01

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

代码语言:javascript
复制
@DefaultInterceptorRef(value = "defaultStack") 

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

然后确保在拦截器调用它们之前已经初始化了它们。

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

票数 1
EN

Stack Overflow用户

发布于 2013-04-02 14:38:38

  • giorno不是HTML字段的有效属性;
  • CurrentOra缺少了getterssetters (但我认为您在这里发布时忽略了它们,顺便说一句,仔细检查它们);

也就是说,要回发值,需要使用index属性指定ListIteratorStatus.index

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

代码语言:javascript
复制
<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中).这样,用户就可以只处理键,而不是处理值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15706576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档