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
}
Cảm ơn bạn rất nhiều. –
Spring 2.5.x cũng có @InitBinder: http://static.springsource.org/spring/docs/2.5.x/reference/mvc.html#mvc-ann-initbinder – Rihards
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