首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无状态状态切换

无状态状态切换
EN

Stack Overflow用户
提问于 2009-09-11 05:46:36
回答 2查看 3.4K关注 0票数 1

尽管我已经将此标记为java/spring问题,但对于任何带有无状态控制器的mvc框架,都可以很容易地问到它。例如,我知道rails使用简单的无状态控制器,所以也许你们知道如何最好地解决这个问题。我可以最好地描述java/spring的问题,它是实现--请原谅java术语。

The issue

在spring中,我们很难找到一种令人满意的实现无状态状态切换的方法。从本质上讲,给出了如下的结构:

模型:Unit,状态:撤回、可用、不可用,操作:getOutline()getHelp()

控制器:UnitController和操作:displayOutline()displayHelp()

在执行displayOutline()操作之前,我们需要一种检查单元状态的方法(因为单元本身可能被撤回,因此用户应该被转发到撤回的页面)。

我们尝试了很多方法,包括:

死的简单方式(任何语言)

控制器中需要“可用”状态单元的所有方法都在其实现的第一行调用方法isAvailable()。很明显这里有很多复制,很臭。

AOP way (Java专用)

可以创建一个@Around通知,名为UnitAccess,它执行检查并重新路由控制流(即,不调用does ()调用底层方法,它调用控制器上的另一个方法)。这似乎是一个黑客,而不是真正的AOP,如果它确实删除了复制,但增加了复杂性和降低透明度。

是一个拦截器(由servlet架构提供,但可能可以在其他框架中实现)

它检查单元状态并本质上更改实际的URL调用。再一次,这似乎不对。我们不喜欢在进入控制器之前调用模型逻辑的想法。

我们考虑过

命令模式

创建命令模式结构,该结构(通过继承)可以返回退出的视图或有效的displayOutline视图。因为execute方法将在super()调用中执行检查,并在具体命令中执行特定的逻辑。创建对象结构,如

代码语言:javascript
复制
DisplayOutlineCommand extends UnitCommand

    public void execute(){
        super();
        // must be ok, perform getOutline()
    }

,最后,使用自定义异常

在返回单元之前,在服务级别对象上调用getAvailableUnit(),这将对可用性等进行检查。如果单元被撤回,那么它将抛出一个UnitWithdrawnException,这个UnitWithdrawnException可以被servlet捕获并通过返回一个适当的视图来处理。仍然没有被说服。对于将异常用于正常流控制的想法,我们也不感兴趣。

我们漏掉了什么吗?在spring/另一个无状态控制器框架下,是否有一种简单的方法可以做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2009-12-06 18:44:35

也许我错过了重点,但是如果单元被撤回,为什么用户要来找控制器呢?

我认为最好是确保通常页面不链接到控制器,如果单元不是'OK',那么控制器就需要'OK‘。如果Unit的状态在呈现引用页和实际调用到控制器(不再是'OK')之间发生了变化,那么使用异常来处理该事件对我来说是非常好的(就像在出现乐观锁定错误时有异常一样)。

票数 1
EN

Stack Overflow用户

发布于 2009-09-11 06:02:55

也许您还没有描述整个问题,但是为什么不将检查放在displayOutline()本身中呢?可能是路由到displayOutlineOrHelp()方法,它本质上类似于

代码语言:javascript
复制
ModelAndView displayOutlineOrHelp(...)  {
    Unit unit = ... //code to get the unit the request refers to

    return unit.isAvailable() ? displayOutline(...) : displayHelp(...);   
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1409185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档