我在春季项目上编程。 Formatter(org.springframework.format.Formatter)用于将模型中的实体转换为String,以便在JSP页面中打印出来,并再次将字符串转换为实体,以便控制器可以直接处理实体。我跟着宠物诊所的例子。
public class PetTypeFormatter implements Formatter<PetType> {
private final ClinicService clinicService;
@Autowired
public PetTypeFormatter(ClinicService clinicService) {
this.clinicService = clinicService;
}
@Override
public String print(PetType petType, Locale locale) {
System.out.println("PetTypeFormatter: print");
return petType.getName();
}
@Override
public PetType parse(String text, Locale locale) throws ParseException {
System.out.println("PetTypeFormatter: parse");
Collection<PetType> findPetTypes = this.clinicService.findPetTypes();
for (PetType type : findPetTypes) {
if (type.getName().equals(text)) {
return type;
}
}
throw new ParseException("type not found: " + text, 0);
}
}
Controller具有名为“types”的模型属性,映射到声明为以下代码的Collection:
@ModelAttribute("types")
public Collection<PetType> populatePetTypes() {
return this.clinicService.findPetTypes();
}
在JSP页面中,创建一个选择框,该框应该通过 PetTypeFormatter.print()方法列出String中的所有类型。您只需要解析类型以选择框名称字段。
<petclinic:selectField names="${types}" name="type" label="Type" size="5"/>
反过来,使用select box中的select string, PetTypeFormatter.parse()方法将字符串转换为PetType实体,以便控制器处理。
我的问题是我需要很多实体才能进行这种格式化。复制代码并为不同的实体对象创建10个以上的格式化程序后,我觉得必须有更好的模式才能使代码看起来更简洁。任何人都可以给我一些建议吗?谢谢!