我正在尝试了解其他人的Struts 2代码,但我遇到了数据传递问题。
我知道在JSP页面上,如果你使用<s:textfield name="something" ... />
标记,struts2会尝试在动作类中自动调用setSomething(...)
。
我现在看到这种类型的代码:
<s:textfield name="item.name" ... />
我想知道,这个.
(点)是如何工作的?我的动作类中有一个名为setItem()
的方法,并且在该方法中设置的对象具有setName()
方法,但显然这不起作用。点和名称之间的点是什么意思,如何正确使用它来实例化项目和设置它的名称?
PS:我的动作类中setItem()
中设置的item对象有一个空的args
构造函数。
答案 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表达式之类的名称,并在访问对象和设置值时调用适当的方法get
和set
。 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语句时,代码工作。