所以我在网上发现了一堆Struts 2 CRUD示例:
和几本书:
Apache Struts 2 Web应用程序开发ISBN:978-1847193391
Struts 2设计与编程ISBN:978-0980331608
但是他们所有人在如何进行表格填充方面都有所不同。
有人建议实现Java接口 ModelDriven 或 Prepareable 来调用准备函数来预先填充任何所需的数据成员。
其他人建议您创建自己的 PrepareForUpdate 操作,该操作会调用预填充功能,然后重定向到主编辑视图。
他们还非常关注如何传递对象标识符以指示要检索的对象以进行编辑。 SOme建议截取其他人在URL参数中抛出的内容并通过 ActionContext 检索它或通过 s:hidden 字段传递它。
Struts 2中是否有一种最佳实践方式来进行表单填充?
上述方法有哪些优点/缺点?
答案 0 :(得分:6)
我不知道任何记录的最佳实践,但我已经使用Webwork和Struts2大约三年了,所以我可以告诉你我在我的项目中使用了什么。顺便说一下,你链接到的CRUD演示文档让我觉得有些过时(我从项目网站上意识到它)。
我将CRUD工作分为三个不同的行动:
prepare()
方法设置下拉列表等。有人建议实现Java接口ModelDriven或Prepareable来调用come prepare函数来预先填充任何所需的数据成员。
这是我提倡的方法,虽然我不使用ModelDriven
接口。有关详细信息,请查看how Struts2 ModelDriven interface works以及我的回答评论。您是否使用ModelDriven
只是个人选择。另外,请查看why is model-driven action preferred over object backed bean properties.
其他人建议您创建自己的PrepareForUpdate操作,该操作会调用预填充函数,然后重定向到主编辑视图。
我之前没有看到过,根据你的描述,我会避免这种技巧。执行重定向并创建其他HTTP请求以实现prepare()
方法旨在处理的相同内容似乎很浪费。
他们还非常关注如何传递对象标识符以指示要检索的对象以进行编辑。
只需传递网址或表单中的标识符即可。这是Web应用程序的标准方法。
答案 1 :(得分:0)
我已经使用Struts 2大约3年了。我在同一个动作中一起使用ModelDriven和Prepareable。每个域对象(模型)都有一个struts动作类,它根据id是否传递给动作返回列表或单个对象。这对我来说效果很好,唯一有问题的是使用Ajax时。如果我使用它,我通常将我的Ajax操作分离为模型的单独操作。我将模型ID以及我可能需要的任何相关对象存储为视图中的隐藏HTML字段。
使用此方法,操作和视图是宁静的。您可以长时间离开页面并调用操作,而不必担心操作会失败。这是一个例子:
public class ApplicationAction extends MyBaseAction
implements ModelDriven<Application>, Preparable {
private static final long serialVersionUID = 7242685178906659449L;
private ApplicationService applicationService;
private Application application;
private Integer id;
List<Application> allApplications;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Application getModel() {
return application;
}
public void prepare() throws Exception {
if(id == null || id.intValue() == 0){
application= new Application();
}else{
application= applicationService.getApplication(id);
}
}
@SkipValidation
public String list() throws Exception {
allApplications = applicationService.getApplications();
return SUCCESS;
}
@Validations( visitorFields = {@VisitorFieldValidator(message = "Validation Error", fieldName = "model", appendPrefix = false)})
public String update() throws Exception {
applicationService.saveApplication(application);
addActionMessage("Application Saved Successfully.");
return SUCCESS;
}
public void setApplicationService(ApplicationService applicationService) {
this.applicationService = applicationService;
}
public List<Application> getAllApplications() {
return allApplications;
}
}