2012-11-06 107 views
2

我正在開發Spring MVC3應用程序,並且我有一個要求來啓用/禁用頁面中的鏈接,並在鏈接禁用時提供鏈接上的工具提示(某種幫助)。該鏈接可以在許多情況下被禁用,我想知道應該受到影響的各個層次。Spring MVC 3設計

例如,考慮一個管理員用戶試圖續訂訂閱的測試用例。我應該能夠續約,如果

  1. 我是一個管理員用戶
  2. 我的訂閱在未來30天內
  3. 我不更新自己的訂閱結束。

在我的情況下,我有控制器,調用一個服務,確定用戶是否有資格續約。如果沒有資格續訂,請致電另一個提供幫助文字的服務。然後,視圖(JSP)啓用/禁用鏈接,並顯示基於modelAttribute的幫助文本。

我的問題是..

  1. 如何避免兩次調用服務(這似乎再次調用同樣的方法)。我可以添加屬性到用戶模型來保存幫助文本,但我不確定幫助文本是否應該在模型中

  2. 如何從服務中的屬性文件中取代硬編碼更新幫助文本。我在驗證器中使用messages.properties,但我不確定如何在@service中使用它。

  3. 我應該只是在視圖(JSP)中硬編碼更新幫助,而不是過度設計它?

我有下面的一些代碼片段進一步明確,對查詢..

public class UserController { 
    @RequestMapping(value="/viewUserDetails", method=RequestMethod.GET) 
     public String userDetails() { 
      if(userService.isEligibleToRenew()) { 
       user.setEligibleToRenew(true); 
       model.addAttribute("renewalHelp", userService.getRenewalHelp()) 
      } 
     } 
    } 

@Service 
public class UserService { 
    public boolean isEligibleToRenew (User user) { 
     if (isAdminUser() && 
      isSubscriptionEndingin30days() && 
      !isRenewingOwnSubscription()) { 
     return true; 
    } 
     return false; 
} 

public String renewalHelp(User user) { 
    if (!isAdminUser()) { 
     return "You must be an admin to renew your subscription"; 
    } else if (!isSubscriptionEndingin30days()) { 
     return "Your subscription is not expiring in the next 30 days. You cannot renew now"; 
    } else if (isRenewingOwnSubscription()) { 
     return "You cannot renew your own subscription"; 
    } 
} 
} 
+0

因此,如果有多種原因導致用戶無法更新,您只需要第一個? – david

+0

@david - 我只需要第一個。 – aprajitha

回答

2
  1. 讓你的服務返回一個包含其所需的所有信息的對象,在這種方式你只會調用一次服務(包含所有的邏輯)。

  2. 我過去做過的事情(在上面提到的對象中)是有一個描述消息的枚舉,然後使用Spring或任何MVC框架從資源包中選擇消息本地化的消息。

  3. 也許,如果它使事情簡單化並且此功能顯示不同的消息並不重要。

關於1,我在一個大的電子商務應用程序中使用過,我們不得不用一個文本顯示一個價格。該文本可能有折扣相關的提示(例如現在£1.99從£3.99),所以我創建了一個對象,用enum +值來描述價格。之後的枚舉被本地化爲正確語言環境中的消息。

+0

謝謝@Augusto。我想,我正在努力研究如何閱讀Spring MVC中的資源包。我可以在視圖中使用Spring jstl ,但我無法知道如何在Service或Controller中執行相同的操作。 – aprajitha

+1

看看這篇文章:http://stackoverflow.com/a/2183411/249327 – nickdos

+0

謝謝@nickdos。我能夠在控制器中注入一個消息源''。但是,如果在服務中注入相同的messageSource,我無法訪問該屬性('錯誤:在代碼'user.renewal.requestpending'中找不到用於語言環境'en_US''的消息)。我應該只在服務中使用ResourceBundle,而MessageSource只能在Controller中使用? – aprajitha