【问题标题】:Struts 2 passing data from JSP to action classStruts 2 将数据从 JSP 传递到动作类
【发布时间】:2013-12-07 14:15:21
【问题描述】:

我试图理解别人的 Struts 2 代码,但遇到了数据传递问题。

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

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

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

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

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

【问题讨论】:

    标签: java jsp struts2 ognl


    【解决方案1】:

    在 OGNL 中,.点符号

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

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

    【讨论】:

      【解决方案2】:

      确保getItem().setName() 有公共方法

      可能方法不可用或不公开或拼写错误,例如 getitem() 而不是 getItem()。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          这给出了一个空指针异常,因为 item 为空。只是,这个空指针异常不是由 struts 框架抛出的!代码只是继续(当然失败了......)。当我删除 sysout 语句时,代码就可以工作了。

          【讨论】:

            猜你喜欢
            • 2015-04-03
            • 2014-12-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-04
            • 1970-01-01
            • 2013-06-11
            • 1970-01-01
            相关资源
            最近更新 更多