2010-09-14 30 views
40

Đối với các tham số yêu cầu đại diện cho chuỗi, số và giá trị boolean, vùng chứa Spring MVC có thể liên kết chúng với các thuộc tính đã nhập ra khỏi hộp.Spring MVC - Ràng buộc trường ngày

Làm thế nào để bạn có vùng chứa Spring MVC ràng buộc một tham số yêu cầu đại diện cho một ngày?

Nói về điều đó, Spring MVC xác định loại tham số yêu cầu đã cho như thế nào?

Cảm ơn!

Trả lời

62

Spring MVC xác định loại tham số yêu cầu đã cho như thế nào?

Mùa xuân sử dụng số ServletRequestDataBinder để ràng buộc giá trị của nó. Quá trình này có thể được mô tả như sau

/** 
    * Bundled Mock request 
    */ 
MockHttpServletRequest request = new MockHttpServletRequest(); 
request.addParameter("name", "Tom"); 
request.addParameter("age", "25"); 

/** 
    * Spring create a new command object before processing the request 
    * 
    * By calling <COMMAND_CLASS>.class.newInstance(); 
    */ 
Person person = new Person(); 

...

/** 
    * And Then with a ServletRequestDataBinder, it bind the submitted values 
    * 
    * It makes use of Java reflection To bind its values 
    */ 
ServletRequestDataBinder binder = ServletRequestDataBinder(person); 
binder.bind(request); 

Đằng sau hậu trường, DataBinder trường hợp trong nội bộ làm cho việc sử dụng một ví dụ BeanWrapperImpl đó là trách nhiệm thiết lập các giá trị của đối tượng lệnh. Với getPropertyType phương pháp, nó lấy loại tài sản

Nếu bạn thấy yêu cầu nộp trên (tất nhiên, bằng cách sử dụng một mô hình), Spring sẽ gọi

BeanWrapperImpl beanWrapper = new BeanWrapperImpl(person); 

Clazz requiredType = beanWrapper.getPropertyType("name"); 

And Then

beanWrapper.convertIfNecessary("Tom", requiredType, methodParam) 

Vùng chứa Spring MVC ràng buộc một tham số yêu cầu biểu diễn một Date như thế nào?

Nếu bạn có đại diện con người thân thiện dữ liệu mà cần chuyển đổi đặc biệt, bạn phải đăng ký một PropertyEditor Ví dụ, java.util.Date không biết 13/09/2010 là gì, vì vậy bạn có biết mùa xuân

Spring, chuyển đổi ngày con người thân thiện này bằng cách sử dụng các PropertyEditor sau

binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { 
    public void setAsText(String value) { 
     try { 
      setValue(new SimpleDateFormat("dd/MM/yyyy").parse(value)); 
     } catch(ParseException e) { 
      setValue(null); 
     } 
    } 

    public String getAsText() { 
     return new SimpleDateFormat("dd/MM/yyyy").format((Date) getValue()); 
    }   

}); 

Khi gọi phương pháp convertIfNecessary, Spring tìm kiếm bất kỳ registere d PropertyEditor quản lý chuyển đổi giá trị đã gửi. Để đăng ký PropertyEditor của bạn, bạn có thể

mùa xuân 3,0

@InitBinder 
public void binder(WebDataBinder binder) { 
    // as shown above 
} 

kiểu cũ mùa xuân 2.x

@Override 
public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) { 
    // as shown above 
} 
+0

Cảm ơn bạn rất nhiều. –

+1

Spring 2.5.x cũng có @InitBinder: http://static.springsource.org/spring/docs/2.5.x/reference/mvc.html#mvc-ann-initbinder – Rihards

+2

Cảm ơn vì đây có vẻ là câu trả lời toàn diện nhưng đối với những người không phải chuyên gia, nó thực sự sẽ giúp đưa vào một ví dụ thực tế đơn giản. – Marquez

30

Trong bổ sung cho câu trả lời rất đầy đủ Arthur: trong trường hợp của một ngày đơn giản , bạn không phải triển khai toàn bộ PropertyEditor. Bạn chỉ có thể sử dụng số CustomDateEditor mà bạn chỉ cần chuyển định dạng ngày để sử dụng:

//put this in your Controller 
//(if you have a superclass for your controllers 
//and want to use the same date format throughout the app, put it there) 
@InitBinder 
private void dateBinder(WebDataBinder binder) { 
      //The date format to parse or output your dates 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 
      //Create a new CustomDateEditor 
    CustomDateEditor editor = new CustomDateEditor(dateFormat, true); 
      //Register it as custom editor for the Date type 
    binder.registerCustomEditor(Date.class, editor); 
} 
+0

Thêm một số nhận xét vào mã của bạn sẽ giúp OP hiểu được đề xuất câu trả lời của bạn. Kiểm tra [câu hỏi metaSO] này (http://meta.stackexchange.com/questions/7656/how-do-i-write-a-good-answer-to-a-question) và [Jon Skeet: Blog mã hóa] (http://msmvps.com/blogs/jon_skeet/archive/2009/02/17/answering-technical-questions-helpfully.aspx) về cách đưa ra câu trả lời đúng. – Yaroslav

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