日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

ejb 示例 2018_Java EE EJB拦截器教程和示例

發布時間:2023/12/3 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ejb 示例 2018_Java EE EJB拦截器教程和示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ejb 示例 2018

在此示例中,我們將看到如何在EJB中使用攔截器并使用簡單的Web應用程序對其進行測試。

1.簡介

顧名思義,當您想攔截對EJB方法的調用時,將使用攔截器。 如果為Bean聲明一個攔截器,則每次調用該Bean的方法時,該攔截器的一個方法都將攔截該方法。 這意味著執行直接進入攔截器的方法。 然后,攔截方法可以決定是調用被攔截的EJB方法還是簡單地替換它。

您可能會發現上述行為類似于面向方面的編程原理,這是正確的。 盡管這兩種技術的實現方式完全不同,但事實是它們可以用于相同的目的。 例如,當您想在執行Beans方法之前或之后記錄某些內容時。 或者,當您要強制執行有關方法調用的特定策略時,例如,身份驗證,輸入檢查等。當然,EJB可以具有一系列攔截器,這些攔截器將按特定順序攔截該方法。

在這個示例中,我們將創建一個EAR項目和一個EJB項目,它們將托管我們的EJB和攔截器,以及一個動態Web應用程序,它將托管Servlet以測試上述行為。 我們將使用Eclipse Java EE IDE 4,3 Kepler和Glassfish 4.0作為我們的容器。

2.創建一個新的企業應用程序項目

創建一個名為EJBInterceptorEAR的新企業應用程序項目。在Eclipse IDE中,選擇File-> EJBInterceptorEAR > Enterprise Application Project并填寫表單,然后單擊Finish:

3.創建一個新的EJB Projet

創建一個名為InterceptorsEJB的新EJB項目。 我們將基于此創建會話bean。 轉到文件->新建-> EJB項目并填寫表單。 請小心選擇“添加EAR項目”,然后選擇“ EJBInterceptorEAR ”作為EAR項目名稱:

單擊兩次Next,然后選擇創建EJB Client JAR以及生成ejb-jar.xml部署描述符:

4.創建一個簡單的攔截器類

我們將定義一個只有一種方法的簡單攔截器。 在InterceptorsEJB項目的ejbModule文件夾下,創建一個名為com.javacodegeeks.enterprise.ejb.interceptor的新包,并創建以下類:

SimpleInterceptor.java:

package com.javacodegeeks.enterprise.ejb.interceptor;import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext;public class SimpleInterceptor {@AroundInvokepublic Object intercept(InvocationContext context) throws Exception {System.out.println("SimpleInterceptor - Logging BEFORE calling method :"+context.getMethod().getName() );Object result = context.proceed();System.out.println("SimpleInterceptor - Logging AFTER calling method :"+context.getMethod().getName() );return result;} }

請注意,使用@AroundInvoke注釋的public Object intercept 。 這意味著該特定方法將在EJB方法調用上進行攔截。 重要的是要解決這樣一個事實,即攔截器類可以具有任意數量的方法,但是@AroundInvoke只能注釋一個方法。

可以將intercept方法的InvocationContext參數用于兩個目的。 您可以提取與被攔截的EJB方法有關的有用信息(例如,我們使用getMethod().getName() API調用鏈來獲取被攔截方法的名稱),也可以使用proceed() API繼續執行方法。 如果鏈中沒有攔截器,則此方法會將執行流切換到鏈中的下一個攔截器,或切換到實際的攔截的EJB方法。 該方法將返回EJB方法調用的結果。 但是我們不知道返回的類型,因此proceed()返回一個Object實例。 如果您確實知道EJB方法的返回類型,則可以將proceed()的結果轉換為該特定類型,然后根據需要使用該實例。 注意, intercept方法還返回實際EJB調用的結果。 這將被傳遞給攔截器鏈中的下一個攔截器,或者如果沒有其他攔截器則傳遞給客戶端。

因此,在調用實際的EJB方法之前要執行的任何業務邏輯都應放在調用proceed()之前。 因此,在調用proceed()之后,將要執行的代碼放入實際的EJB方法之后。 當然,如果需要,您可以一起繞過EJB方法的常規執行。

4.創建一個簡單的EJB

