接口类型的Action属性

时间:2010-03-25 04:36:18

标签: struts2

通过我的介绍,Action的本质是可以使用请求参数值推送属性。并且,一个很棒的功能是Struts2允许您直接根据类类型属性填充参数值;)

假设存在一个Action和属性类,如下所示,     class Action extends ActionSupport {        用户用户;

   @Action(value="hello" {@result=(.......)})
   public void execute() {
      ........
   }
    .....
   public void setUser(User user) {
     this.user = user;
   }
   public User getUser() {
     return this.user;
   }
}

class User {
   String name;
    .....
   public void setName(String name) {
     this.name = name;
   }
   public String getName() {
     return this.name;
   }
}

你可以通过这样做来填充User类属性。

http://...../hello.action?user.name=John or via jsp page

然后,我意识到实际上有人将Action属性作为接口类型。我的问题是这背后的原因是什么。如果有示例代码证明它会很棒。

提前致谢!

1 个答案:

答案 0 :(得分:1)

抱歉,但你的问题没有多大意义。 澄清:

  • “属性”:在Java中,类的“属性”是可以通过getter / setters方法(setXXX()/ getXXX()=>属性XXX)访问的东西,但是(但不一定)对应一个私人领域。

  • 在Struts2中,您有一个Action对象,通常(不一定,并非总是)从请求中填充(设置)属性(通过“Parameters”拦截器),稍后在视图阶段读取JSP(或其他)页面。 因此,在您的示例中,对于请求 http://...../hello.action?user.name=John ,Struts2会尝试在您的操作中找到(...实际上在您的值堆栈中)属性“user”,它具有属性“名称“,并尝试设置它(如果类型是可转换的)。也就是说,他会尝试调用 yourAction.getUser()。setName(“John”)之类的东西。 Struts2不知道 - 不关心 - 属性“用户”或“名称”是什么类型,即使它们是真实字段。 (但是,它们的行为应该是“bean”:即它们应该有一个默认构造函数。)

  • 为什么以及何时应该编写接口而不是具体的类,这在任何Java书籍中都有解释,它只是一个标准的良好实践,并且有很多关于它的页面。它与Struts2无关。在这种情况下,对于一个Action,一个人只是对一些“服务”字段这样做感兴趣,通常是长寿命的对象(可能是单例),不会被动作本身(也不是请求!)实例化。因此,这些接口不是我们在这里考虑的属性,它们(通常)不会公开暴露,通常不会填充或从客户端读取。