表单 – Struts 2:使用模型驱动的体系结构更新表单中的对象列表

前端之家收集整理的这篇文章主要介绍了表单 – Struts 2:使用模型驱动的体系结构更新表单中的对象列表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经搜索并在这里找到了几种方法,但我不能让他们为我的项目工作.

我想显示一个对象列表的编辑页面,这些页面应该一次更新.我使用模型驱动的体系结构方法来实现这一点,但我无法使其正常运行.我总是可以显示和迭代列表及其值,但我不能修改它的值.

所以这就是我目前正在做的事情:

我的数据库中有一个Model’Teilzeitgrad’,它有一些带getter和setter的简单属性.

  1. public class Teilzeitgrad {
  2.  
  3. private Date datumAb;
  4. private Date datumBis;
  5. private double betrag;
  6.  
  7. // ... getters and setters
  8.  
  9. }

在我的Action-Class中,我使用Teilzeitgrad-Objects列表实现了ModelDriven接口

  1. public class DienstabschnittViewJahrAction implements ModelDriven<List<Teilzeitgrad>>,Preparable
  2. {
  3. List<Teilzeitgrad> teilzeitgrads;
  4. private String tzgTypKey;
  5. private Integer jahrIndex;
  6.  
  7. public String execute() {
  8. return SUCCESS;
  9. }
  10.  
  11. public List<Teilzeitgrad> getModel()
  12. {
  13. if(teilzeitgrads == null) {
  14. teilzeitgrads = getTeilzeitgradListByTypAndJahr(getTzgTypKey(),getJahrIndex());
  15. }
  16. return teilzeitgrads;
  17. }
  18.  
  19. public List<Teilzeitgrad> getTeilzeitgrads()
  20. {
  21. return teilzeitgrads;
  22. }
  23.  
  24. public void setTeilzeitgrads(List<Teilzeitgrad> teilzeitgrads)
  25. {
  26. this.teilzeitgrads = teilzeitgrads;
  27. }
  28.  
  29. @Override
  30. public void prepare() throws Exception
  31. {
  32. // TODO Auto-generated method stub
  33. }
  34.  
  35. public String getTzgTypKey()
  36. {
  37. return tzgTypKey;
  38. }
  39.  
  40. public void setTzgTypKey(String tzgTypKey)
  41. {
  42. this.tzgTypKey = tzgTypKey;
  43. }
  44.  
  45. public Integer getJahrIndex()
  46. {
  47. return jahrIndex;
  48. }
  49.  
  50. public void setJahrIndex(Integer jahrIndex)
  51. {
  52. this.jahrIndex = jahrIndex;
  53. }
  54. }

struts.xml中的操作映射定义如下:

  1. <action name="*/auth/GroupAdmin/processEditDienstabschnittJahr" method="execute" class="org.hocon.ul.portal.action.DienstabschnittViewJahrAction">
  2. <result name="success" type="redirect">${referer}</result>
  3. </action>

在我的JSP文件中,我正在迭代模型对象,在文本字段或列表中显示其值,如下所示:

  1. <ul:form action="auth/GroupAdmin/processEditDienstabschnittJahr">
  2. <s:iterator value="model" status="rowStatus">
  3.  
  4. <tr>
  5. <td style="text-align: center;">
  6. <s:date name="model.get(#rowStatus.index).datumAb" var="datumAb_DE" format="dd.MM.yyyy" />
  7. <s:textfield style="width:70px;" name="model.get(#rowStatus.index).datumAb" value="%{#datumAb_DE}" label="DatumAb"></s:textfield >
  8. </td>
  9.  
  10. <td style="text-align:center;">
  11. <s:date name="model.get(#rowStatus.index).datumBis" var="datumBis_DE" format="dd.MM.yyyy" />
  12. <s:textfield style="width:70px;" name="model.get(#rowStatus.index).datumBis" value="%{#datumBis_DE}" label="DatumBis"></s:textfield >
  13. </td>
  14.  
  15. <td class="currency">
  16. <s:set var="tzgBetrag">
  17. <fmt:formatNumber type="NUMBER" maxFractionDigits="0"><s:property value="%{getBetrag()*100}"></s:property></fmt:formatNumber>
  18. </s:set>
  19. <s:textfield style="width:30px;" maxlength="3" name="model.get(#rowStatus.index).betrag" value="%{#tzgBetrag}" label="Betrag"></s:textfield >
  20. </td>
  21. </tr>
  22.  
  23. </s:iterator>
  24. <s:submit style="width:24px; height:24px;" type="image" src="../../../res/24px/floppy-disk.png" value="Speichern"></s:submit>
  25. </ul:form>

