Interceptor可以使用Annotation或使用Deployment Descriptor來宣告,下面的範例包含了一個Singleton Session Bean、一個要做為Interceptor的類別、一個宣告Interceptor的Deployment Descriptor文件,另外還有一個做為客戶端程式的Servlet,我使用GlassFish 3.1來做為我的伺服器,並使用Deployment Descriptor來宣告Interceptor。
SingletonSessionBean.java
package jk.idv.ssb; import java.util.Date; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.ejb.LocalBean; import javax.ejb.Singleton; @Singleton(name="SingletonSessionBean") @LocalBean public class SingletonSessionBean { private final static String MY_NAME = "SingletonSessionBean"; private String username = "[no man]"; @PostConstruct private void init() { System.out.println(" " + MY_NAME + " - Initialized"); } @PreDestroy private void destroy() { System.out.println("*** " + MY_NAME + " - Destroyed"); } public String retrieveMessage() { Date theCurrentTime = new Date(); return "Name saved in " + MY_NAME + " is " + username + " " + theCurrentTime; } public void saveName(final String inName) { this.username = inName; } }
上列程式碼中,未使用@Interceptors來宣告這個Singleton Session Bean相關的Interceptor。
LogInterceptor.java
package idv.jk.interceptor; package idv.jk.interceptor; import javax.interceptor.InvocationContext; public class LogInterceptor { public Object logMethod(InvocationContext inCtx) throws Exception { System.out.println(" LogInterceptor intercepting: " + inCtx.getTarget().getClass().getSimpleName() + "." + inCtx.getMethod().getName()); return inCtx.proceed(); } }
上列的程式碼中,也沒有使用@Interceptor來宣告此類別為一個Interceptor。
SingletonClientServlet.java
package idv.jk.client; import java.io.IOException; import java.io.PrintWriter; import javax.ejb.EJB; 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 jk.idv.ssb.SingletonSessionBean; /** * Servlet implementation class SingletonClientServlet */ @WebServlet("/SingletonClientServlet") public class SingletonClientServlet extends HttpServlet { private static final long serialVersionUID = 1L; @EJB private SingletonSessionBean singletonSessionBean; /** * @see HttpServlet#HttpServlet() */ public SingletonClientServlet() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String theParam = request.getParameter("name"); PrintWriter pw = response.getWriter(); String msg = singletonSessionBean.retrieveMessage(); pw.println("Get message from singleton session bean: "); pw.println(msg); if(theParam != null) { singletonSessionBean.saveName(theParam); } msg = singletonSessionBean.retrieveMessage(); pw.println("Check message from singleton session bean: "); pw.println(msg); pw.println("Finished invoking singleton session beans!"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }上列的Servlet使用注入的方式來使用Singleton Session Bean的方法,並在瀏覽器中印出一些我需要的資訊。
最後是名為ejb-jar.xml的Deployment Descriptor:
idv.jk.interceptor.LogInterceptor logMethod SingletonSessionBean idv.jk.interceptor.LogInterceptor
將Web應用程式部署到GlassFish後,再打開瀏覽器輸入:http://localhost:8888/BusinessMethodInterceptorsDD/SingletonClientServlet?name=Javakid,應該可以看到下列的結果:
Get message from singleton session bean: Name saved in SingletonSessionBean is [no man] Fri Jan 24 00:05:32 CST 2014 Check message from singleton session bean: Name saved in SingletonSessionBean is Javakid Fri Jan 24 00:05:32 CST 2014 Finished invoking singleton session beans!
在Console中,也會看到一些訊息被印出來:
完整的程式由此下載。
參考資料:
http://www.slideshare.net/krizsan/ocp-jbcd-6-study-notes,p.97