2011-11-27 14 views
9

Tôi đã cố gắng để có được bộ điều khiển/xem cực kỳ đơn giản được thiết lập và không thể làm cho nó hoạt động. Trong số web.xml của tôi, tôi đã xác định <servlet> được gọi là servlet-context.xml, đang chạy ok. Trong servlet-context.xml, tôi đã đặt:Spring 3.0.6 MVC @PathVariable và @RequestParam trống/trống trong chế độ xem JSP

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 

<...other stuff in here... /> 

<mvc:annotation-driven /> 

trong số những thứ khác. Sự hiểu biết của tôi là tất cả những gì cần thiết để sử dụng chú thích @.

Trong điều khiển của tôi, tôi có:

@RequestMapping(value="/student/{username}/", method=RequestMethod.GET) 
public String adminStudent(@PathVariable String username, @RequestParam String studentid) { 
    return "student"; 
} 

Và trong student.jsp quan điểm của tôi, tôi có:

<p>This is the page where you would edit the stuff for ${username}.</p> 
<p>The URL parameter <code>studentid</code> is set to ${studentid}.</p> 

Khi tôi thực hiện một yêu cầu đến http://localhost:8080/application/student/xyz123/?studentid=456, tôi nhận được cái nhìn tôi mong đợi, nhưng tất cả các biến đều trống hoặc không có:

<p>This is the page where you would edit the stuff for .</p> 
<p>The URL parameter <code>studentid</code> is set to .</p> 

Tôi nghi ngờ đó là vấn đề với cách của tôi web.xml hoặc servlet-context.xml được thiết lập, nhưng tôi không thể tìm thấy thủ phạm ở bất cứ đâu. Không có gì hiển thị trong bất kỳ nhật ký nào mà tôi có thể thấy.


Cập nhật: Tôi đã căn cứ mã của tôi tắt phần này của spring-mvc-showcase:

@RequestMapping(value="pathVariables/{foo}/{fruit}", method=RequestMethod.GET) 
public String pathVars(@PathVariable String foo, @PathVariable String fruit) { 
    // No need to add @PathVariables "foo" and "fruit" to the model 
    // They will be merged in the model before rendering 
    return "views/html"; 
} 

... mà hoạt động tốt đối với tôi. Tôi không thể hiểu tại sao ví dụ này hoạt động nhưng tôi thì không. Có phải vì họ là doing something different với servlet-context.xml?

<annotation-driven conversion-service="conversionService"> 
    <argument-resolvers> 
     <beans:bean class="org.springframework.samples.mvc.data.custom.CustomArgumentResolver"/> 
    </argument-resolvers> 
</annotation-driven> 

Trả lời

7

Aha! Tìm ra, cuối cùng.

spring-mvc-showcase đang sử dụng Spring 3.1, sẽ tự động hiển thị @PathVariable s cho mô hình, theo SPR-7543.

Như được chỉ ra bởi @duffymo và @JB Nizet, thêm vào Mô hình với model.put() là điều cần làm đối với các phiên bản của Spring sớm hơn 3.1.

Ted Young đã chỉ cho tôi đúng hướng với Spring: Expose @PathVariables To The Model.

+1

Bạn nên chấp nhận câu trả lời của riêng mình vì đó là câu trả lời đúng. –

15

Tạo một bản đồ mẫu và thêm những thông số cặp tên/giá trị cho nó:

@RequestMapping(value="/student/{username}/", method=RequestMethod.GET) 
public String adminStudent(@PathVariable String username, @RequestParam String studentid, Model model) { 
    model.put("username", username); 
    model.put("studentid", studentid); 

    return "student"; 
} 
+0

Cảm ơn rất nhiều f hoặc câu trả lời! Tôi đã thêm một ví dụ từ các nhà phát triển Spring - tôi thực sự đánh giá cao nếu bạn có thể giải thích lý do tại sao họ làm việc. – alexmuller

4

@PathVariable có nghĩa là đối số phương pháp chú thích nên được chiết xuất từ ​​đường dẫn của URL gọi. @RequestParam có nghĩa là đối số phương thức chú thích phải được trích xuất từ ​​tham số yêu cầu. Không có chú thích nào trong số các chú thích này được đặt trong phạm vi yêu cầu, phiên hoặc phạm vi ứng dụng.

${username} có nghĩa là "ghi giá trị của thuộc tính tên người dùng (được tìm thấy trong trang hoặc yêu cầu hoặc phiên hoặc phạm vi ứng dụng) trong phản hồi". Vì bạn không bao gồm bất kỳ thuộc tính tên người dùng nào trong bất kỳ phạm vi nào trong số đó, nó không viết bất cứ điều gì.

Mã sẽ hoạt động nếu phương thức trả về đối tượng ModelAndView và mô hình có thuộc tính username và thuộc tính studentid.

+0

Cảm ơn rất nhiều vì câu trả lời! Tôi đã thêm một ví dụ từ các nhà phát triển Spring - tôi thực sự đánh giá cao nếu bạn có thể giải thích lý do tại sao họ làm việc. – alexmuller

+0

Có thể tôi sai, sau đó và Spring tự động thêm biến đường dẫn vào mô hình. Tài liệu tham khảo nói rằng các biến đường dẫn như vậy chỉ hoạt động nếu cebugging được bật trong khi biên dịch. Xem http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-requestmapping-uri-templates. Hãy thử với @PathVariable ("tên người dùng") và @PathVariable ("studentid") –

1

Giả Url này http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013 (để nhận hóa đơn cho người dùng 1234 cho hôm nay)

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET) 
public List<Invoice> listUsersInvoices(
      @PathVariable("userId") int user, 
      @RequestParam(value = "date", required = false) Date dateOrNull) { 
     model.put("userId", user); 
     model.put("date", dateOrNull); 

}