【问题标题】:Spring MVC 3 DesignSpring MVC 3 设计
【发布时间】:2012-11-06 21:09:24
【问题描述】:

我正在开发 Spring MVC3 应用程序,如果链接被禁用,我需要启用/禁用页面中的链接并在链接上提供工具提示(某种帮助)。该链接可以在许多情况下被禁用,我想知道应该受到影响的各个层。

例如,考虑一个管理员用户尝试续订订阅的测试案例。我应该可以续订如果

  1. 我是管理员用户
  2. 我的订阅将在未来 30 天内结束
  3. 我不会续订自己的订阅。

在我的例子中,我有控制器,调用一个服务来确定用户是否有资格续订。如果不符合续订条件,请致电其他提供帮助文本的服务。然后视图 (JSP) 启用/禁用链接并根据 modelAttribute 显示帮助文本。

我的问题是..

  1. 如何避免两次调用服务(这似乎再次调用相同的方法)。我可以向 User 模型添加一个属性来保存帮助文本,但我不确定帮助文本是否应该在模型中

  2. 如何从属性文件中提取续订帮助文本,而不是在服务中进行硬编码。我在验证器中使用messages.properties,但我不确定如何在@service 中使用它。

  3. 我是否应该在视图 (JSP) 中对更新帮助进行硬编码,而不是过度设计它?

我在下面有一些代码 sn-ps 来进一步澄清,关于查询..

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";
    }
}
}

【问题讨论】:

  • 那么如果用户无法续订的原因有多种,你只想要第一个?
  • @david - 我只需要第一个。

标签: spring-mvc


【解决方案1】:
  1. 让您的服务返回一个包含所有所需信息的对象,这样您只需调用一次服务(及其所有逻辑)。

  2. 我过去做过的事情(在我上面提到的对象中)是有一个描述消息的枚举,然后使用 Spring 或任何 MVC 框架从资源包中选择消息带有本地化消息。

  3. 也许,如果它让事情变得简单并且显示不同消息的这个功能并不那么重要。

大约 1,我在一个大型电子商务应用程序中使用它,我们必须在其中显示带有文本的价格。文本可能包含与折扣相关的提示(例如现在 1.99 英镑从 3.99 英镑起),所以我创建了一个对象来描述具有枚举 + 值的价格。枚举后来被本地化为正确语言环境中的消息。

【讨论】:

  • 感谢@Augusto。我想,我正在努力找出如何在 Spring MVC 中读取资源包。我可以在视图中使用 Spring jstl ,但我不知道如何在服务或控制器中执行相同操作。
  • 谢谢@nickdos。我可以在控制器中注入消息源<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="messages" />。但是,如果在服务中注入相同的 messageSource,我将无法访问该属性 (Error: No message found under code 'user.renewal.requestpending' for locale 'en_US')。我是否应该只在服务中使用 ResourceBundle,而 MessageSource 是否只能在控制器中使用?
  • 您如何注入 messageSource - 直接通过 XML 或通过注释?在您的控制器而不是您的服务中工作表明您的服务没有被 Spring 实例化,否则您没有正确地将 messageSource 注入到服务中。
  • @nickdos,我通过注释 (@Autowired) 注入了我之前评论中列出的 bean 定义。我的上下文扫描仅限于控制器包,因此它在服务中失败。我现在可以在 Service 中注入 messageSource。感谢您的回复。
猜你喜欢
  • 2011-01-11
  • 2011-07-13
  • 2013-10-26
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多