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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux怎么使用串口线,如何在Linux下使用USB转串口线,鼎力告诉您

亲爱的朋友,如果您使用的Linux的系统,应该怎么来使用我们的鼎力的USB转串口线呢?下面就来告诉您吧!用Linux,不需要另外安装USB转串口驱动!前提是你要先安装minicom输入命令:dmesg| grep usb,看到…

comsol分析时总位移代表什么_超弹性材料模型的压缩分析

为了表征超弹性材料,需要进行各种测试获取实验数据,包括承受单轴拉伸和压缩、双轴拉伸和压缩以及扭转测试。今天,我们向大家介绍如何使用通过单轴和双轴测试获得的拉伸和压缩测试数据,模拟由弹性泡沫材料制成的球体的压缩。通过案…

由对称性知定点一定在x轴上_线上优秀教学案例(九)|计算机科学与工程学院刘钊:“延期不延教”之“1+X课堂”...

【编者按】受新冠肺炎疫情影响,按照教育部和河北省教育厅统一部署,学校延迟春季开学时间。为最大程度减少疫情和延期开学对我校教育教学工作的影响,本学期,我校以线上教学的形式拉开序幕。面对新的教学模式,各学院、广…

和显卡驱动要配套吗_天天学渲染,你的显卡驱动用对了吗?

大家好,最近一直有很多人和我反馈说,自己在使用Octane或者Redshift渲染器渲染的时候经常容易崩溃,甚至是闪退了,其实这个问题有很大一部分原因是由于你的显卡驱动没用对导致的。接下来就和大家说下如何解决。首先我们大部分人买了…

网络研讨会:Java 9的第一印象–构建可伸缩企业应用程序的新方法

在此网络研讨会上听我们对新Java版本的一些初步想法 Java 9的新版本引起了很多炒作。在Mark Reinhold领导的专门团队的带领下,将Java平台迁移到模块花费了近十年的辛苦工作。 除了备受期待的Project Jigsaw,此版本还包含许多其他令人兴奋的功能。 现在是…

noj数据结构稀疏矩阵的加法十字链表_一个算法毁了一款好游戏?算法和数据结构到底有多重要?...

来源 | 异步前段时间大火的国产游戏——《太吾绘卷》,由于创新的玩法和精良的制作一度广受好评,然而随着玩家游戏的深入和时长的积累,发现该游戏在玩的过程中游戏外的问题很多很多。首先是存档速度慢,然后是密集的计算导致功耗大量…

arm-linux-gcc libstdc .so.6,mini2440编译内核:usr/lib/libstdc++.so.6 not found

买了块mini2440开发板,按照光盘中的mini2440用户手册编译内核时,#make zImage出现错误:usr/lib/libstdc.so.6 not found,在网上百度了下,有很多不同的解决办法,我试了一个,编译成功 ^ ^注&#…

前端实现可绘制的canvas画布_前端图形学基础(五)——Canvas状态管理

点击右上角的关注,不定期前端干货分享!!欢迎来到我的前端图形学系列文章:前端图形学基础(一)——Canvas基础入门前端图形学基础(二)——Canvas基础前端图形学基础(三)——Canvas绘制图片前端图形学基础(四)——Canvas绘制曲线我们…

having和where可以同时使用吗_阴、阳离子聚丙烯酰胺可以同时混合溶解使用吗?...

聚丙烯酰胺是一种水处理药剂,需要溶解在水中制成浓度为0.1%-0.5%的聚丙烯酰胺水溶液。一般来说,当聚丙烯酰胺实际使用时,阴离子聚丙烯酰胺和阳离子聚丙烯酰胺可以同时使用。但是,阳离子聚丙烯酰胺和阴离子聚丙烯酰胺不能混合在一起…

Lombok,AutoValue和Immutables,或如何编写更少,更好的代码返回

