【问题标题】:Retrieving values from list in execute() method在 execute() 方法中从列表中检索值
【发布时间】:2014-05-23 11:14:16
【问题描述】:

我希望在我的 JSP 页面上显示项目列表,每个项目都有一个空白文本字段来填写金额,一旦我填写了所需的项目金额,我将提交。

我有如下ExampleAction 类,其中我有 populate() 方法,我首先触发该方法以便填充项目。我触发 URL:

http://localhost:8084/WebExample/populate.action.

Same ExampleAction 已执行 mtd,我在 JSP 页面上调用 SUBMIT 按钮操作。但我的问题在于执行方法,我无法获取列表中的对象,即 exList。 这是因为动作类的一个实例只与一个请求相关联吗?当我通过 SUBMIT 按钮触发另一个动作时,是否关联了不同的值堆栈?如果是,对我来说,在执行()方法中检索输入的那些金额(在 JSP 中)以在 Tomcat 的控制台中打印的最佳方法应该是什么?

示例操作:

private ArrayList<EX> exList;
private EX ex;

  public ExampleAction(){
      exList = new ArrayList<EX>();
}

//Getters And Setters.
@Override
public String execute() throws Exception {
     for (EX ex1 : exList) {
        System.out.println("ex1 = " + ex1.getName());
    }

    return SUCCESS;
}

public String populate() throws Exception{
    System.out.println("in populate");
    exList.add(new EX("Item 1",0.0f));
    exList.add(new EX("Item 2",0.0f));
    ![enter image description here][2]...
    ...  
    return SUCCESS; 
}

EX.class:

class EX {

private String name;
private float amt;

public EX(String name, float amt) {
    this.name = name;
    this.amt = amt;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public float getAmt() {
    return amt;
}

public void setAmt(float amt) {
    this.amt = amt;
}}

example.jsp:

<form action="ex">
    <div style="overflow: auto;height: 200px;width: 400px; border: black solid;border-style: double;">
    <table border="1">
        <tr>
            <td>Name</td>
            <td>Amt</td> 
        </tr>
    <s:iterator value="exList" var="ex">
        <tr>
            <td><s:property value="name"/></td>
            <td><s:textfield cssClass="num" onchange="calculateSum()"/></td>
        </tr>
    </s:iterator>
    </table>
    </div>
    <br>
    Sum : <s:textfield  cssClass="ssum" disabled="true"/> 
    <br>
    <s:submit  action="ex" value="SUBMIT"/>
    </form>

Struts.xml:

<package name="default" extends="struts-default" namespace="/">     
    <action name="populate" class="com.ex.register.ExampleAction" method="populate">
        <result name="success">/register/example.jsp</result>
    </action>

    <action name="ex" class="com.ex.register.ExampleAction" method="execute">
        <result name="success">/register/example.jsp</result>
    </action> </package></struts>

【问题讨论】:

  • 您可以在提交时保留这些值并在下一次请求时检索它们以显示它们。
  • @RomanC 我想在 execute() 中检索数据,当我单击提交并将请求转发到 ExampleAction 中的 execute() mtd 时。您能否建议我如何保留在这些文本字段中输入的金额?

标签: java jsp struts2 ognl valuestack


【解决方案1】:

要将值提交给ArrayList,您可以使用索引属性名称。例如

<s:iterator value="exList" var="ex" status="status">
    <tr>
        <td><s:property value="name"/></td>
        <td><s:textfield cssClass="num" name="exList[%{status.index}].name" onchange="calculateSum()"/></td>
    </tr>
</s:iterator>

您还应该为 bean Ex 提供转换配置。假设属性 name 在 bean 内。

@Element(value = Ex.class)
@Key(value = String.class)
@KeyProperty(value = "name") 
@CreateIfNull(value = true)
private ArrayList<EX> exList;

请注意,您可以省略一些注释,因为可能未使用键或默认使用值,但它在所有情况下都是可配置的。有关此转换技术的更多信息,您可以在文档Advanced Type Conversion 中找到。

编辑:

还有一件事 EX != Ex 它应该是公共类而不是内部类。必须设置浮点值检查您没有转换错误。

【讨论】:

  • 我按照您的建议进行了更改,但我仍然无法获取 exList 中的对象,即它在 execute() mtd 中显示其大小 = 0。请任何人告诉我为什么我得到 size=0 和解决它。
  • @RahulY 你在用ModelDriven吗?你有属性的 getter 和 setter 吗?
  • 不,我没有使用 ModelDriven,并且我有属性的 getter 和 setter,如上面的 ExampleAction 所示。我想,首先我触发了填充并显示 exList 的 populate.action,但是当我从 SUBMIT 按钮触发另一个动作(ex.action)并访问 execute() mtd 时,exList 对象是不同的。我说的对吗?
  • 你能发布EX类吗?它应该有一个默认构造函数,以便 Struts 能够实例化它并设置属性。
  • 你应该创建一个默认构造函数public Ex(){}
【解决方案2】:

中删除action="ex"
<s:submit  action="ex" value="SUBMIT"/>

因为在提交点击表单动作调用。无需在提交按钮中提供action="ex"

关闭&lt;/package&gt;标签。

【讨论】:

  • 我试过了,但是没有用。即请求不会执行
猜你喜欢
  • 1970-01-01
  • 2020-06-14
  • 2019-05-18
  • 2014-11-20
  • 1970-01-01
  • 2021-09-20
  • 2012-12-11
  • 1970-01-01
  • 2022-10-07
相关资源
最近更新 更多