Petclinic is RESTful.

This commit is contained in:
Arjen Poutsma
2008-11-20 23:42:20 +00:00
parent e9649b3a34
commit 1929f67f02
27 changed files with 144 additions and 60 deletions

View File

@@ -74,4 +74,9 @@ public interface Clinic {
*/
void storeVisit(Visit visit) throws DataAccessException;
/**
* Deletes a <code>Pet</code> from the data store.
*/
void deletePet(int id) throws DataAccessException;
}

View File

@@ -13,6 +13,7 @@ import org.springframework.samples.petclinic.Vet;
import org.springframework.samples.petclinic.Visit;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.DataAccessException;
/**
* Hibernate implementation of the Clinic interface.
@@ -86,4 +87,9 @@ public class HibernateClinic implements Clinic {
sessionFactory.getCurrentSession().merge(visit);
}
public void deletePet(int id) throws DataAccessException {
Pet pet = loadPet(id);
sessionFactory.getCurrentSession().delete(pet);
}
}

View File

@@ -240,6 +240,10 @@ public class SimpleJdbcClinic implements Clinic, SimpleJdbcClinicMBean {
}
}
public void deletePet(int id) throws DataAccessException {
this.simpleJdbcTemplate.update("DELETE FROM pets WHERE id=?", id);
}
// END of Clinic implementation section ************************************

View File

@@ -14,6 +14,7 @@ import org.springframework.samples.petclinic.Vet;
import org.springframework.samples.petclinic.Visit;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.dao.DataAccessException;
/**
* JPA implementation of the Clinic interface using EntityManager.
@@ -87,4 +88,9 @@ public class EntityManagerClinic implements Clinic {
visit.setId(merged.getId());
}
public void deletePet(int id) throws DataAccessException {
Pet pet = loadPet(id);
this.em.remove(pet);
}
}

View File

@@ -21,9 +21,10 @@ import org.springframework.web.bind.WebDataBinder;
*
* @author Juergen Hoeller
* @author Ken Krebs
* @author Arjen Poutsma
*/
@Controller
@RequestMapping("/addOwner.do")
@RequestMapping("/owners/new")
@SessionAttributes(types = Owner.class)
public class AddOwnerForm {
@@ -55,7 +56,7 @@ public class AddOwnerForm {
else {
this.clinic.storeOwner(owner);
status.setComplete();
return "redirect:owner.do?ownerId=" + owner.getId();
return "redirect:/clinic/owners/" + owner.getId();
}
}

View File

@@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.bind.WebDataBinder;
@@ -26,9 +27,10 @@ import org.springframework.web.bind.WebDataBinder;
*
* @author Juergen Hoeller
* @author Ken Krebs
* @author Arjen Poutsma
*/
@Controller
@RequestMapping("/addPet.do")
@RequestMapping("/owners/{ownerId}/pets/new")
@SessionAttributes("pet")
public class AddPetForm {
@@ -50,7 +52,7 @@ public class AddPetForm {
}
@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("ownerId") int ownerId, Model model) {
public String setupForm(@PathVariable("ownerId") int ownerId, Model model) {
Owner owner = this.clinic.loadOwner(ownerId);
Pet pet = new Pet();
owner.addPet(pet);
@@ -67,7 +69,7 @@ public class AddPetForm {
else {
this.clinic.storePet(pet);
status.setComplete();
return "redirect:owner.do?ownerId=" + pet.getOwner().getId();
return "redirect:/clinic/owners/" + pet.getOwner().getId();
}
}

View File

@@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.bind.WebDataBinder;
@@ -23,9 +24,10 @@ import org.springframework.web.bind.WebDataBinder;
*
* @author Juergen Hoeller
* @author Ken Krebs
* @author Arjen Poutsma
*/
@Controller
@RequestMapping("/addVisit.do")
@RequestMapping("/owners/*/pets/{petId}/visits/new")
@SessionAttributes("visit")
public class AddVisitForm {
@@ -42,7 +44,7 @@ public class AddVisitForm {
}
@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("petId") int petId, Model model) {
public String setupForm(@PathVariable("petId") int petId, Model model) {
Pet pet = this.clinic.loadPet(petId);
Visit visit = new Visit();
pet.addVisit(visit);
@@ -59,7 +61,7 @@ public class AddVisitForm {
else {
this.clinic.storeVisit(visit);
status.setComplete();
return "redirect:owner.do?ownerId=" + visit.getPet().getOwner().getId();
return "redirect:/clinic/owners/" + visit.getPet().getOwner().getId();
}
}

View File

@@ -7,6 +7,8 @@ import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.servlet.ModelAndView;
/**
* Annotation-driven <em>MultiActionController</em> that handles all non-form
@@ -15,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestParam;
* @author Juergen Hoeller
* @author Mark Fisher
* @author Ken Krebs
* @author Arjen Poutsma
*/
@Controller
public class ClinicController {
@@ -34,7 +37,7 @@ public class ClinicController {
* determine the logical view name based on the request URL: "/welcome.do"
* -&gt; "welcome".
*/
@RequestMapping("/welcome.do")
@RequestMapping("/welcome")
public void welcomeHandler() {
}
@@ -48,25 +51,22 @@ public class ClinicController {
*
* @return a ModelMap with the model attributes for the view
*/
@RequestMapping("/vets.do")
@RequestMapping("/vets")
public ModelMap vetsHandler() {
return new ModelMap(this.clinic.getVets());
}
/**
* Custom handler for displaying an owner.
* <p>
* Note that this handler returns a plain {@link ModelMap} object instead of
* a ModelAndView, thus leveraging convention-based model attribute names.
* It relies on the RequestToViewNameTranslator to determine the logical
* view name based on the request URL: "/owner.do" -&gt; "owner".
*
* @param ownerId the ID of the owner to display
* @return a ModelMap with the model attributes for the view
*/
@RequestMapping("/owner.do")
public ModelMap ownerHandler(@RequestParam("ownerId") int ownerId) {
return new ModelMap(this.clinic.loadOwner(ownerId));
@RequestMapping("/owners/{ownerId}")
public ModelAndView ownerHandler(@PathVariable("ownerId") int ownerId) {
ModelAndView mav = new ModelAndView("owner");
mav.addObject(this.clinic.loadOwner(ownerId));
return mav;
}
}

View File

@@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.bind.WebDataBinder;
@@ -21,9 +22,10 @@ import org.springframework.web.bind.WebDataBinder;
*
* @author Juergen Hoeller
* @author Ken Krebs
* @author Arjen Poutsma
*/
@Controller
@RequestMapping("/editOwner.do")
@RequestMapping("/owners/{ownerId}/edit")
@SessionAttributes(types = Owner.class)
public class EditOwnerForm {
@@ -40,7 +42,7 @@ public class EditOwnerForm {
}
@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("ownerId") int ownerId, Model model) {
public String setupForm(@PathVariable("ownerId") int ownerId, Model model) {
Owner owner = this.clinic.loadOwner(ownerId);
model.addAttribute(owner);
return "ownerForm";
@@ -55,7 +57,7 @@ public class EditOwnerForm {
else {
this.clinic.storeOwner(owner);
status.setComplete();
return "redirect:owner.do?ownerId=" + owner.getId();
return "redirect:/clinic/owners/" + owner.getId();
}
}

View File

@@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.bind.WebDataBinder;
@@ -24,9 +25,10 @@ import org.springframework.web.bind.WebDataBinder;
*
* @author Juergen Hoeller
* @author Ken Krebs
* @author Arjen Poutsma
*/
@Controller
@RequestMapping("/editPet.do")
@RequestMapping("/owners/*/pets/{petId}")
@SessionAttributes("pet")
public class EditPetForm {
@@ -48,7 +50,7 @@ public class EditPetForm {
}
@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("petId") int petId, Model model) {
public String setupForm(@PathVariable("petId") int petId, Model model) {
Pet pet = this.clinic.loadPet(petId);
model.addAttribute("pet", pet);
return "petForm";
@@ -63,8 +65,15 @@ public class EditPetForm {
else {
this.clinic.storePet(pet);
status.setComplete();
return "redirect:owner.do?ownerId=" + pet.getOwner().getId();
return "redirect:/clinic/owners/" + pet.getOwner().getId();
}
}
@RequestMapping(method = RequestMethod.DELETE)
public String deletePet(@PathVariable int petId) {
Pet pet = this.clinic.loadPet(petId);
this.clinic.deletePet(petId);
return "redirect:/clinic/owners/" + pet.getOwner().getId();
}
}

View File

@@ -19,9 +19,9 @@ import org.springframework.web.bind.WebDataBinder;
*
* @author Juergen Hoeller
* @author Ken Krebs
* @author Arjen Poutsma
*/
@Controller
@RequestMapping("/findOwners.do")
public class FindOwnersForm {
private final Clinic clinic;
@@ -36,13 +36,13 @@ public class FindOwnersForm {
dataBinder.setDisallowedFields(new String[] {"id"});
}
@RequestMapping(method = RequestMethod.GET)
@RequestMapping(value = "/owners/form", method = RequestMethod.GET)
public String setupForm(Model model) {
model.addAttribute("owner", new Owner());
return "findOwners";
}
@RequestMapping(method = RequestMethod.POST)
@RequestMapping(value = "/owners", method = RequestMethod.GET)
public String processSubmit(Owner owner, BindingResult result, Model model) {
// find owners by last name
Collection<Owner> results = this.clinic.findOwners(owner.getLastName());
@@ -59,7 +59,7 @@ public class FindOwnersForm {
else {
// 1 owner found
owner = results.iterator().next();
return "redirect:owner.do?ownerId=" + owner.getId();
return "redirect:/clinic/owners/" + owner.getId();
}
}