对移动和桌面站点重用Grails Webflow

对移动和桌面站点重用Grails Webflow,grails,Grails,我有一个grails webflow,可以很好地用于我的桌面浏览器应用程序。现在,我想为我的移动站点重用webflow。我不希望有两个单独的webflow,而只是更改用于每个状态的页面。我尝试了以下方法: viewState{ String view = 'viewState' boolean isMobile = this.isMobileUser() if(isMobile){ view = "/flowDir/mobile/viewState"

我有一个grails webflow,可以很好地用于我的桌面浏览器应用程序。现在,我想为我的移动站点重用webflow。我不希望有两个单独的webflow,而只是更改用于每个状态的页面。我尝试了以下方法:

viewState{
    String view = 'viewState'
    boolean isMobile = this.isMobileUser()
    if(isMobile){
        view = "/flowDir/mobile/viewState"
    }       
    render(view:view)       
}
然而,这是行不通的。如果首先访问移动站点,则桌面将获得移动页面,反之亦然


有人遇到过这个问题吗?我真的很讨厌有两个webflow做同样的事情。我也不想侵入Sitemesh。如果您对如何重用此流程有任何想法或建议,我们将不胜感激

尝试将移动视图分辨率放入after过滤器,以便您的web流执行相同的分辨率,但您可以截取正在渲染的视图并重命名它


我同意Drogo的观点,即响应性设计是最佳解决方案

但是,作为替代方案,您可以让所有webflow用户访问同一视图,但在该视图中,您可以使用自己的标记库覆盖g:layout标记库,该标记库能够确定您是否以移动用户身份运行,因此可以应用适当的布局

在这种情况下,它可能有点笨手笨脚,但它将为您提供一个解决方案,可以在整个应用程序中重用,而不仅仅是在webflow中,并且它将特定于移动设备的代码保留在一个位置

因此,在您的webflow中:

viewState{
    String view = 'viewState'
    [snip] The rest of your code goes here     
    render(view:view)       
}
那么你的看法是:

<myapp:applyLayout name="someWebflowLayout">
    [snip] Your non-layout GSP code goes here    
</myapp:applyLayout>

[snip]您的非布局GSP代码在这里
然后,您的标记库:

class MyAppTagLib {
    static namespace = "myapp"

    def applyLayout = { attrs, body ->

        boolean mobileUser = false
        [snip] some logic to determine if this is a mobile user or not goes here

        if (mobileUser) {
            attrs.name = "mobileLayout/${attrs.name}"
        } else {
            attrs.name = "desktopLayout/${attrs.name}"
        }

        out << g.applyLayout(attrs, body)
    }
}
类MyAppTagLib{
静态名称空间=“myapp”
def applyLayout={attrs,body->
布尔mobileUser=false
[snip]这里提供了一些判断这是否是移动用户的逻辑
如果(移动用户){
attrs.name=“mobileLayout/${attrs.name}”
}否则{
attrs.name=“desktopLayout/${attrs.name}”
}

我们的一个选择是使用响应页面,该页面根据客户端设备和分辨率的不同而呈现不同。例如,看看Twitter Boostrap和响应功能。这可以通过css来实现。我喜欢这个解决方案,但afterInterceptor似乎没有启动。我想知道Webflows的处理方式是否不同。