Aug 3

如何自定义事件 不指定

chirs , 15:41 , 瓜哇天地 » BUFFALO , 评论(0) , 引用(0) , 阅读(3795) , Via 本站原创 | |
  在buffalo推出session的支持后,许多人开始在服务中调用
RequestContext.getContext().getSession()

  等操作来获取服务器状态信息,最常见的就是在很多OA应用中,绝大部分操作都需要用户登录才能使用。这种场景的常见处理办法是先判断用户是否登录,然后再调用某­些方法。例如,一个列出用户所有的文档:
buffalo.remoteCall("userService.isLogin", [], function(reply) {
 if (reply.getResult()) {
       buffalo.remoteCall("bookService.listAllBooks", [], function(reply){ ... })
   } else {
      alert("请先登录")
   }
})

  如果只有一两个这样的案例还好,如果多起来的话,会显得相当麻烦。实际上buffalo已经支持了自定义事件。在spring的拦截器的帮助下,可以实现编程的­简化,以及一致性的错误控制。
  实现方式:
  1.编写一个spring 拦截器,将其配置到需要进行拦截的服务中,其中代码片段如下:

public class RequiredLoginInterceptor implements MehtodInterceptor {
  public Object invoke(MethodInvocation invoke) ...{
      String username = RequestContext.getSession().get("username");
        if (username == null) {
            throw new RequiredLoginException("Please login first!");
        }
        return invoke.proceed();
     }
}

  2.在客户端需要调用的地方,重写onException方法:

var buffalo = new ...
buffalo.events["onException"] = function(fault) {
  if (fault.code == "your.domain.RequiredLoginException") {
      alert("请先登录!");
      //或者其他处理
   }
}


  这样写完之后,所有出现exception的地方都会被这个方法来调用。因此本文开头的案例可以直接写为:

buffalo.remoteCall("bookService.listAllBooks", [], function(reply){ ... })


  当需要集中处理某一类的异常的时候,这是一种相当简单的做法。buffalo已经提供了这个支持。
补spring配置方式:

<bean id="requiredLogin" class="your.domain.RequiredLoginInterceptor"/>
  <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">    
    <property name="beanNames">    
      <list>
        <!-- 在这里可以声明多个需要拦截的bean -->
        <value>...</value>
      </list>    
    </property>    
    <property name="interceptorNames">    
      <list>    
        <value>requiredLogin</value>  <!-- 同样,在这里可以声明多个拦截器,注意次序前后 -->  
      </list>    
  </property>    
</bean>
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]