2013-03-19 38 views
5

Tôi đã tìm kiếm và tìm kiếm và không tìm thấy bất cứ điều gì nói rằng điều này là không thể, cũng không phải bất cứ điều gì giải thích làm thế nào để làm điều đó.Spring MVC: Chuyển hướng từ bộ điều khiển cơ sở - Cách nhận đường dẫn chuyển hướng đến?

Nếu bạn có bộ điều khiển cơ sở được mở rộng, tôi hiểu rằng các phương thức ánh xạ yêu cầu cũng được kế thừa.

Vì vậy, với ....

public abstract class BaseController 
{ 

    @RequestMapping(value="hello", method=RequestMethod.GET) 
    public String hello(Model model) { 
     return "hello-view; 
} 

... một điều khiển như vậy ...

@Controller 
@RequestMapping("/admin/") 
public abstract class AdminController 
{ 
.... 
} 

... sẽ thừa hưởng một phương pháp nghe ở/admin/hello mà trả về xin chào.

Tất cả đều ổn.

Nhưng nếu tôi có một phương pháp BaseController mà chuyển hướng:

public abstract class BaseController 
{ 

    @RequestMapping(value="hello", method=RequestMethod.POST) 
    public String hello(Model model) { 
     return "redirect:/success/; 
} 

Theo tôi được biết chuyển hướng yêu cầu hoặc một URL tương đối hoặc tuyệt đối chứ không phải là một viewname?

Vậy AdminController của tôi đảm bảo chuyển hướng diễn ra như thế nào với/admin/success /?

Phương thức BaseController nhận được điều khiển ở cấp lớp @requestMapping trên AdminController của tôi như thế nào?

Điều này có khả thi không?

Trả lời

7

Một lựa chọn:

public abstract class BaseController 
{ 
    /** get the context for the implementation controller **/ 
    protected abstract String getControllerContext(); 

    @RequestMapping(value="hello", method=RequestMethod.GET) 
    public String hello(Model model) { 
     return "redirect:"+getControllerContext()+"success/"; 
    } 
} 

và đây là bộ điều khiển quản trị.

@Controller 
@RequestMapping(AdminController.context) 
public abstract class AdminController 
{ 
    static final String context = "/admin/"; 
    @Override 
    protected String getControllerContext() { 
     return context; 
    } 
.... 
} 

Một tùy chọn khác có liên quan đến phản ánh rằng có thể làm việc ...:

public abstract class BaseController 
{ 
    String context = null; 

    @RequestMapping(value="hello", method=RequestMethod.GET) 
    public String hello(Model model) { 
     return "redirect:"+getControllerContext()+"success/"; 
    } 

    // untested code, but should get you started. 
    private String getControllerContext() { 
     if (context == null) { 
      Class klass = this.getClass(); 
      Annotation annotation = klass.getAnnotation(RequestMapping.class); 
      if (annotation != null) { 
       context = annotation.value(); 
      } 
     } 
     return context; 
    } 
} 
+0

wow - "Chú chú thích = klass. getAnnotation (RequestMapping.class); " có phép thuật - không thể thấy ở bất cứ đâu! chúc mừng - tuyệt vời! oh yes và @RequestMapping (AdminController.context) quá. Chúc mừng cho bài học! – n99

+0

vui vì nó hoạt động cho bạn :) – digitaljoel

-1

Chừng nào bạn không cần bất cứ điều gì động tôi sẽ chỉ chuyển hướng đến requestmapping trong chuỗi. Chưa sử dụng chuyển hướng bản thân mình chưa nhưng ánh xạ cho sự thành công admin của bạn sẽ là:

return "redirect:/admin/success/"

này nên tạo ra một trình duyệt chuyển hướng đến điều khiển của bạn với requestmapping tương ứng.

Một khả năng khác là sử dụng sự phản chiếu và lấy chú thích yêu cầu bản đồ cha mẹ của bạn.

+1

Chuyển hướng diễn ra trong lớp cha nhưng cần phải chèn ngữ cảnh từ lớp con vào chuỗi chuyển hướng. Nếu có nhiều triển khai của lớp cơ sở trừu tượng thì mã hóa cứng chuỗi chuyển hướng không hợp lý. Trong một trường hợp, họ muốn truy cập vào/admin/success và trong một triển khai khác, họ muốn chuyển đến/user/success. – digitaljoel

+0

Aye đúng. Không biết tại sao tôi bỏ lỡ điều đó! Câu trả lời của bạn là một khả năng tốt. –

1

Trong mùa xuân không cần phải cung cấp cho url tương đối như

"redirect:/admin/success/"; 

thay vì mã trên, trực tiếp bạn có thể cho như thế này

"redirect:/success/"; 

Theo mặc định nó sẽ đi theo con đường ngữ cảnh.

+0

đường dẫn ngữ cảnh và yêu cầu điều khiển là những điều khác nhau. Tôi đã quan tâm đến việc yêu cầu điều khiển .... – n99

1

Theo http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-redirecting-redirect-prefix redirect:/myapp/some/resource sẽ chuyển hướng tương ứng với ngữ cảnh Servlet hiện tại.

tôi kiểm tra: bối cảnh ứng dụng là topjava, bối cảnh Servlet là meals, yêu cầu http://localhost:8080/topjava/meals/update?...

chuyển hướng bởi redirect:meals-http://localhost:8080/topjava/meals/meals

chuyển hướng bởi redirect:/meals để http://localhost:8080/topjava/meals

Các vấn đề liên quan