在上一篇有关Lombok库的文章中 ,我描述了一个库,该库有助于处理Java中的样板代码( 是的,我知道这些问题已经在Kotlin中解决了 ,但这是现实生活,我们不能一味地坐下来,一旦出现较新或更简单的语言…

福州PHP讲师招聘_“艺”起就业|招聘信息汇总

亲爱的美术学院毕业生们在全国上下万众一心抗击新冠肺炎疫情的关键时期学院党委高度重视并时刻关注着每一位毕业生的就业工作为进一步做好疫情防控工作也为进一步确保同学们顺利求职就业保障毕业生就业工作的时效性学院公众号特别设立“艺”起就业—招聘信息发布栏目 由院学工…

哪个app最费电_关于石墨烯养生地暖,业主最关心的几大问题,答案附上!

很多人对石墨烯地暖有些许误解,不敢轻易接受。其实不然,石墨烯地暖是一种供热效果好、安全性高、运用寿命长、节能环保的新型健康采暖方式,不仅适用于住宅小区、别墅等家庭采暖,也可用于办公楼、医院等各类公共建筑采暖。在众多对…

cpu 抖动_微抖动,繁忙的等待和绑定CPU

cpu 抖动性能分析新机器 当我在新机器上工作时,我想了解它的局限性。 在这篇文章中,我将研究机器的抖动以及忙于等待本周末构建的新PC的影响。 该机器的规格很有趣,但不是发布目的。 永远不要少于它们: i7-3970X六核运行于4.5 GH…

两端分散对齐怎么设置_Word文字很难对齐?用这4个方法,2秒可对齐所有文字!...

日常工作中,我们在给Word文档进行对齐操作的时候,很多人都是猛敲空格键来对齐文字,通常是一顿操作猛如虎,仔细一看原地杵。简单的文字对齐,这种方法可能还算凑效,但稍显复杂的就不那么管用了。今天叨叨君就…

怎样学c++程序语言,如何学好 C++——学习门槛最高的编程语言

根据InfoQ 编程语言 2 月排行榜,统计发现,学习门槛最高的编程语言是 C。那么如何学好这门又难、门槛又高的语言呢?前面我们介绍过C。C是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼斯特劳斯特卢普博士在2…

首个JDK 10(18.3)发行候选版(内部版本43)展示了新的版本控制方案

Mark Reinhold的帖子“ JDK 10:First Release Candidate ”宣布“内部版本43中没有未解决的P1错误”,并将Build 43命名为最初的JDK 10版本候选 。 Reinhold帖子还指向“ JDK 10 Early Access Builds ”页面,该页面包含发行说明的链接。 到基于…

7 centos 查看程序文件数量_CentOS之使用Systemd添加自定义系统服务

文章引言Systemd 就是为了解决Linux 的启动一直采用init进程问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是…

做完c语言通讯录系统后的小结,c语言通讯录管理系统的总结

c语言通讯录管理系统的总结c语言通讯录管理系统的总结c语言课设管理系统总结完成情况防暴力输入密码加密输入并删除管理员和用户端两个端管理员对用户的账号删除注册用户用户的账户名及密码修改用户基本操作管理员基本操作存在的问题管理员无法对用户的数据进行修改未使用链表由…

因特尔显卡自定义分辨率_电脑显示器分辨率超频教程:1080P超2K分辨率的方法...

我们玩过CPU超频、显卡超频、内存超频等,相信不少用户还没有尝试过显示器超频,其实在前段时间,装机之家为广大爱好者发布了一篇【电脑显示器刷新率怎么超频?电脑显示器提高屏幕刷新率超频教程】文章,我们将一款普通60H…

Java 9示例–收集的工厂方法–创建不可修改的列表,集合和映射

大家好,这是我在该博客上发表的有关Java 9功能的第一篇文章,今天您将了解我最喜欢的功能“收集的工厂方法” ,它是JEP 269的一部分。JEP代表JDK增强建议。 如果您曾经在Groovy或Kotlin工作过,那么您就会知道使用集合文字使用元素创…