ul-tag来自自定义taglib,它将特定于客户的url参数添加到操作路径.

因此,当我显示页面时,它会显示我的所有Teilzeitgrad记录,每个条目都有一行.但是当我提交表单时,我的模型列表没有填充.甚至根本没有调用setter setTeilzeitgrads(List< Teilzeitgrad> teilzeitgrads).
我还尝试访问array-Syntax中的列表:

< s:textfield style =“width:70px;” name =“teilzeitgrads [#rowStatus.index] .datumAb”value =“%{#datumAb_DE}”label =“DatumAb”>< / s:textfield>

但这也行不通.

解决这个案子的任何帮助都是折旧的!提前致谢!

Lenzo

解决方法

好的 – 这是列表索引的一个非常基本的工作示例.主要的变化是将模型的创建从getModel()移动到prepare().这是因为为设置列表所需的每个值都会调用getModel() – 因此,每次覆盖以前的更改时,最终都会重新创建模型.
  1. package com.blackBox.x.actions;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import com.blackBox.x.actions.ListDemo.ValuePair;
  7. import com.opensymphony.xwork2.ActionSupport;
  8. import com.opensymphony.xwork2.ModelDriven;
  9. import com.opensymphony.xwork2.Preparable;
  10.  
  11. public class ListDemo extends ActionSupport implements ModelDriven<List<ValuePair>>,Preparable {
  12.  
  13.  
  14. private List<ValuePair> values;
  15.  
  16. @Override
  17. public List<ValuePair> getModel() {
  18.  
  19. return values;
  20.  
  21. }
  22.  
  23. public String execute() {
  24.  
  25. for (ValuePair value: values) {
  26. System.out.println(value.getValue1() + ":" + value.getValue2());
  27. }
  28.  
  29. return SUCCESS;
  30. }
  31.  
  32.  
  33. public void prepare() {
  34. values = new ArrayList<ValuePair>();
  35. values.add(new ValuePair("chalk","cheese"));
  36. values.add(new ValuePair("orange","apple"));
  37. }
  38.  
  39.  
  40. public class ValuePair {
  41.  
  42. private String value1;
  43. private String value2;
  44.  
  45. public ValuePair(String value1,String value2) {
  46. this.value1 = value1;
  47. this.value2 = value2;
  48. }
  49.  
  50. public String getValue1() {
  51. return value1;
  52. }
  53. public void setValue1(String value1) {
  54. this.value1 = value1;
  55. }
  56. public String getValue2() {
  57. return value2;
  58. }
  59. public void setValue2(String value2) {
  60. this.value2 = value2;
  61. }
  62. }
  63. }

和相应的jsp

  1. <%@ taglib prefix="s" uri="/struts-tags" %>
  2. <html>
  3. <head>
  4.  
  5.  
  6. </head>
  7. <body>
  8.  
  9.  
  10. <s:form action="list-demo" theme="simple">
  11. <table>
  12. <s:iterator value="model" status="rowStatus">
  13. <tr>
  14. <td><s:textfield name="model[%{#rowStatus.index}].value1" value="%{model[#rowStatus.index].value1}"/></td>
  15. <td><s:textfield name="model[%{#rowStatus.index}].value2" value="%{model[#rowStatus.index].value2}"/></td>
  16. </tr>
  17. </s:iterator>
  18. </table>
  19. <s:submit/>
  20. </s:form>
  21. </body>
  22. </html>

猜你在找的HTML相关文章