這是將使用上述攔截器攔截其方法的EJB。 在InterceptorsEJB項目的ejbModule文件夾下,創建一個名為com.javacodegeeks.enterprise.ejb的新包,并創建以下類:

package com.javacodegeeks.enterprise.ejb;import javax.ejb.Stateless; import javax.interceptor.Interceptors;import com.javacodegeeks.enterprise.ejb.interceptor.SimpleInterceptor;@Stateless @Interceptors(SimpleInterceptor.class) public class SimpleEJB {public String printMessage(String message) {System.out.println(" Executing method : printMessage" + message);return "Message is "+message;}}

如您所見,我們已使用@Interceptors(SimpleInterceptor.class)批注標記了該類。 這意味著該類的所有方法都將被SimpleInterceptor攔截

讓我們創建一個簡單的Servlet來測試所需的功能。

5.創建一個新的動態Web項目

轉到文件->新建->動態Web項目。 填寫表單,確保您選中“將項目添加到EAR”,并把EJBInterceptorEAR作為“ EAR項目名稱”:

單擊“完成”后,轉到項目資源管理器,然后右鍵單擊“ Project InterceptorTesting然后轉到“屬性”->“部署程序集”->“添加”->“項目”->“ EJBInterceptorEAR :

6.創建新的Servlet

轉至 InterceptorTesting Web項目并創建一個名為 TestSerlvet 的新Servlet :

讓我們看一下該Servlet的代碼:

TestServlet.java:

package com.javacodegeeks.enterprise.servlet;import java.io.IOException;import javax.naming.InitialContext; import javax.naming.NamingException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import com.javacodegeeks.enterprise.ejb.SimpleEJB;@WebServlet("/TestSerlvet") public class TestSerlvet extends HttpServlet {private static final long serialVersionUID = 1L;public TestSerlvet() {super();}protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {System.out.println("Hello from Servlet");InitialContext ic;SimpleEJB bean;String message = request.getParameter("printMessage");if (message != null) {try {ic = new InitialContext();bean = (SimpleEJB) ic.lookup("java:global/EJBInterceptorEAR/InterceptorTesting/SimpleEJB!"+ "com.javacodegeeks.enterprise.ejb.SimpleEJB");bean.printMessage(message);} catch (NamingException e) {e.printStackTrace();}}} }

正如你可以看到我們簡單的解析printMessage查詢參數和我們的價值傳遞給printMessage的方法SimpleEJB 。

提示: 如果您在確定EJB PassivationObject的可移植JNDI名稱時遇到麻煩,請在部署項目時查看Glassfish的日志或輸出,您會發現這樣的一行:2014-01-09T15:14:14.627 + 0200 | INFO :EJB5181:EJB SimpleEJB的便攜式JNDI名稱:java:global / EJBInterceptorEAR / InterceptorTesting / SimpleEJB!
com.javacodegeeks.enterprise.ejb.SimpleEJB,java:global / EJBInterceptorEAR / InterceptorTesting / SimpleEJB)

7.測試

您可以在Glassfish上部署您的應用程序并發出以下請求:

http://localhost:8080/InterceptorTesting/TestSerlvet?printMessage=Hello%20From%20JCG

如果您在控制臺上觀看Glassfish的輸出,則會看到:

2014-01-09T17:43:14.356+0200|INFO: Hello from Servlet 2014-01-09T17:43:14.357+0200|INFO: Logging BEFORE calling method :printMessage 2014-01-09T17:43:14.357+0200|INFO: Executing method : printMessage : Hello From JCG 2014-01-09T17:43:14.357+0200|INFO: Logging AFTER calling method :printMessage

8.多個攔截器

繼續,在com.javacodegeeks.enterprise.ejb.interceptor包下的InterceptorsEJB項目中創建另一個新的Interceptor。

這里是 :

SecondInterceptor.java:

package com.javacodegeeks.enterprise.ejb.interceptor;import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext;public class SecondInterceptor {@AroundInvokepublic Object intercept(InvocationContext context) throws Exception {System.out.println("SecondInterceptor - Logging BEFORE calling method :"+context.getMethod().getName() );Object result = context.proceed();System.out.println("SecondInterceptor -Logging AFTER calling method :"+context.getMethod().getName() );return result;} }

