Struts 2将数据从JSP传递给动作类

时间:2013-11-22 16:03:53

标签: java jsp struts2 ognl

我正在尝试了解其他人的Struts 2代码,但我遇到了数据传递问题。

我知道在JSP页面上,如果你使用<s:textfield name="something" ... />标记,struts2会尝试在动作类中自动调用setSomething(...)

我现在看到这种类型的代码:

<s:textfield name="item.name" ... />

我想知道,这个.(点)是如何工作的?我的动作类中有一个名为setItem()的方法,并且在该方法中设置的对象具有setName()方法,但显然这不起作用。点和名称之间的点是什么意思,如何正确使用它来实例化项目设置它的名称?

PS:我的动作类中setItem()中设置的item对象有一个空的args构造函数。

4 个答案:

答案 0 :(得分:2)

在OGNL .中是点符号

item.name表示getItem().setName();
item.subitem.name表示getItem().getSubitem.setName();

一个问题可能是缺少空args构造函数as described here,但你说这不是你的情况;然后我打赌“Item失踪的吸气剂”。如果不是,请发布更相关的代码。

答案 1 :(得分:1)

确保getItem().setName()

有公开方法

可能这些方法不可用或不公开或输入错误,例如getitem()而不是getItem()。

您的操作应该有setItem(Item item)

答案 2 :(得分:1)

Struts2处理name属性"item.name"中的值,如OGNL表达式。但它不会将评估结果替换为name属性,而是替换为value属性(如果未设置)。然后,如果您提交表单,则会创建name属性中的参数并通过HTTP请求发送。 Struts2使用params拦截器来解析参数名称。它处理诸如OGNL表达式之类的名称,并在访问对象和设置值时调用适当的方法getset。 OGNL表达式中的点代表属性解析器。在您的情况下,您应该使用getItem()方法来设置值,此项不应返回null值。那里没有使用setItem()。可能是你问为什么它没有被使用,但这可能是另一个问题。

答案 3 :(得分:1)

问题解决了。 getItem()实际上包含以下代码:

public Item getItem()
{
    System.out.println("Trying to get item: " + item.toString());
    return item;
}

这给出了一个nullpointer异常,因为item为null。只有,这个nullpointerexception不是struts框架所以!代码只是继续(当然失败了......)。当我删除sysout语句时,代码工作。