gpt4 book ai didi

java - 参数化对象属性

转载 作者:行者123 更新时间:2023-12-01 13:47:00 25 4
gpt4 key购买 nike

有人可以向我展示一种有效的代码方法,使 spring mvc 中的对象属性根据从超链接发送到它的参数进行更改吗?

我正在修改 spring petclinic 示例应用程序,以便“所有者”详细信息页面可以显示特定“所有者”拥有的每种类型“宠物”的单独列表。目前,“宠物”列表是每个“所有者”的属性(property),并且可以在 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";
}

最佳答案

既然您要求一个非详细的解决方案,您就可以进行这种半脏修复。

Owner.java

@Transient
private Set<Pet> cats = new HashSet<Pet>();

[...]

// Call this from OwnerController before returning data to page.
public void parsePets() {
for (Pet pet : getPetsInternal()) {
if ("cat".equals(pet.getType().getName())) {
cats.add(pet);
}
}
}

public getCats() {
return cats;
}

ownerDetail.jsp

[...]
<h3>Cats</h3>
<c:forEach var="cat" items="${owner.cats}">
<p>Name: <c:out value="${cat.name}" /></p>
</c:forEach>

<h3>All pets</h3>
[...]

OwnerController.java

/**
* Custom handler for displaying an owner.
*
* @param ownerId the ID of the owner to display
* @return a ModelMap with the model attributes for the view
*/
@RequestMapping("/owners/{ownerId}")
public ModelAndView showOwner(@PathVariable("ownerId") int ownerId) {
ModelAndView mav = new ModelAndView("owners/ownerDetails");
Owner owner = this.clinicService.findOwnerById(ownerId);
owner.parsePets();
mav.addObject(owner);
return mav;
}

Screenshot of the change

关于java - 参数化对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com