這是SimpleEJB 。

SimpleEJB.java:

package com.javacodegeeks.enterprise.ejb;import javax.ejb.Stateless; import javax.interceptor.Interceptors;import com.javacodegeeks.enterprise.ejb.interceptor.SecondInterceptor; import com.javacodegeeks.enterprise.ejb.interceptor.SimpleInterceptor;@Stateless @Interceptors({SimpleInterceptor.class, SecondInterceptor.class}) public class SimpleEJB {public String printMessage(String message) {System.out.println(" Executing method : printMessage" + message);return "Message is "+message;}}

現在,如果我們再次發出相同的請求:

http://localhost:8080/InterceptorTesting/TestSerlvet?printMessage=Hello%20From%20JCG

如果您在控制臺上觀看Glassfish的輸出,則會看到:

2014-01-09T17:59:55.647+0200|INFO: Hello from Servlet 2014-01-09T17:59:55.659+0200|INFO: SimpleInterceptor - Logging BEFORE calling method :printMessage 2014-01-09T17:59:55.659+0200|INFO: SecondInterceptor - Logging BEFORE calling method :printMessage 2014-01-09T17:59:55.660+0200|INFO: Executing method : printMessageHello From JCG 2014-01-09T17:59:55.660+0200|INFO: SecondInterceptor -Logging AFTER calling method :printMessage 2014-01-09T17:59:55.660+0200|INFO: SimpleInterceptor -Logging AFTER calling method :printMessage

9.方法層攔截器

有時,您可能不希望所有的bean方法都被攔截。 您可以通過注釋來選擇要攔截的方法,而不是整個類。

讓我們看看如何:

SimpleEJB.java:

package com.javacodegeeks.enterprise.ejb;import javax.ejb.Stateless; import javax.interceptor.Interceptors;import com.javacodegeeks.enterprise.ejb.interceptor.SimpleInterceptor;@Stateless public class SimpleEJB {@Interceptors(SimpleInterceptor.class)public String printMessage(String message) {System.out.println(" Executing method : printMessage : " + message);return "Message is " + message;}public String printSomething(String message) {System.out.println(" Executing method : printSomething :" + message);return "Message is " + message;}}

TestServlet.java:

package com.javacodegeeks.enterprise.servlet;import java.io.IOException;import javax.naming.InitialContext; import javax.naming.NamingException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import com.javacodegeeks.enterprise.ejb.SimpleEJB;@WebServlet("/TestSerlvet") public class TestSerlvet extends HttpServlet {private static final long serialVersionUID = 1L;public TestSerlvet() {super();}protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {System.out.println("Hello from Servlet");InitialContext ic;SimpleEJB bean;String message = request.getParameter("printMessage");if (message != null) {try {ic = new InitialContext();bean = (SimpleEJB) ic.lookup("java:global/EJBInterceptorEAR/InterceptorTesting/SimpleEJB!"+ "com.javacodegeeks.enterprise.ejb.SimpleEJB");bean.printMessage(message);bean.printSomething("This method is not intercepted");} catch (NamingException e) {e.printStackTrace();}}}}

現在,如果我們再次發出相同的請求:

http://localhost:8080/InterceptorTesting/TestSerlvet?printMessage=Hello%20From%20JCG

如果您在控制臺上觀看Glassfish的輸出,則會看到:

2014-01-09T19:52:00.909+0200|INFO: Hello from Servlet 2014-01-09T19:52:00.920+0200|INFO: SimpleInterceptor - Logging BEFORE calling method :printMessage 2014-01-09T19:52:00.921+0200|INFO: Executing method : printMessage : Hello From JCG 2014-01-09T19:52:00.921+0200|INFO: SimpleInterceptor -Logging AFTER calling method :printMessage 2014-01-09T19:52:00.921+0200|INFO: Executing method : printSomething :This method is not intercepted

下載Eclipse項目

這是有關EJB攔截器的示例。 下載本教程的Eclipse項目: EJBInterceptor.zip

翻譯自: https://www.javacodegeeks.com/2013/07/java-ee-ejb-interceptors-tutorial-and-example.html

ejb 示例 2018

總結

以上是生活随笔為你收集整理的ejb 示例 2018_Java EE EJB拦截器教程和示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。