2015-07-01 40 views
8

Tôi đang học Spring-MVC 4 bắt đầu từ asp.net MVC và tôi đang tìm cách chuyển dữ liệu đến Chế độ xem mà không phải khai báo Mô hình Atrribute trong mọi cuộc gọi.Truy cập mô hình hiện tại trong spring-mvc

Ví dụ, bây giờ tôi có điều này.

public class BaseController { 
    public void AddMessage(Model model, String m) { 
     Model.addAttribute("msg", m); 
    } 
} 

public class PersonController extends BaseController{ 
     @RequestMapping("details/{Id}") 
     public String details(@PathVariable int Id, Model model) { 
      Person p = service.LoadById(Id); 

      if(p == null) { 
       AddMessage(model, "Record not found..."); 
      } else { 
       model.addAttribute("bean", q); 
      } 

      return "person/details"; 
     } 
} 

Nhưng điều tôi thực sự muốn là có cách để bắt chước Mẫu mô hình đó trong phương pháp điều khiển cơ sở của mình mà không phải chuyển nó làm đối số. Tương tự như việc sử dụng ViewData hoặc TempData trong asp.net MVC.

Có thể chuyển dữ liệu đến chế độ xem theo cách này không?

Cảm ơn bạn

+0

bạn muốn làm gì với Mô hình? –

Trả lời

1

Tôi đã giải quyết được vấn đề này bằng trình chặn yêu cầu. Về cơ bản:

On tôi lớp điều khiển cơ bản:

public abstract class BaseController { 

    protected List<UserViewMessage> viewMessages; 

    public List<UserViewMessage> getViewMessages() { 
     if (viewMessages == null) { 
      viewMessages = new ArrayList<UserViewMessage>(); 
     } 

     return viewMessages; 
    } 

    public void addMessage(String message, UserViewMessageType type) { 
     getViewMessages().add(new UserViewMessage(message, type)); 
    } 

    public void clearMessages() { 
     if (viewMessages != null) { 
      viewMessages.clear(); 
     } 
    } 
} 

Sau đó, tôi đã thêm một đánh chặn để sao chép các bộ sưu tập tin nhắn đến Model:

public class RequestInterceptor extends HandlerInterceptorAdapter { 

    private static String MODEL_MESSAGES_KEY = "ModelMessageList_"; 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
      throws Exception { 

     if (handler instanceof org.springframework.web.method.HandlerMethod) { 

      HandlerMethod handlerMethod = (HandlerMethod) handler; 

      if (handlerMethod != null) { 
       Object bean = handlerMethod.getBean(); 

       if (bean != null && bean instanceof BaseController) { 

        BaseController bc = (BaseController) bean; 
        bc.clearMessages(); 
       } 
      } 
     } 

     return super.preHandle(request, response, handler); 
    } 

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

     if (handler instanceof org.springframework.web.method.HandlerMethod) { 

      HandlerMethod handlerMethod = (HandlerMethod) handler; 

      if (handlerMethod != null && modelAndView != null) { 
       Object bean = handlerMethod.getBean(); 

       if (bean != null && bean instanceof BaseController) { 

        BaseController bc = (BaseController) bean; 

        if (bc.getViewMessages() != null) { 
         modelAndView.addObject(MODEL_MESSAGES_KEY, bc.getViewMessages()); 
        } 
       } 
      } 
     } 

     super.postHandle(request, response, handler, modelAndView); 
    } 
} 

Trong đó, trên PreHandle, xóa bất kỳ tin nhắn trong bộ điều khiển cơ sở. Sau khi yêu cầu (PostHandle) và kể từ khi mẫu có sẵn, sao chép bộ sưu tập tin nhắn đến Model, do đó làm cho nó có sẵn trên quan điểm của tôi như vậy:

<div class="row"> 
    <div class="col-lg-12"> 
     <c:forEach var="messageItem" items="${_ModelMessageList_}"> 
      <div class="alert alert-info"><c:out value="${messageItem.message}" /></div> 
     </c:forEach> 
    </div> 
</div> 

Đó không phải là tối ưu, nhưng nó hoạt động.

0

Nếu bạn muốn tránh đi qua các mô hình như một tham số phương pháp, bạn có thể sử dụng ModelAttribute chú thích trong một phương pháp: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ModelAttribute.html

Chỉ cần chú thích phương pháp này và mùa xuân sẽ tự động thêm những gì phương pháp trở về mô hình.

@ModelAttribute 
public Stuff addStuffToModel() { 
     Stuff stuff = new Stuff("dummy data"); 
     return stuff; // stuff is added to the model 
} 
+0

Có cách nào khác không? Như bạn tưởng tượng việc thêm thông báo lỗi vào mô hình (ví dụ) ngụ ý sự cần thiết phải lấy ra một Danh sách từ mô hình và sau đó thêm các công cụ vào nó. Vì vậy, tôi thực sự cần truy cập vào Ví dụ mẫu – tggm

+0

@TiagoMatias là bạn đang suy nghĩ trong AOP hoặc tương tự? –

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