ejb 示例 2018_Java EE EJB拦截器教程和示例
ejb 示例 2018
在此示例中,我們將看到如何在EJB中使用攔截器并使用簡(jiǎn)單的Web應(yīng)用程序?qū)ζ溥M(jìn)行測(cè)試。
1.簡(jiǎn)介
顧名思義,當(dāng)您想攔截對(duì)EJB方法的調(diào)用時(shí),將使用攔截器。 如果為Bean聲明一個(gè)攔截器,則每次調(diào)用該Bean的方法時(shí),該攔截器的一個(gè)方法都將攔截該方法。 這意味著執(zhí)行直接進(jìn)入攔截器的方法。 然后,攔截方法可以決定是調(diào)用被攔截的EJB方法還是簡(jiǎn)單地替換它。
您可能會(huì)發(fā)現(xiàn)上述行為類似于面向方面的編程原理,這是正確的。 盡管這兩種技術(shù)的實(shí)現(xiàn)方式完全不同,但事實(shí)是它們可以用于相同的目的。 例如,當(dāng)您想在執(zhí)行Beans方法之前或之后記錄某些內(nèi)容時(shí)。 或者,當(dāng)您要強(qiáng)制執(zhí)行有關(guān)方法調(diào)用的特定策略時(shí),例如,身份驗(yàn)證,輸入檢查等。當(dāng)然,EJB可以具有一系列攔截器,這些攔截器將按特定順序攔截該方法。
在這個(gè)示例中,我們將創(chuàng)建一個(gè)EAR項(xiàng)目和一個(gè)EJB項(xiàng)目,它們將托管我們的EJB和攔截器,以及一個(gè)動(dòng)態(tài)Web應(yīng)用程序,它將托管Servlet以測(cè)試上述行為。 我們將使用Eclipse Java EE IDE 4,3 Kepler和Glassfish 4.0作為我們的容器。
2.創(chuàng)建一個(gè)新的企業(yè)應(yīng)用程序項(xiàng)目
創(chuàng)建一個(gè)名為EJBInterceptorEAR的新企業(yè)應(yīng)用程序項(xiàng)目。在Eclipse IDE中,選擇File-> EJBInterceptorEAR > Enterprise Application Project并填寫(xiě)表單,然后單擊Finish:
3.創(chuàng)建一個(gè)新的EJB Projet
創(chuàng)建一個(gè)名為InterceptorsEJB的新EJB項(xiàng)目。 我們將基于此創(chuàng)建會(huì)話bean。 轉(zhuǎn)到文件->新建-> EJB項(xiàng)目并填寫(xiě)表單。 請(qǐng)小心選擇“添加EAR項(xiàng)目”,然后選擇“ EJBInterceptorEAR ”作為EAR項(xiàng)目名稱:
單擊兩次Next,然后選擇創(chuàng)建EJB Client JAR以及生成ejb-jar.xml部署描述符:
4.創(chuàng)建一個(gè)簡(jiǎn)單的攔截器類
我們將定義一個(gè)只有一種方法的簡(jiǎn)單攔截器。 在InterceptorsEJB項(xiàng)目的ejbModule文件夾下,創(chuàng)建一個(gè)名為com.javacodegeeks.enterprise.ejb.interceptor的新包,并創(chuàng)建以下類:
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;} }請(qǐng)注意,使用@AroundInvoke注釋的public Object intercept 。 這意味著該特定方法將在EJB方法調(diào)用上進(jìn)行攔截。 重要的是要解決這樣一個(gè)事實(shí),即攔截器類可以具有任意數(shù)量的方法,但是@AroundInvoke只能注釋一個(gè)方法。
可以將intercept方法的InvocationContext參數(shù)用于兩個(gè)目的。 您可以提取與被攔截的EJB方法有關(guān)的有用信息(例如,我們使用getMethod().getName() API調(diào)用鏈來(lái)獲取被攔截方法的名稱),也可以使用proceed() API繼續(xù)執(zhí)行方法。 如果鏈中沒(méi)有攔截器,則此方法會(huì)將執(zhí)行流切換到鏈中的下一個(gè)攔截器,或切換到實(shí)際的攔截的EJB方法。 該方法將返回EJB方法調(diào)用的結(jié)果。 但是我們不知道返回的類型,因此proceed()返回一個(gè)Object實(shí)例。 如果您確實(shí)知道EJB方法的返回類型,則可以將proceed()的結(jié)果轉(zhuǎn)換為該特定類型,然后根據(jù)需要使用該實(shí)例。 注意, intercept方法還返回實(shí)際EJB調(diào)用的結(jié)果。 這將被傳遞給攔截器鏈中的下一個(gè)攔截器,或者如果沒(méi)有其他攔截器則傳遞給客戶端。
因此,在調(diào)用實(shí)際的EJB方法之前要執(zhí)行的任何業(yè)務(wù)邏輯都應(yīng)放在調(diào)用proceed()之前。 因此,在調(diào)用proceed()之后,將要執(zhí)行的代碼放入實(shí)際的EJB方法之后。 當(dāng)然,如果需要,您可以一起繞過(guò)EJB方法的常規(guī)執(zhí)行。
4.創(chuàng)建一個(gè)簡(jiǎn)單的EJB
這是將使用上述攔截器攔截其方法的EJB。 在InterceptorsEJB項(xiàng)目的ejbModule文件夾下,創(chuàng)建一個(gè)名為com.javacodegeeks.enterprise.ejb的新包,并創(chuàng)建以下類:
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;}}如您所見(jiàn),我們已使用@Interceptors(SimpleInterceptor.class)批注標(biāo)記了該類。 這意味著該類的所有方法都將被SimpleInterceptor攔截
讓我們創(chuàng)建一個(gè)簡(jiǎn)單的Servlet來(lái)測(cè)試所需的功能。
5.創(chuàng)建一個(gè)新的動(dòng)態(tài)Web項(xiàng)目
轉(zhuǎn)到文件->新建->動(dòng)態(tài)Web項(xiàng)目。 填寫(xiě)表單,確保您選中“將項(xiàng)目添加到EAR”,并把EJBInterceptorEAR作為“ EAR項(xiàng)目名稱”:
單擊“完成”后,轉(zhuǎn)到項(xiàng)目資源管理器,然后右鍵單擊“ Project InterceptorTesting然后轉(zhuǎn)到“屬性”->“部署程序集”->“添加”->“項(xiàng)目”->“ EJBInterceptorEAR :
6.創(chuàng)建新的Servlet
轉(zhuǎn)至 InterceptorTesting Web項(xiàng)目并創(chuàng)建一個(gè)名為 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();}}} }正如你可以看到我們簡(jiǎn)單的解析printMessage查詢參數(shù)和我們的價(jià)值傳遞給printMessage的方法SimpleEJB 。
提示: 如果您在確定EJB PassivationObject的可移植JNDI名稱時(shí)遇到麻煩,請(qǐng)?jiān)诓渴痦?xiàng)目時(shí)查看Glassfish的日志或輸出,您會(huì)發(fā)現(xiàn)這樣的一行: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.測(cè)試
您可以在Glassfish上部署您的應(yīng)用程序并發(fā)出以下請(qǐng)求:
http://localhost:8080/InterceptorTesting/TestSerlvet?printMessage=Hello%20From%20JCG如果您在控制臺(tái)上觀看Glassfish的輸出,則會(huì)看到:
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.多個(gè)攔截器
繼續(xù),在com.javacodegeeks.enterprise.ejb.interceptor包下的InterceptorsEJB項(xiàng)目中創(chuàng)建另一個(gè)新的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;}}現(xiàn)在,如果我們?cè)俅伟l(fā)出相同的請(qǐng)求:
http://localhost:8080/InterceptorTesting/TestSerlvet?printMessage=Hello%20From%20JCG如果您在控制臺(tái)上觀看Glassfish的輸出,則會(huì)看到:
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.方法層攔截器
有時(shí),您可能不希望所有的bean方法都被攔截。 您可以通過(guò)注釋來(lái)選擇要攔截的方法,而不是整個(gè)類。
讓我們看看如何:
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();}}}}現(xiàn)在,如果我們?cè)俅伟l(fā)出相同的請(qǐng)求:
http://localhost:8080/InterceptorTesting/TestSerlvet?printMessage=Hello%20From%20JCG如果您在控制臺(tái)上觀看Glassfish的輸出,則會(huì)看到:
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項(xiàng)目
這是有關(guān)EJB攔截器的示例。 下載本教程的Eclipse項(xiàng)目: EJBInterceptor.zip
翻譯自: https://www.javacodegeeks.com/2013/07/java-ee-ejb-interceptors-tutorial-and-example.html
ejb 示例 2018
總結(jié)
以上是生活随笔為你收集整理的ejb 示例 2018_Java EE EJB拦截器教程和示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电脑复制粘贴怎么操作电脑复制粘贴解决方法
- 下一篇: 网络研讨会:Java 9的第一印象–构建