2012-11-06 109 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