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 :printMessage8.多個攔截器
繼續,在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 :printMessage9.方法層攔截器
有時,您可能不希望所有的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拦截器教程和示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑复制粘贴怎么操作电脑复制粘贴解决方法
- 下一篇: mdm.exe是什么进程 mdm.