簡體   English   中英

Struts2操作> jsp>操作

[英]Struts2 Action > jsp > Action

我對以下問題感到非常惱火。 我是Struts2的初學者。 我正在努力做到這一點

  1. 在我的操作中從數據庫獲取對象列表(確定)
  2. 在JSP上打印(確定)
  3. 此列表在JSP中以可編輯的表形式出現。我想進行修改,然后將其提交回同一操作,以將其保存到我的數據庫中(失敗。當我使用<s:submit action="myaction" method="mymethod">我以前從數據庫填充的列表現在為空。我該如何解決?

我發現了一些話題談論一個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>

基本上,我需要反復向客戶展示,並為每個客戶花費大量時間。 然后,我應該可以每小時編輯一次並將其保存回數據庫

每次您向Struts請求時,它都會創建一個動作對象的新實例,並通過攔截器進行填充。 其中之一是params攔截器。 它負責迭代參數映射並將參數值注入到動作屬性。 該規則采用符合動作屬性名稱並在動作中具有相應設置器的參數名稱。 因此,您可以先解決此問題

@DefaultInterceptorRef(value = "defaultStack") 

以確保堆棧上所有必要的攔截器,並且您的操作隱式或顯式引用了該堆棧。

然后,確保您具有在攔截器調用它們之前初始化的屬性。

最后,最有趣的主題是表單字段名稱應符合OGNL能夠從valueStack檢索的valueStack 如果您的對象結構很簡單,則字段名稱將直接映射到操作屬性。 如果使用集合,則最好查看我的答案 ,這將使您對問題有更好的了解。

  • giorno對於HTML input字段不是有效的屬性;
  • CurrentOra缺少getterssetters (但我想您在此處發布時只是省略了它們,請仔細檢查它們);

也就是說,要回傳值,您需要使用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中)...用戶可以只使用鍵,而不能使用值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM