日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Eclipse+JBoss+EJB3攔截器方法和攔截器類

一、攔截器方法

金壇網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)建站從2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。

EJB3可以通過攔截器對Bean方法進(jìn)行攔截和覆蓋。這有些象AOP中的around。通過AOP的around方法,可以修改被攔截方法的返回值、參數(shù)值,甚至可以取消被攔截方法的執(zhí)行。EJB3的攔截器可以用在無狀態(tài)Session Bean、有狀態(tài)Session Bean和消息驅(qū)動(dòng)Bean(MDB)的方法中。實(shí)現(xiàn)攔截器的最簡單的方法是使用攔截器方法。也就是說,只要在當(dāng)前的Bean中使用@AroundInvoke對某個(gè)方法進(jìn)行注釋(關(guān)于攔截器的類都在javax.interceptor包中),那么這個(gè)方法就會變成攔截器方法,該攔截器方法會攔截當(dāng)前Bean中的所有方法。實(shí)現(xiàn)過程如下:

 
 
 
  1. @Stateful
  2. public class GreeterBean implements Greeter
  3. {
  4.     @AroundInvoke
  5.     public Object myInterceptorMethod1(InvocationContext ic) throws Exception
  6.     {
  7.         System.out.println("myInterceptorMethod1:" + ic.getMethod().getName());
  8.         obj = ic.proceed();    
  9.     }
  10.     @AroundInvoke
  11.     public Object myInterceptorMethod2(InvocationContext ic) throws Exception
  12.     {
  13.         System.out.println("myInterceptorMethod2:" + ic.getMethod().getName());
  14.         obj = ic.proceed();    
  15.     }
  16.     @Override
  17.     public String greet(String name)
  18.     {
  19.         return "hello " + name;
  20.     }
  21. }

上面的Stateful Session Bean中定義了兩個(gè)攔截器方法和一個(gè)Bean方法。當(dāng)客戶端調(diào)用greet方法時(shí),EJB容器會先調(diào)用myInterceptorMethod1方法,然后會調(diào)用myInterceptorMethod2方法,最后會調(diào)用greet方法。使用攔截器方法時(shí)要注意如下幾點(diǎn):

1.  攔截器方法必須有一個(gè)返回值,返回值類型是Object。

2.  攔截器方法只能有一個(gè)參數(shù),而且該參數(shù)類型必須是javax.interceptor.InvocationContext。

3.  只有調(diào)用InvocationContext接口的proceed方法,EJB容器才會調(diào)用下一個(gè)攔截器方法或被攔截的Bean方法。

4.  由于proceed方法要求拋出一個(gè)Exception異常,因此,攔截器方法必須拋出一個(gè)Exception異常,或在攔截器方法中使用try...catch來捕捉proceed方法拋出的異常。

二、攔截器類

有一些攔截器方法會攔截器不同Bean中的方法,在這種情況下,需要將攔截器方法放在一個(gè)單獨(dú)的類中。這個(gè)類就叫攔截器類。下面是一個(gè)攔截器類的代碼:

 
 
 
  1. package service;
  2. import javax.interceptor.AroundInvoke;
  3. import javax.interceptor.InvocationContext;
  4. public class MyInterceptor
  5. {
  6.     @AroundInvoke
  7.     public Object interceptorMethod(InvocationContext ic) throws Exception
  8.     {
  9.         System.out.println("MyInterceptor:" + ic.getMethod().getName());
  10.         return ic.proceed();
  11.     }
  12. }

為了使用該攔截器類,需要在SessionBean或MDB中使用@Interceptors來指定要使用的攔截器類。代碼如下:

 
 
 
  1. @Stateful
  2. @Interceptors(MyInterceptor.class)
  3. public class GreeterBean implements Greeter
  4. {
  5.     @AroundInvoke
  6.     public Object myInterceptorMethod1(InvocationContext ic) throws Exception
  7.     {
  8.         System.out.println("myInterceptorMethod1:" + ic.getMethod().getName());
  9.         obj = ic.proceed();    
  10.     }
  11.     @AroundInvoke
  12.     public Object myInterceptorMethod2(InvocationContext ic) throws Exception
  13.     {
  14.         System.out.println("myInterceptorMethod2:" + ic.getMethod().getName());
  15.         obj = ic.proceed();    
  16.     }
  17.     @Override
  18.     public String greet(String name)
  19.     {
  20.         return "hello " + name;
  21.     }
  22. }

如果有多個(gè)攔截器類,可以使用如下的代碼來指定這些攔截器類:

 
 
 
  1. @Interceptors({MyInterceptor.class, MyInterceptor1.class})

如果指定了多個(gè)攔截器類和攔截器方法,就涉及到一個(gè)調(diào)用順序的問題。EJB容器會先調(diào)用攔截器類中的攔截器方法、如果有多個(gè)攔截器類被指定,按指定的順序進(jìn)行調(diào)用。也就是說,MyInterceptor類中的攔截器方法會最先被調(diào)用,然后是MyInterceptor1類中的攔截器方法。最后會調(diào)用在Bean中定義的攔截器方法(myInterceptorMethod1和myInterceptorMethod2)。

在默認(rèn)情況下,攔截器類將攔截所有的Bean方法,但可以使用@ExcludeClassInterceptors注釋來阻止攔截器對某個(gè)Bean方法進(jìn)行攔截。如在GreeterBean類中還有一個(gè)getValue方法,那么阻止該方法被攔截的代碼如下:

 
 
 
  1. @ExcludeClassInterceptors
  2. public String getValue()
  3. {
  4.     return "abcd";
  5. }

使用@ExcludeClassInterceptors只能阻止攔截器類中的攔截器方法對Bean方法的攔截,而在Bean中定義的攔截器方法仍然會攔截Bean方法。


本文名稱:Eclipse+JBoss+EJB3攔截器方法和攔截器類
本文地址:http://www.5511xx.com/article/cdcpooi.html