锁定老帖子 主题:再说Play!framework
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间: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 { } 欢迎找茬,让大家都能真实客观的看到一个新东西 。 |
|
返回顶楼 | |
发表时间: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的容器在面向接口编程和贫血模型的时候非常有用,在新的时代,该消亡的就让它消亡吧。 |
|
返回顶楼 | |
发表时间:2010-11-10
最后修改:2010-11-10
浮云而已。。编辑掉。。
|
|
返回顶楼 | |
发表时间:2010-11-10
yuxie 写道 易卡螺丝君 写道 没有mixin 不支持元编程的单根继承 就是在自寻死路
恩,Java正在自寻死路呢 ,您跑到Java板块来看死亡日记吗。。果然口味独特啊。。 看人痛打落水狗是人生一大快事 只可惜java就是别人打的落水狗而已 |
|
返回顶楼 | |
发表时间: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来注入的 |
|
返回顶楼 | |
发表时间:2010-11-10
还有 谁说rails没生命周期管理的?
|
|
返回顶楼 | |
发表时间: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中,有些方法需要检查权限,有些方法不需要检查就很别扭了。 |
|
返回顶楼 | |
发表时间: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 可以用这个搞定。 |
|
返回顶楼 | |
发表时间: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 可以用这个搞定。 用注解的方式,问题更大。权限直接写死,并且注解四处分散,每个方法都得加上注解,比继承更严重,还不如用继承。 但是,静态方法,能继承吗? 就算你自己写个注解做到灵活处理,也得费九牛二虎之力。 |
|
返回顶楼 | |
发表时间:2010-11-10
最后修改:2010-11-10
程序中要避免在注解中实现业务特性功能,比如权限检查,注解可以用来作为元数据的描述和管理,由底层框架去使用和解释,业务功能还是用户自己实现比较好。另外,在程序中大量地使用注解可能会使注解漫天飞,导致程序的可读性和可维护性奇差。
|
|
返回顶楼 | |