论坛首页 Java企业应用论坛

再说Play!framework

浏览 38993 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-11-10   最后修改:2010-11-10
downpour 写道
lookdd1 写道
zdmcjm 写道
# @Before//拦截器 
#  static void checkUser() { 
#      if(connected() == null) { 
#          flash.error("Please log in first"); 
#          Application.index(); 
#      } 
#  } 

那是不是每一个controller都要写一个这方法?假设我需要每一个controller都需检查用户是否登录,和用户的当前角色是否有权限操作controller中的某个方法。
我知道servlet过滤器可以实现,但在play这种基于静态方法的controller模型中,怎么实现?



您可以写一个公共的controller然后其它所有controller继承它


并非有意找茬。我们都知道在Java中,继承关系是最难进行扩展的,因为它是单根继承模式。针对你上面的checkUser需求,都要创建一个基类来完成了,更加不要说其他需求的不断扩充了。

所以我一直说这并非静态语言的优势,如果是动态语言,这个将非常容易用植入的方式去实现。



恩,您说的没错,我也觉得这儿的设计有些别扭。不过在这个验证是否登录这种安全需求中,这种设计基本没有什么问题
我们也可以使用play提供的secure-module,使用它之后就不需要继承了,而是采用了注解的方式。
public class Security extends Secure.Security {

    static boolean authentify(String username, String password) {
        return User.connect(username, password) != null;
    }
    
    static boolean check(String profile) {
        if("admin".equals(profile)) {
            return User.find("byEmail", connected()).<User>first().isAdmin;
        }
        return false;
    }
    
    static void onDisconnected() {
        Application.index();
    }
    
    static void onAuthenticated() {
        Admin.index();
    }
    
}


@Check("admin")
@With(Secure.class)
public class Users extends CRUD {    
}



欢迎找茬,让大家都能真实客观的看到一个新东西
0 请登录后投票
   发表时间:2010-11-10  
downpour 写道
linliangyi2007 写道
楼主不怕jvm的栈溢出啊~~~,如此疯狂的static

CURD是很爽了,MIS也不错,感觉很有凌乱美!!

看似牛叉,也充满风险。


基本上能够说getter和setter方法无用的人,是不在乎static满天飞的,也无需考虑任何设计模式。

其实JavaBean的规范的创立,给了我们一种公共的无入侵的方式实现很多编程模式。这也是Spring等开源框架存在的基础。Play之流直接全部静态化了,那我们也不需要什么容器来管理对象的生命周期了,因为这些概念都将不复存在。

因此,我一贯坚持静态语言就是静态语言,动态语言就是动态语言,把2者混着来就是吃饱了撑的没事干。


1、Play的Static你的理解有误,它并非全部静态化仅出现在需要的地方,即Controller里边和Model的公共方法里。这些地方完全不需要继承复写等特性。如果您有疑问可以去看它的例子。作为一种充血模型的实现,Play其实是非常推荐非Static方法的。

2、对象生命周期真的那么重要?rails为啥没对象生命周期的管理呢,.net为啥没有这个也活得好好地呢,c++为啥没这个照样活得风生水起?spring的容器在面向接口编程和贫血模型的时候非常有用,在新的时代,该消亡的就让它消亡吧。
0 请登录后投票
   发表时间:2010-11-10   最后修改:2010-11-10
浮云而已。。编辑掉。。
0 请登录后投票
   发表时间:2010-11-10  
yuxie 写道
易卡螺丝君 写道
没有mixin 不支持元编程的单根继承 就是在自寻死路


恩,Java正在自寻死路呢 ,您跑到Java板块来看死亡日记吗。。果然口味独特啊。。


看人痛打落水狗是人生一大快事 只可惜java就是别人打的落水狗而已
0 请登录后投票
   发表时间:2010-11-10  
lookdd1 写道
zdmcjm 写道
# @Before//拦截器 
#  static void checkUser() { 
#      if(connected() == null) { 
#          flash.error("Please log in first"); 
#          Application.index(); 
#      } 
#  } 

那是不是每一个controller都要写一个这方法?假设我需要每一个controller都需检查用户是否登录,和用户的当前角色是否有权限操作controller中的某个方法。
我知道servlet过滤器可以实现,但在play这种基于静态方法的controller模型中,怎么实现?



您可以写一个公共的controller然后其它所有controller继承它


也可以用@With这个annotation来注入的
0 请登录后投票
   发表时间:2010-11-10  
还有 谁说rails没生命周期管理的?
0 请登录后投票
   发表时间:2010-11-10  
lookdd1 写道
zdmcjm 写道
# @Before//拦截器 
#  static void checkUser() { 
#      if(connected() == null) { 
#          flash.error("Please log in first"); 
#          Application.index(); 
#      } 
#  } 

那是不是每一个controller都要写一个这方法?假设我需要每一个controller都需检查用户是否登录,和用户的当前角色是否有权限操作controller中的某个方法。
我知道servlet过滤器可以实现,但在play这种基于静态方法的controller模型中,怎么实现?



您可以写一个公共的controller然后其它所有controller继承它


这种承继是有问题的,诸如在子controller中,有些方法需要检查权限,有些方法不需要检查就很别扭了。
0 请登录后投票
   发表时间:2010-11-10  
zdmcjm 写道
lookdd1 写道
zdmcjm 写道
# @Before//拦截器 
#  static void checkUser() { 
#      if(connected() == null) { 
#          flash.error("Please log in first"); 
#          Application.index(); 
#      } 
#  } 

那是不是每一个controller都要写一个这方法?假设我需要每一个controller都需检查用户是否登录,和用户的当前角色是否有权限操作controller中的某个方法。
我知道servlet过滤器可以实现,但在play这种基于静态方法的controller模型中,怎么实现?



您可以写一个公共的controller然后其它所有controller继承它


这种承继是有问题的,诸如在子controller中,有些方法需要检查权限,有些方法不需要检查就很别扭了。


恩。 所以还有个module叫secure  可以用这个搞定。
0 请登录后投票
   发表时间:2010-11-10   最后修改:2010-11-10
lookdd1 写道
zdmcjm 写道
lookdd1 写道
zdmcjm 写道
# @Before//拦截器 
#  static void checkUser() { 
#      if(connected() == null) { 
#          flash.error("Please log in first"); 
#          Application.index(); 
#      } 
#  } 

那是不是每一个controller都要写一个这方法?假设我需要每一个controller都需检查用户是否登录,和用户的当前角色是否有权限操作controller中的某个方法。
我知道servlet过滤器可以实现,但在play这种基于静态方法的controller模型中,怎么实现?



您可以写一个公共的controller然后其它所有controller继承它


这种承继是有问题的,诸如在子controller中,有些方法需要检查权限,有些方法不需要检查就很别扭了。


恩。 所以还有个module叫secure  可以用这个搞定。


用注解的方式,问题更大。权限直接写死,并且注解四处分散,每个方法都得加上注解,比继承更严重,还不如用继承。
但是,静态方法,能继承吗?
就算你自己写个注解做到灵活处理,也得费九牛二虎之力。
1 请登录后投票
   发表时间:2010-11-10   最后修改:2010-11-10
程序中要避免在注解中实现业务特性功能,比如权限检查,注解可以用来作为元数据的描述和管理,由底层框架去使用和解释,业务功能还是用户自己实现比较好。另外,在程序中大量地使用注解可能会使注解漫天飞,导致程序的可读性和可维护性奇差。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics