【发布时间】:2013-12-16 00:39:43
【问题描述】:
有人可以向我展示一种代码有效的方法,可以根据从超链接发送给它的参数来更改 spring mvc 中的对象属性吗?
我正在修改 spring petclinic 示例应用程序,以便“所有者”详细信息页面可以显示特定“所有者”拥有的每种“宠物”类型的单独列表。目前,“宠物”列表是每个“所有者”的属性,并且可以在 jstl 中作为 owner.pets 访问。我想要的是让我的 jstl 代码能够从 jstl 调用 owner.cats、owner.dogs、owner.lizards 等,并在网页的不同部分填充几个单独的列表,即使所有的猫、狗, 和蜥蜴存储在同一个基础数据表中。
我该如何做到这一点?
这里是JpaOwnerRepositoryImpl.java的相关方法:
@SuppressWarnings("unchecked")
public Collection<Owner> findByLastName(String lastName) {
// using 'join fetch' because a single query should load both owners and pets
// using 'left join fetch' because it might happen that an owner does not have pets yet
Query query = this.em.createQuery("SELECT DISTINCT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName");
query.setParameter("lastName", lastName + "%");
return query.getResultList();
}
@Override
public Owner findById(int id) {
// using 'join fetch' because a single query should load both owners and pets
// using 'left join fetch' because it might happen that an owner does not have pets yet
Query query = this.em.createQuery("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id");
query.setParameter("id", id);
return (Owner) query.getSingleResult();
}
这里是 Owner.java 的相关方面:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
private Set<Pet> pets;
protected Set<Pet> getPetsInternal() {
if (this.pets == null) {this.pets = new HashSet<Pet>();}
return this.pets;
}
public List<Pet> getPets() {
List<Pet> sortedPets = new ArrayList<Pet>(getPetsInternal());
PropertyComparator.sort(sortedPets, new MutableSortDefinition("name", true, true));
return Collections.unmodifiableList(sortedPets);
}
这是 OwnerController.java 的一部分,它管理 url 模式“/owners”,我希望我的 jstl 能够从中单独列出页面的不同部分中的猫、狗、蜥蜴等(不是在一个分组中)列表,但在几个单独的列表中。):
@RequestMapping(value = "/owners", method = RequestMethod.GET)
public String processFindForm(@RequestParam("ownerID") String ownerId, Owner owner, BindingResult result, Map<String, Object> model) {
Collection<Owner> results = this.clinicService.findOwnerByLastName("");
model.put("selections", results);
int ownrId = Integer.parseInt(ownerId);
model.put("sel_owner",this.clinicService.findOwnerById(ownrId));
return "owners/ownersList";
}
【问题讨论】:
-
考虑在调试中运行应用程序,看看什么时候调用。如果您得到意外的输出,则可能是调用了错误的方法。