복붙노트

[SPRING] 매개 변수 객체 속성

SPRING

매개 변수 객체 속성

누군가가 나에게 봄 mvc에서 하이퍼 링크에서 매개 변수를 기반으로 변경 개체 속성을 가지고 코드 효율적인 방법을 보여줄 수 있습니까?

"소유자"세부 정보 페이지가 특정 "소유자"가 소유 한 "애완 동물"의 각 유형별 목록을 표시 할 수 있도록 봄 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);
}

다음은 url 패턴 "/ 소유자"를 관리하는 OwnerController.java의 일부입니다. 여기에서 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";
}

해결법

  1. ==============================

    1.non-verbose 솔루션을 요청한 이래로 이런 종류의 반쯤 수정을 할 수 있습니다.

    non-verbose 솔루션을 요청한 이래로 이런 종류의 반쯤 수정을 할 수 있습니다.

    @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;
    }
    
    [...]
    <h3>Cats</h3>
    <c:forEach var="cat" items="${owner.cats}">
        <p>Name: <c:out value="${cat.name}" /></p>
    </c:forEach>
    
    <h3>All pets</h3>
    [...]
    
    /**
     * 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;
    }
    

  2. from https://stackoverflow.com/questions/20292152/parameterizing-object-properties by cc-by-sa and MIT license