2012-02-17 48 views
6

Hiện tại tôi đang cố triển khai mẫu Gửi/Chuyển hướng/Nhận với Spring MVC 3.1. Cách chính xác để bảo tồn và phục hồi dữ liệu mô hình + lỗi xác nhận là gì? Tôi biết rằng tôi có thể bảo toàn mô hình và BindingResult với các RedirectAttributes trong phương thức POST của tôi. Nhưng cách phục hồi chính xác chúng trong phương thức GET từ phạm vi flash là gì?Bảo toàn trạng thái mô hình bằng Đăng/Chuyển hướng/Nhận mẫu

Tôi đã làm như sau để POST:

@RequestMapping(value = "/user/create", method = RequestMethod.POST) 
public String doCreate(@ModelAttribute("user") @Valid User user, BindingResult result, RedirectAttributes rA){ 

    if(result.hasErrors()){ 
     rA.addFlashAttribute("result", result); 
     rA.addFlashAttribute("user", user); 

     return "redirect:/user"; 
    } 

    return "redirect:/user/success"; 
} 

Và sau đây để có được những hình thức sáng tạo user:

@RequestMapping(value = "/user", method = RequestMethod.GET) 
public ModelAndView showUserForm(@ModelAttribute("user") User user, ModelAndView model){ 

    model.addObject("user", user); 
    model.setViewName("userForm"); 

    return model; 
} 

này cho phép tôi để bảo vệ dữ liệu người dùng được đưa ra trong trường hợp của một lỗi. Nhưng cách đúng đắn về việc khôi phục lỗi này là gì (BindingResult) Tôi muốn hiển thị chúng theo hình thức với các thẻ hình thức mùa xuân:

<form:errors path="*" /> 

Bên cạnh đó nó sẽ là thú vị như thế nào để truy cập vào phạm vi đèn flash từ phương thức get?

Trả lời

3
public class BindingHandlerInterceptor extends HandlerInterceptorAdapter { 

    public static final String BINDING_RESULT_FLUSH_ATTRIBUTE_KEY = BindingHandlerInterceptor.class.getName() + ".flashBindingResult"; 

    private static final String METHOD_GET = "GET"; 
    private static final String METHOD_POST = "POST"; 


    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 


     if(METHOD_POST.equals(request.getMethod())) { 

      BindingResult bindingResult = getBindingResult(modelAndView); 

      FlashMap outFlash = RequestContextUtils.getOutputFlashMap(request); 

      if(bindingResult == null || ! bindingResult.hasErrors() || outFlash == null) { 
       return; 
      } 

      outFlash.put(BINDING_RESULT_FLUSH_ATTRIBUTE_KEY, bindingResult); 

     } 

     Map<String, ?> inFlash = RequestContextUtils.getInputFlashMap(request); 

     if(METHOD_GET.equals(request.getMethod()) && inFlash != null && inFlash.containsKey(BINDING_RESULT_FLUSH_ATTRIBUTE_KEY)) { 

      BindingResult flashBindingResult = (BindingResult)inFlash.get(BINDING_RESULT_FLUSH_ATTRIBUTE_KEY); 

      if(flashBindingResult != null) { 

       BindingResult bindingResult = getBindingResult(modelAndView); 

       if(bindingResult == null) { 
        return; 
       } 

       bindingResult.addAllErrors(flashBindingResult); 

      } 

     } 

    } 

    public static BindingResult getBindingResult(ModelAndView modelAndView) { 

     if(modelAndView == null) { 
      return null; 
     } 

     for (Entry<String,?> key : modelAndView.getModel().entrySet()) { 
      if(key.getKey().startsWith(BindingResult.MODEL_KEY_PREFIX)) { 
       return (BindingResult)key.getValue(); 
      } 
     } 

     return null; 
    } 


} 
1

Tại sao bạn không hiển thị biểu mẫu cập nhật sau khi ràng buộc không thành công, do đó, người dùng có thể thử gửi lại biểu mẫu?

Cách tiếp cận chuẩn cho việc này có vẻ là trả về dạng xem biểu mẫu cập nhật từ phương thức xử lý POST.

if (bindingResult.hasErrors()) { 
    uiModel.addAttribute("user", user); 
    return "user/create"; 
} 

Sau đó, bạn có thể hiển thị lỗi với biểu mẫu: thẻ lỗi.

+5

Điều này bỏ qua toàn bộ điểm của câu hỏi. Anh ấy đang cố gắng tránh trả lại màn hình trong POST vì cách trình duyệt xử lý các biểu mẫu đã đăng. Nếu người dùng nhấn làm mới hoặc quay lại biểu mẫu được đăng lại, điều này có thể khiến trạng thái được sửa đổi hai lần trên máy chủ. Tốt hơn nhiều để chuyển hướng chúng trở lại hình thức ban đầu bằng cách sử dụng get. – chubbsondubs

0

gì là cách chính xác phục hồi chúng trong phương thức GET từ phạm vi đèn flash

Tôi không chắc tôi hiểu những gì bạn có nghĩa là bằng cách thu hồi chúng. Những gì bạn thêm dưới dạng thuộc tính flash trước khi chuyển hướng sẽ có trong mô hình sau khi chuyển hướng. Không có gì đặc biệt cần phải làm cho điều đó. Tôi thu thập bạn đang cố gắng để yêu cầu một cái gì đó khác nhưng tôi không chắc chắn đó là những gì.

Vì phahn đã chỉ ra lý do bạn chuyển hướng đến lỗi? Cách phổ biến để xử lý điều này là chuyển hướng thành công.

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