Explorar el Código

Modified workflow in web gui to present the search result and search form in same view (start.jsp)

jorgen_falk hace 18 años
padre
commit
de2e4b0f31

+ 14
- 5
dddsample/src/main/java/se/citerus/dddsample/web/CargoTrackingController.java Ver fichero

@@ -1,5 +1,6 @@
1 1
 package se.citerus.dddsample.web;
2 2
 
3
+import org.springframework.validation.BindException;
3 4
 import org.springframework.web.servlet.ModelAndView;
4 5
 import org.springframework.web.servlet.mvc.SimpleFormController;
5 6
 import org.springframework.web.servlet.view.RedirectView;
@@ -10,6 +11,9 @@ import se.citerus.dddsample.service.CargoService;
10 11
 import se.citerus.dddsample.web.command.TrackCommand;
11 12
 
12 13
 import javax.servlet.ServletException;
14
+import javax.servlet.http.HttpServletRequest;
15
+import javax.servlet.http.HttpServletResponse;
16
+
13 17
 import java.util.HashMap;
14 18
 import java.util.Map;
15 19
 
@@ -26,15 +30,15 @@ public class CargoTrackingController extends SimpleFormController {
26 30
 
27 31
   public CargoTrackingController() {
28 32
     setCommandClass(TrackCommand.class);
29
-    setBindOnNewForm(true);
30 33
   }
31 34
 
35
+  
32 36
   @Override
33
-  public ModelAndView onSubmit(final Object command) throws ServletException {
37
+  protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception {
34 38
     ModelAndView mav = null;
35 39
     final Map<String, Object> model = new HashMap<String, Object>();
36 40
 
37
-    final TrackCommand trackCommand = (TrackCommand) command;
41
+    final TrackCommand trackCommand = (TrackCommand) command;   
38 42
     logger.debug("Finding cargo by trackingId: " + trackCommand.getTrackingId());
39 43
     final Cargo cargo = cargoService.find(trackCommand.getTrackingId());
40 44
 
@@ -42,7 +46,10 @@ public class CargoTrackingController extends SimpleFormController {
42 46
       final Location location = cargo.currentLocation();
43 47
       logger.debug("Location of [" + trackCommand.getTrackingId() + "] is [" + location + "]");
44 48
       model.put("location", location);
45
-      mav = new ModelAndView(getSuccessView(), model);
49
+      
50
+      // Can't just return a new MaV instance when successView and FormView is the same. Binding will fail.
51
+      // showForm will append our command and model to the request so that the form will bind successfully.
52
+      mav = showForm(request, errors, getSuccessView(), model);
46 53
     } else {
47 54
       model.put("trackingId", trackCommand.getTrackingId());
48 55
       mav = new ModelAndView(getUnknownCargoView(), model);
@@ -50,6 +57,7 @@ public class CargoTrackingController extends SimpleFormController {
50 57
     
51 58
     return mav;
52 59
   }
60
+   
53 61
 
54 62
   /**
55 63
    * Sets the cargo service instance.
@@ -77,6 +85,7 @@ public class CargoTrackingController extends SimpleFormController {
77 85
   public String getUnknownCargoView() {
78 86
     return unknownCargoView;
79 87
   }
80
-  
88
+
89
+
81 90
   
82 91
 }

+ 1
- 1
dddsample/src/main/webapp/WEB-INF/dispatch-servlet.xml Ver fichero

@@ -7,7 +7,7 @@
7 7
     <property name="sessionForm" value="true"/>
8 8
     <property name="commandName" value="trackCommand"/>
9 9
     <property name="formView" value="start"/>
10
-    <property name="successView" value="cargo"/>
10
+    <property name="successView" value="start"/>
11 11
     <property name="cargoService" ref="cargoService"/>
12 12
     <property name="validator" ref="trackCommandValidator"/>
13 13
     <property name="unknownCargoView" value="unknownCargo"/>

+ 6
- 5
dddsample/src/main/webapp/WEB-INF/jsp/start.jsp Ver fichero

@@ -20,12 +20,13 @@
20 20
     </table>
21 21
     <br>
22 22
     <input type="submit" value="Track!">
23
+    <c:choose>
24
+      <c:when test="${location ne null}">
25
+        <p>Your cargo is currently at: <b>${location}</b></p>
26
+      </c:when>
27
+    </c:choose>
23 28
   </form:form>
24 29
 </div>
25
-<c:choose>
26
-  <c:when test="${location ne null}">
27
-    <p>Your cargo is currently at: <b>${location}</b></p>
28
-  </c:when>
29
-</c:choose>
30
+
30 31
 </body>
31 32
 </html>

+ 45
- 4
dddsample/src/test/java/se/citerus/dddsample/web/CargoTrackingControllerTest.java Ver fichero

@@ -1,11 +1,13 @@
1 1
 package se.citerus.dddsample.web;
2 2
 
3 3
 import junit.framework.TestCase;
4
+
4 5
 import org.springframework.mock.web.MockHttpServletRequest;
5 6
 import org.springframework.mock.web.MockHttpServletResponse;
6 7
 import org.springframework.mock.web.MockHttpSession;
7 8
 import org.springframework.mock.web.MockServletContext;
8 9
 import org.springframework.web.servlet.ModelAndView;
10
+
9 11
 import se.citerus.dddsample.domain.Cargo;
10 12
 import se.citerus.dddsample.domain.Location;
11 13
 import se.citerus.dddsample.domain.TrackingId;
@@ -13,7 +15,6 @@ import se.citerus.dddsample.service.CargoService;
13 15
 import se.citerus.dddsample.web.command.TrackCommand;
14 16
 
15 17
 public class CargoTrackingControllerTest extends TestCase {
16
-
17 18
   CargoTrackingController controller;
18 19
   MockHttpServletRequest request;
19 20
   MockHttpServletResponse response;
@@ -26,11 +27,17 @@ public class CargoTrackingControllerTest extends TestCase {
26 27
     response = new MockHttpServletResponse();
27 28
     session = new MockHttpSession(servletContext);
28 29
     request.setSession(session);
30
+    
29 31
     controller = new CargoTrackingController();
30 32
     controller.setFormView("test-form");
31 33
     controller.setSuccessView("test-success");
34
+    controller.setUnknownCargoView("test-unkownCargo");
32 35
     controller.setCommandName("test-command-name");
33
-    controller.setCargoService(new CargoService() {
36
+    controller.setCargoService(getCargoServiceMock());
37
+  }
38
+
39
+  private CargoService getCargoServiceMock() {
40
+    return new CargoService() {
34 41
       public Cargo find(String trackingId) {
35 42
         Cargo cargo = new Cargo(
36 43
           new TrackingId(trackingId),
@@ -38,7 +45,15 @@ public class CargoTrackingControllerTest extends TestCase {
38 45
           new Location("BBB"));
39 46
         return cargo;
40 47
       }
41
-    });
48
+    };
49
+  }
50
+  
51
+  private CargoService getCargoServiceNullMock() {
52
+    return new CargoService() {
53
+      public Cargo find(String trackingId) {
54
+        return null;
55
+      }
56
+    };
42 57
   }
43 58
 
44 59
   public void testHandleGet() throws Exception {
@@ -57,9 +72,35 @@ public class CargoTrackingControllerTest extends TestCase {
57 72
     ModelAndView mav = controller.handleRequest(request, response);
58 73
 
59 74
     assertEquals("test-success", mav.getViewName());
60
-    assertEquals(1, mav.getModel().size());
75
+    assertEquals(3, mav.getModel().size());
61 76
     Location location = (Location) mav.getModel().get("location");
62 77
     assertEquals("AAA", location.unlocode());
63 78
   }
64 79
 
80
+  public void testUnknownCargo() throws Exception {
81
+    controller.setCargoService(getCargoServiceNullMock());
82
+    controller.setCommandClass(TrackCommandMock.class);
83
+    request.setMethod("POST");
84
+
85
+    ModelAndView mav = controller.handleRequest(request, response);
86
+
87
+    assertEquals("test-unkownCargo", mav.getViewName());
88
+    assertEquals(1, mav.getModel().size());
89
+    String trackId = (String) mav.getModel().get("trackingId");
90
+    assertEquals("MOCK", trackId);
91
+  }
92
+  
93
+  
94
+  
95
+  
96
+  /**
97
+   * Mock track command.
98
+   * 
99
+   * Sets a default track id when constructed.
100
+   */
101
+  private static class TrackCommandMock extends TrackCommand {
102
+    public TrackCommandMock() {
103
+      setTrackingId("MOCK");
104
+    }
105
+  }
65 106
 }