通过我的介绍,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属性作为接口类型。我的问题是这背后的原因是什么。如果有示例代码证明它会很棒。
提前致谢!
答案 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,一个人只是对一些“服务”字段这样做感兴趣,通常是长寿命的对象(可能是单例),不会被动作本身(也不是请求!)实例化。因此,这些接口不是我们在这里考虑的属性,它们(通常)不会公开暴露,通常不会填充或从客户端读取。