[英]Struts2 Action > jsp > Action
我對以下問題感到非常惱火。 我是Struts2的初學者。 我正在努力做到這一點
<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
缺少getters
和setters
(但我想您在此處發布時只是省略了它們,請仔細檢查它們); 也就是說,要回傳值,您需要使用IteratorStatus.index
屬性指定List
的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中)...用戶可以只使用鍵,而不能使用值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.