我正在从struts-2这本书中学习struts2。他们说,为了将数据传输到对象,模型驱动的操作优先于对象支持的bean属性。
可以解释一下他们为什么这么说?
原因与需要在视图层中提及引用名称
有关答案 0 :(得分:6)
如果您正在处理多个属性,本书主张使用一个对象来保存这些属性,而不是让它们直接用于操作以使您更容易。请考虑以下示例:
public class CreateNewWidgetAction extends ActionSupport {
private String property1;
private String property2;
private Long property3;
...
public String execute() throws Exception {
Widget widget = new Widget();
// set properties on widget
}
// getters and setters for properties here
}
public class CreateNewWidgetAction extends ActionSupport {
private Widget widget;
public String execute() throws Exception {
// sub properties for widget were already set, less work to do here
}
// getter and setter for widget here (or the
// getModel method if you are using the Model Driven approach)
}
在第二个示例中,我们直接在Widget上设置属性(假设widget具有property1,property2和property3)。
希望你能看到这会如何简化你处理大量属性的例子中的代码。
<强>更新强>
如果您选择实施ModelDriven
,那么您可以在表单中引用上面的属性property1
,property2
,property3
等。此外,由于您的操作是由在单个模型中,所有表单参数都被视为模型的子项。
如果您选择不实施ModelDriven
,那么您可以在表单中引用上面的属性widget.property1
,widget.property2
,widget.property3
等。此方法的优点就是你可以在动作上拥有与小部件上的属性不对应的其他属性。
除此之外,没有区别。事实上,这本书甚至说了很多:
与对象支持的JavaBeans属性一样,ModelDriven操作也允许我们使用复杂的Java对象来接收我们的数据。这两种方法之间的差异很小,并且选择一种方法没有任何功能性后果。
- Struts 2 in Action,第3章。使用Struts 2操作&gt;将数据传输到对象上 - Pg。 62
答案 1 :(得分:2)
良好的模型驱动会更好 例如,如果您有用户bean并且它在jsp端具有name属性den,则必须执行类似user.name的操作,以便OGNL可以发现您指向的是用户对象并且在该name属性中。
在模型驱动的接口的情况下,当请求进行操作时,该接口将把bean对象放在值栈的顶部,因为这个bean位于值栈的顶部,你不需要做像user.name这样的事情。你的jsp。
我希望它会回答你的问题