2011-10-20 29 views
9

tôi có các bản đồ sau:biến đường dẫn tùy chọn trong mùa xuân-MVC RequestMapping URITemplate

@RequestMapping(value = "/{first}/**/{last}", method = RequestMethod.GET) 
public String test(@PathVariable("first") String first, @PathVariable("last") 
    String last) {} 

nào cho các URI sau:

foo/a/b/c/d/e/f/g/h/bar 
foo/a/bar 
foo/bar 

maps foo- đầu tiên thanh đến cuối cùng và hoạt động tốt.

Những gì tôi muốn là cái gì đó ánh xạ tất cả mọi thứ giữa foo và bar vào một con đường param duy nhất, hoặc null nếu có giữa không (như trong URI ngoái chẳng hạn):

@RequestMapping(value = "/{first}/{middle:[some regex here?]}/{last}", 
    method = RequestMethod.GET) 
public String test(@PathVariable("first") String first, @PathVariable("middle") 
    String middle, @PathVariable("last") String last) {} 

Khá mắc kẹt trên regex vì tôi đã hy vọng rằng một cái gì đó đơn giản như {middle:. *}, trong đó chỉ bản đồ đến/foo/a/bar hoặc {middle: (. * /) *}, dường như không ánh xạ tới gì cả.

Trình AntPathStringMatcher có mã hóa "/" trước khi áp dụng các mẫu regex không? (làm cho các mẫu chéo/không thể) hoặc có giải pháp?

FYI này là trong mùa xuân 3.1M2

này có vẻ tương tự như @RequestMapping controllers and dynamic URLs nhưng tôi đã không nhìn thấy một giải pháp đó.

Trả lời

1

Không thể thực hiện được như tôi biết. Như bạn đã nói, biểu thức chính quy đang được áp dụng cho phần tử đường dẫn sau khi chia nhỏ đường dẫn tại mỗi dấu gạch chéo, do đó biểu thức chính quy không bao giờ khớp với '/'.

Bạn có thể tự kiểm tra url và phân tích cú pháp chính nó từ đối tượng yêu cầu.

1

Nó có thể được thực hiện bằng cách viết một đường dẫn tùy chỉnh phù hợp và cấu hình mùa xuân để sử dụng nó. Ví dụ: giải pháp như vậy được ghi ở đây: http://java.dzone.com/articles/spring-3-webmvc-optional-path

Liên kết cung cấp trình kết nối đường dẫn tùy chỉnh và cho biết cách định cấu hình lò xo để sử dụng. Điều đó sẽ giải quyết nhu cầu của bạn nếu bạn không nhớ viết một thành phần tùy chỉnh.

Ngoài ra, đây là một bản sao của With Spring 3.0, can I make an optional path variable?

13

Trong dự án của tôi, tôi sử dụng biến bên trong Spring Framework:

@RequestMapping(value = { "/trip/", // /trip/ 
     "/trip/{tab:doa|poa}/",// /trip/doa/,/trip/poa/ 
     "/trip/page{page:\\d+}/",// /trip/page1/ 
     "/trip/{tab:doa|poa}/page{page:\\d+}/",// /trip/doa/page1/,/trip/poa/page1/ 
     "/trip/{tab:trip|doa|poa}-place-{location}/",// /trip/trip-place-beijing/,/trip/doa-place-shanghai/,/trip/poa-place-newyork/, 
     "/trip/{tab:trip|doa|poa}-place-{location}/page{page:\\d+}/"// /trip/trip-place-beijing/page1/ 
}, method = RequestMethod.GET) 
public String tripPark(Model model, HttpServletRequest request) throws Exception { 
    int page = 1; 
    String location = ""; 
    String tab = "trip"; 
    // 
    Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); 
    if (pathVariables != null) { 
     if (pathVariables.containsKey("page")) { 
      page = NumberUtils.toInt("" + pathVariables.get("page"), page); 
     } 
     if (pathVariables.containsKey("tab")) { 
      tab = "" + pathVariables.get("tab"); 
     } 
     if (pathVariables.containsKey("location")) { 
      location = "" + pathVariables.get("location"); 
     } 
    } 
    page = Math.max(1, Math.min(50, page)); 
    final int pagesize = "poa".equals(tab) ? 40 : 30; 
    return _processTripPark(location, tab, pagesize, page, model, request); 
} 

Xem HandlerMapping.html#URI_TEMPLATE_VARIABLES_ATTRIBUTE

-1

cố gắng sử dụng này

@RequestMapping(value = {"some mapped address","some mapped address with path variable","some mapped address with another path variable"}) 

danh sách mảng của url có sẵn cho cụ thể phương pháp

Nhưng hãy cẩn thận khi tạo danh sách url khi bạn đang sử dụng @PathVariable trong chữ ký phương thức của bạn không thể rỗng.

hy vọng điều này sẽ giúp ích

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