【发布时间】:2011-06-29 18:52:46
【问题描述】:
我不确定这是否可行,但我需要对 Spring MVC 进行一些奇怪的绑定。我们必须动态生成一个页面,这是运行某些报告的前兆。不同的报告会有不同的标准,这些标准限制了报告上显示的数据。
我希望我能做这样的事情:
public interface ReportingStrategy extends Serializable {
public String getReportingCriteria(); //Each subclass will generate the SQL needed
}
public class DateLimitingStrategy implements ReportingStrategy {
private Date startDate;
public Date getStartDate() { return startDate; }
public void setStartDate(Date startDate) { this.startDate = startDate; }
private Date endDate;
public Date getEndDate() { return endDate; }
public void setEndDate(Date endDate) { this.endDate = endDate; }
public String getReportingCriteria() {
//Generate SQL for date range (where necessary)
}
}
public class SortingStrategy impelements ReportingStrategy {
public String sortValue;
public String getSortValue() { return this.sortValue; }
public void setSortValue(String sortValue) { this.sortValue = sortValue; }
}
所以这似乎是一个非常简单的想法。
在我的控制器方面,我希望能够绑定到帖子上的这些列表。我能够生成 HTML,这应该是必要的,但绑定无法正常工作。这是我的控制器的基础:
@RequestMapping(method = RequestMethod.GET)
public ModelAndView(@RequestParam("reportName") String reportName) {
ModelAndView mav = new ModelAndView("showReportingStrategies");
mav.addObject("backingObject", new BackingObject(reportName));
return mav;
}
@RequestMapping(method = RequestMethod.POST)
public ModelAndView(@ModelAttribute("backingObject") BackingObject bo, BindingResult result) {
//More logic here
}
public class BackingObject implements Serializable {
private List<ReportingStrategy> reportingStrategies;
public void setReportingStratgies(List<ReportingStrategy> reportingStrategies) {
this.reportingStrategies = reportingStrategies;
}
public List<ReportingStrategy> getReportingStrategies() { return this.reportingStrategies; }
}
这甚至可以通过扩展 PropertyEditorSupport 和使用 InitBinder 魔法来实现吗?
【问题讨论】:
-
在页面加载时是否已知报告策略的类型,或者是用户选择它们?
-
它们将是已知的,只是动态的,报告 A 可能有一个日期限制策略,而报告 B 可能两者都有。 BackingObject 的构造函数将在 DB 中查找它们(未显示)
标签: java spring data-binding spring-mvc