diff --git a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/Owner.java b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/Owner.java index ec19625a381cd073aa7d5a2279d1943eaee2bda4..934accd06c076b360269c4112aca62b06cab0e56 100644 --- a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/Owner.java +++ b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/Owner.java @@ -14,12 +14,57 @@ public class Owner { private String telephone; + public Owner() { + + } + + public Owner(Long id) { + this.id = id; + } + public Long getId() { return id; } - - public String getName() { + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { return lastName; } + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getTelephone() { + return telephone; + } + + public void setTelephone(String telephone) { + this.telephone = telephone; + } + + } diff --git a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnerController.java b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnerController.java index 11be755b22af72fca73e5182b3c013ed47882dc1..d357c0471d959ed703d9d60c5fc9cb5b108bb78d 100644 --- a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnerController.java +++ b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnerController.java @@ -1,8 +1,10 @@ package org.springframework.samples.petclinic.owners; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.samples.petclinic.util.ResponseContext; +import org.springframework.samples.petclinic.util.ExternalContext; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -18,19 +20,20 @@ public class OwnerController { } @RequestMapping(method=RequestMethod.GET) - public Owner get(Long owner) { - return repository.getOwner(owner); + public String get(@PathVariable Long owner, Model model) { + model.addAttribute(repository.getOwner(owner)); + return "owner"; } @RequestMapping(value="/edit", method=RequestMethod.GET) - public Owner getEditForm(Long owner) { + public Owner getEditForm(@PathVariable Long owner) { return repository.getOwner(owner); } @RequestMapping(method = RequestMethod.PUT) - public void put(Owner owner, ResponseContext response) { + public void put(Owner owner, ExternalContext response) { repository.saveOwner(owner); - response.redirect(owner.getName()); + response.redirect(owner.getId()); } } \ No newline at end of file diff --git a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnerRepository.java b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnerRepository.java index 762ba5dc8af6674e03b2fa20e761c0ac91cd00be..10702243d5c6e534d7fa507d114db7d74b03805d 100644 --- a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnerRepository.java +++ b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnerRepository.java @@ -8,6 +8,6 @@ public interface OwnerRepository { Owner getOwner(Long id); - void saveOwner(Owner owner); + Long saveOwner(Owner owner); } \ No newline at end of file diff --git a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnerSearchForm.java b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnerSearchForm.java new file mode 100644 index 0000000000000000000000000000000000000000..c9c589607263707eacd356ac47ae832d3fb1fdfc --- /dev/null +++ b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnerSearchForm.java @@ -0,0 +1,15 @@ +package org.springframework.samples.petclinic.owners; + +public class OwnerSearchForm { + + private String lastName; + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + +} diff --git a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnersController.java b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnersController.java index 93fd5b9e73b1dc594a6c79dd0c845b985379a102..f41e89571d151cfdbb7fc3bec728251aef827f0e 100644 --- a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnersController.java +++ b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/OwnersController.java @@ -3,7 +3,6 @@ package org.springframework.samples.petclinic.owners; import java.util.Collection; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.samples.petclinic.util.ResponseContext; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -21,8 +20,8 @@ public class OwnersController { } @RequestMapping(method = RequestMethod.GET) - public void get() { - + public OwnerSearchForm get() { + return new OwnerSearchForm(); } @RequestMapping(value="/search", method = RequestMethod.GET) @@ -36,9 +35,10 @@ public class OwnersController { } @RequestMapping(method = RequestMethod.POST) - public void post(Owner owner, ResponseContext response) { - repository.saveOwner(owner); - response.redirect(owner.getName()); + public String post(Owner owner) { + Long ownerId = repository.saveOwner(owner); + // TODO simplify this since /owners is the current resource already? + return "redirect:/owners/" + ownerId; } } diff --git a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/StubOwnerRepository.java b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/StubOwnerRepository.java index 5c3406bf0e32a8f264fd4b5c886c0a8e8f69b707..d442ee9948b63654515ee4aa45893c078ee0c364 100644 --- a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/StubOwnerRepository.java +++ b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/StubOwnerRepository.java @@ -12,10 +12,11 @@ public class StubOwnerRepository implements OwnerRepository { } public Owner getOwner(Long id) { - return null; + return new Owner(id); } - public void saveOwner(Owner owner) { + public Long saveOwner(Owner owner) { + return 1L; } } diff --git a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/pets/PetController.java b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/pets/PetController.java index d789f9151356d619800f6999d92300f97730fb3d..a0a7e74e846b8eea4eb2f0a1b2461a3af6833830 100644 --- a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/pets/PetController.java +++ b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/owners/pets/PetController.java @@ -1,7 +1,7 @@ package org.springframework.samples.petclinic.owners.pets; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.samples.petclinic.util.ResponseContext; +import org.springframework.samples.petclinic.util.ExternalContext; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -28,13 +28,13 @@ public class PetController { } @RequestMapping(method = RequestMethod.PUT) - public void put(Pet pet, ResponseContext response) { + public void put(Pet pet, ExternalContext response) { repository.savePet(pet); response.redirect(pet.getName()); } @RequestMapping(method = RequestMethod.DELETE) - public void delete(Long owner, String pet, ResponseContext context) { + public void delete(Long owner, String pet, ExternalContext context) { context.forResource("owners").redirect(owner); } diff --git a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/util/ExternalContext.java b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/util/ExternalContext.java new file mode 100644 index 0000000000000000000000000000000000000000..5f4fc1e3e355db4f0ed0806123ae82e7768863b6 --- /dev/null +++ b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/util/ExternalContext.java @@ -0,0 +1,22 @@ +package org.springframework.samples.petclinic.util; + +import org.springframework.ui.Model; + +// This is an idea as a context object to make avail to @Controller methods to interact with Dispatcher +public interface ExternalContext { + + Model getModel(); + + void selectView(String viewName); + + void renderFragment(String fragment); + + void redirect(Object resource); + + ExternalContext forResource(Object resource); + + Object getNativeRequest(); + + Object getNativeResponse(); + +} diff --git a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/util/ResponseContext.java b/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/util/ResponseContext.java deleted file mode 100644 index fd9d5f67405f58e883326636247b5960857097d5..0000000000000000000000000000000000000000 --- a/org.springframework.samples.petclinic/src/main/java/org/springframework/samples/petclinic/util/ResponseContext.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.springframework.samples.petclinic.util; - -public interface ResponseContext { - - void redirect(Object resource); - - ResponseContext forResource(Object resource); - -} diff --git a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/layouts/page.jsp b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/layouts/page.jsp index df5ed7baeb536694942233801f328f4e6c6dbc76..b92d0ffa1c39e14a2ec367d5d50db844bdb18f71 100644 --- a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/layouts/page.jsp +++ b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/layouts/page.jsp @@ -22,9 +22,9 @@ </ul> <div id="nav"> <ul> - <li><a href="<c:url value="/"/>">Home</a></li> - <li><a href="appointments">Appointments</a></li> - <li><a href="owners">Owners</a></li> + <li><a href="${pageContext.request.contextPath}">Home</a></li> + <li><a href="${pageContext.request.contextPath}/appointments">Appointments</a></li> + <li><a href="${pageContext.request.contextPath}/owners">Owners</a></li> </ul> </div> </div> diff --git a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/addNewForm.jsp b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/addNewForm.jsp new file mode 100644 index 0000000000000000000000000000000000000000..68ad9dd6f5e3b6c891a7889f7fab5163a28a572b --- /dev/null +++ b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/addNewForm.jsp @@ -0,0 +1,15 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> +<h2>Add New Owner</h2> + +<form:form id="addNewForm" action="${pageContext.request.contextPath}/owners" modelAttribute="owner" method="post"> + <form:label for="firstName" path="firstName"> + First Name + <form:input path="firstName" /> + </form:label> + <form:label for="lastName" path="lastName"> + Last Name + <form:input path="lastName" /> + </form:label> + <input type="submit" value="Add" /> +</form:form> \ No newline at end of file diff --git a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/content.jsp b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/content.jsp new file mode 100644 index 0000000000000000000000000000000000000000..c0dae0e50b6afb2572c833dd35fb6b8dea91b40a --- /dev/null +++ b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/content.jsp @@ -0,0 +1,11 @@ +<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %> + +<div id="sidebar"> + <ul id="sub-nav"> + <li><a href="${pageContext.request.contextPath}/owners">Search</a></li> + <li><a href="${pageContext.request.contextPath}/owners/new">Add New</a></li> + </ul> +</div> +<div id="main"> + <tiles:insertAttribute name="main" /> +</div> \ No newline at end of file diff --git a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/search.jsp b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/owner.jsp similarity index 74% rename from org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/search.jsp rename to org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/owner.jsp index f098b9d19ed025577e559b813accb5813516fcc3..85dcec17b41cd81f0f1e97db07adec0fe993945c 100644 --- a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/search.jsp +++ b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/owner.jsp @@ -1,2 +1,2 @@ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> -<h2>Search Owners</h2> \ No newline at end of file +<h2>Owner Details</h2> \ No newline at end of file diff --git a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/searchForm.jsp b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/searchForm.jsp new file mode 100644 index 0000000000000000000000000000000000000000..1a5830d29ef6d96124bd64bede2e78a7b01f4ee5 --- /dev/null +++ b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/searchForm.jsp @@ -0,0 +1,12 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> + +<h2>Search Owners</h2> + +<form:form id="searchForm" action="owners/search" modelAttribute="ownerSearchForm" method="get"> + <form:label for="lastName" path="lastName"> + Last Name + <form:input path="lastName" /> + </form:label> + <input type="submit" value="Search" /> +</form:form> \ No newline at end of file diff --git a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/searchResults.jsp b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/searchResults.jsp new file mode 100644 index 0000000000000000000000000000000000000000..c01fd8abb20ffb3f9446d768cfe73a27ceb352be --- /dev/null +++ b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/owners/searchResults.jsp @@ -0,0 +1,2 @@ +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<h2>Search Results</h2> \ No newline at end of file diff --git a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/tiles.xml b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/tiles.xml index 64d5e66b58f4e44e4c555824487e47a4747c3f9d..87229ac06d05f6811348e43f4ffe926e5e7b2297 100644 --- a/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/tiles.xml +++ b/org.springframework.samples.petclinic/src/main/webapp/WEB-INF/tiles.xml @@ -18,14 +18,50 @@ <!-- APPOINTMENTS PAGES --> <definition name="appointments" extends="page"> - <put-attribute name="title" value="Appointment" type="string" /> + <put-attribute name="title" value="Appointments" type="string" /> <put-attribute name="content" value="/WEB-INF/appointments/calendar.jsp" type="template" /> </definition> <!-- OWNERS PAGES --> + + <!-- SEARCH PAGE --> <definition name="owners" extends="page"> + <put-attribute name="title" value="Owners" type="string" /> + <put-attribute name="content" value="owners.content" type="definition" /> + </definition> + + <definition name="owners.content" template="/WEB-INF/owners/content.jsp"> + <put-attribute name="main" value="/WEB-INF/owners/searchForm.jsp" type="template" /> + </definition> + + <!-- ADD NEW PAGE --> + <definition name="owners/new" extends="page"> + <put-attribute name="title" value="Owners" type="string" /> + <put-attribute name="content" value="owners/new.content" type="definition" /> + </definition> + + <definition name="owners/new.content" template="/WEB-INF/owners/content.jsp"> + <put-attribute name="main" value="/WEB-INF/owners/addNewForm.jsp" type="template" /> + </definition> + + <!-- SEARCH RESULTS PAGE --> + <definition name="owners/search" extends="page"> <put-attribute name="title" value="Owner Search" type="string" /> - <put-attribute name="content" value="/WEB-INF/owners/search.jsp" type="template" /> - </definition> + <put-attribute name="content" value="owners/search.content" type="definition" /> + </definition> + + <definition name="owners/search.content" template="/WEB-INF/owners/content.jsp"> + <put-attribute name="main" value="/WEB-INF/owners/searchResults.jsp" type="template" /> + </definition> + + <!-- OWNER DETAIL PAGE --> + <definition name="owner" extends="page"> + <put-attribute name="title" value="Owner" type="string" /> + <put-attribute name="content" value="owner.content" type="definition" /> + </definition> + <definition name="owner.content" template="/WEB-INF/owners/content.jsp"> + <put-attribute name="main" value="/WEB-INF/owners/owner.jsp" type="template" /> + </definition> + </tiles-definitions> \ No newline at end of file