2009-09-01 20 views
5

Trong MVC (chẳng hạn như JSP và Spring), có thực tiễn không tốt để xem mã liên quan trong bộ điều khiển không?Thực tiễn không tốt là đặt mã xem trong bộ điều khiển?

Trong trường hợp của tôi, bộ điều khiển thực hiện một số thao tác và sau đó đưa kết quả vào khung nhìn (JSP). Trong trường hợp của một thông báo trạng thái, tôi có thể chuyển toàn bộ nội dung tin nhắn tới khung nhìn, hoặc truyền một khóa và để cho JSP ánh xạ nó tới văn bản tin nhắn.

Ví dụ:

nhắn được tạo ra trong điều khiển

mùa xuân Bộ điều khiển:

protected ModelAndView onSubmit(...) { 
    Map map = new HashMap(); 
    // Controller processing 
    if (...) 
     map.put("status", "Case 1 status message"); 
    else 
     map.put("status", "Case 2 status message"); 
    return new ModelAndView("viewPage", map); 
} 

JSP:

{$status} 

nhắn được tạo ra theo quan điểm

mùa xuân Bộ điều khiển:

protected ModelAndView onSubmit(...) { 
    Map map = new HashMap(); 
    // Controller processing 
    if (...) 
     map.put("status", "case1"); 
    else 
     map.put("status", "case2"); 
    return new ModelAndView("viewPage", map); 
} 

JSP:

<c:choose> 
    <c:when test="{$status eq 'case1'}">Case 1 status message</c:when> 
    <c:when test="{$status eq 'case2'}">Case 2 status message</c:when> 
</c:choose> 

Trong trường hợp đầu tiên, bộ điều khiển và mã JSP là đơn giản, nhưng có logic xem có liên quan trong bộ điều khiển. Trong trường hợp thứ hai, tất cả logic xem đều nằm trong JSP, nhưng mã không đơn giản.

Tôi có vi phạm mô hình MVC bằng cách tạo văn bản tin nhắn trong bộ điều khiển không? Thực hành phổ biến cho kịch bản này là gì?

Trả lời

3

Kết hợp giao diện người dùng và mã bộ điều khiển trong MVC là thực tế phổ biến trong các ứng dụng khách phong phú (ví dụ như trong Swing). ngay cả trong web MVC nó đôi khi được thực hiện, cho các phản ứng rất đơn giản.

Trong trường hợp của bạn, tuy nhiên những gì bạn đang làm không được khuyến nghị. Thông thường bạn đặt các văn bản của ứng dụng của bạn trong một resource bundle bằng cách sử dụng cơ chế MessageSource của mùa xuân và chỉ tham khảo nó bằng cách sử dụng mã. Gói tài nguyên được nộp một thuộc tính đơn giản, trong trường hợp của bạn, nó sẽ giống như thế này:

case1=Case 1 status message 
case2=Case 2 status message 

Trong JSP bạn tham khảo nó sử dụng thẻ theo cách sau đây:

<spring:message message="${status}"/> 

bó Resource có hai ưu điểm:

  • nó rất dễ dàng để quốc tế hóa trang web của bạn và cung cấp cho nó bằng nhiều ngôn ngữ
  • Bạn có thể quản lý các văn bản ứng dụng từ bên ngoài đến nguồn và nếu bạn sử dụng số ReloadableResourceBundleMessageSource của mùa xuân, bạn thậm chí có thể thay đổi các văn bản mà không cần triển khai lại ứng dụng.
6

Thực hành phổ biến là sử dụng gói tài nguyên :-) Bạn có thể định cấu hình chúng dưới dạng message sources trong ngữ cảnh mùa xuân và sử dụng thẻ message để truy xuất chúng.

+0

+1 - Tôi thích cách bạn không nói có hoặc không, nhưng đã đưa ra đề xuất hay là một sự cải tiến, vì nó cũng mang lại sự linh hoạt hơn. –

0

Tôi không nghĩ đó là hành vi xấu.Một chiến lược tốt để quyết định có nên đặt một số logic trong quan điểm hoặc trong bộ điều khiển sẽ là để tưởng tượng một kịch bản mà bạn sẽ có hai công cụ xem khác nhau. Sau đó, bạn có thể kiểm tra xem mã cụ thể đó sẽ không được lặp lại trong hai công cụ xem hay không.

Ví dụ: giả sử bạn có cùng một bộ điều khiển, nhưng trình hiển thị chế độ xem thay thế, giả sử, trình kết xuất tạo bảng tính Excel.

Trong ví dụ của bạn, bạn sẽ phải đặt logic để truy xuất đúng thông điệp không chỉ trong JSP (hiển thị HTML), mà còn trong bảng tính Excel (dưới dạng công thức).

Để tóm tắt, ví dụ bạn đã trình bày logic là xem thuyết bất khả tri do đó bộ điều khiển là vị trí tốt cho nó.

Nó sẽ không áp dụng cho một logic, ví dụ, mà quyết định nếu một văn bản cụ thể nên được kết xuất là in đậm hay không. Đây là logic cụ thể xem. HTML sử dụng sylesheets để hiển thị văn bản in đậm trong khi các công cụ xem khác sử dụng một biểu diễn khác. Trong trường hợp đó, nơi tốt nhất để giữ logic này sẽ là lớp xem (JSP cho chế độ xem HTML và v.v.)

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