1EJB3.0入门经典赵端阳信息工程分院关于开题报告答辩请各位同学,根据答辩时老师的建议,认真修改三大件;将修改结束以压缩包的形式发给指导教师。3重点章节第2章会话Bean(SessionBean)第3章实体Bean(EntityBean)第6章Web服务(WebService)4题型1.读程序,写结果;2.编程;3.写操作步骤。52.1.2开发只实现Local接口的无状态SessionBean开发只有Local接口的无状态会话SessionBean,使用@Local注释声明接口是本地接口。开发只有Remote接口的无状态会话SessionBean,使用@Remote注释声明接口是远程接口。当@Local和@Remote注释都不存在时,容器会将Beanclass实现的接口默认为Local接口。如果EJB与客户端部署在同一个应用服务器,采用Local接口访问EJB优于Remote接口。6业务接口:LocalHelloWorld.java工程:LocalSessionBean72.4StatefulSessionBean开发在一些应用场合中,有时我们需要每个用户都有自己的一个实例,这个实例不受其他用户影响。购物车对象,每个用户都应有自己的购物车,不希望有人往你的购物车里添加或拿掉商品,而有状态Bean正好满足你的这种需求。每个有状态Bean在bean实例的生命周期内都只服务于一个用户,beanclass的成员变量可以在不同的方法调用间维护特定于某个用户的数据。82.4StatefulSessionBean开发9Bean类:CartBean.java10有状态Bean的JSP客户端代码:StatefulBeanTest.jsp1.先试图从session中获取购物车的存根。2.如果当前session不存在购物车,就创建一个新的购物车放入session中。3.后面每执行一次页面都会添加一个相同的商品。112.9SessionBean的生命周期事件@PostConstruct:当bean对象完成实例化后会被立即调用,每个beanclass只能定义一个@PostConstruct方法。这个注释同时适用于有状态和无状态会话bean。@PreDestroy:标注了这个注释的方法会在容器销毁一个无用的或者过期的bean实例之前调用。这个注释同时适用于有状态和无状态会话bean。@PrePassivate:当一个有状态的bean实例空闲时间过长,就会发生钝化(passivate)。标注了这个注释的方法会在钝化之前被调用。bean实例被钝化后,在一段时间内,如果仍然没有用户对bean实例进行操作,容器将会从硬盘中删除它。以后,任何针对该bean方法的调用,容器都会抛出例外。这个注释适用于有状态会话bean。122.9SessionBean的生命周期事件@PostActivate:当客户端再次使用已经被钝化的有状态bean时,EJB容器会重新实例化一个Bean实例,并从硬盘中将之前的状态恢复。标注了这个注释的方法会在激活完成时被调用。这个注释只适用于有状态会话bean。@Init:这个注释指定了有状态bean初始化的方法。它区别于@PostConstruct注释在于:多个@Init注释方法可以同时存在于有状态sessionbean中,但每个bean实例只会有一个@Init注释的方法会被调用。@PostConstruct在@Init之后被调用。@Remove:当客户端调用标注了@Remove注释的方法时,容器将在方法执行结束后把bean实例删除。132.9SessionBean的生命周期事件142.9SessionBean的生命周期事件15162.10拦截器(Interceptor)拦截器可以拦截Sessionbean和message-drivenbean的方法调用或生命周期事件。拦截器用于封装应用的公用行为,使这些行为与业务逻辑分离,一旦这些公用行为发生改变,而不必修改很多业务类。拦截器可以是同一bean类中的方法或是一个外部类。172.10拦截器(Interceptor)@Interceptors注释指定一个或多个在外部类中定义的拦截器,多个拦截器类之间用逗号分隔,如:@Interceptors({A.class,B.class,C.class}),如果只有一个拦截器可以省略大括号。182.10拦截器(Interceptor)1.@AroundInvoke注释指定了要用作拦截器的方法,拦截器方法与被拦截的业务方法执行在同一个java调用堆栈、同一个事务和安全上下文中。2.用@AroundInvoke注释指定的方法必须遵守以下格式:publicObjectXXX(javax.interceptor.InvocationContextctx)throwsException1.XXX代表方法名可以任意2.javax.interceptor.InvocationContext封装客户端所调用业务方法的一些信息192.10拦截器(Interceptor)202.10拦截器(Interceptor)212.11依赖注入(dependencyinjection)在实际应用中,EJB可能会使用到其它EJB或资源。在传统的开发中,我们要使用某个类对象,可以通过newobject的方式来使用它。但在EJB中,不能这样做,因为EJB实例的创建及销毁是由容器管理的。要在bean中要用其它EJB,必须通过JNDI查找或注入注释。如在InjectionBean中使用HelloBeanEJB,需要在InjectionBean中通过JNDI查找HelloBean的引用222.11依赖注入(dependencyinjection)通过注入注释232.11依赖注入(dependencyinjection)通过ejb-jar.xml添加注册项,该文件需放在jar的META-INF24Bean类:InjectionBean.java252.11.1资源类型的注入如何注入数据源?“DefaultMySqlDS”是数据源的局部JNDI名称,只供Jboss容器内的应用访问。查找该局部JNDI名称时,需要带有前缀“java:/”。262.11.1资源类型的注入272.12定时服务(TimerService)定时服务可以用在statelesssessionbean和message-drivenbean,当某个statelesssessionbean或message-drivenbean的定时器启动时,容器会从实例池中选择bean的一个实例,然后调用其timeout回调方法。可以使用@Resource注释注入定时服务,或者使用容器对象SessionContext创建定时器。下面例子在sessionbean中定义一个定时器,每隔3秒钟触发一次事件,当定时事件触发5次的时候便终止定时器的执行。282.12定时服务(TimerService)292.12定时服务(TimerService)当定时器创建完成后,我们还需要添加定时事件的回调方法。回调方法使用@javax.ejb.Timeout注释标注,必须返回void,并接受一个javax.ejb.Timer类型的参数,回调方法声明的格式:voidXXX(Timertimer)在定时事件发生时,此方法将被执行。30JSP客户端代码:TimerServiceTest.jsp312.13安全服务(Securityservice)使用Java验证和授权服务(JavaAuthenticationAuthorizationServicesJAAS)可以很好地解决上面的问题,可以用它来管理应用程序的安全性。验证(Authentication)认证是完成用户名和密码的匹配校验;其校验的对象是试图访问受保护系统的用户。在进行校验时,应用服务器会检查用户是否存在于系统之中,是否提供了凭证(通常指密码)。授权(authorization)用户一旦通过了系统验证,需要与系统进行某种形式的交互。授权就是决定用户是否有权执行某项操作的过程,授权是基于角色的。322.13安全服务(Securityservice)Jboss服务器提供了安全服务来进行用户认证和根据用户规则来限制对POJO的访问。对每一个POJO来说,可以使用@SecurityDomain注释为它指定一个安全域,安全域告诉容器到哪里去找密码和用户角色列表。PlainOldJavaObjects,简单的Java对象,就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。JBoss中的other域指明要到classpath下寻找users.propertes和roles.properties。对每一个方法来说,我们可以使用一个安全限制注释来指定谁可以运行这个方法332.13安全服务(Securityservice)本例使用Jboss默认的安全域“other”,“other”安全域告诉容器到classpath下的users.properties和roles.properties中寻找密码和用户角色列表。“other”安全域定义[jboss安装目录]/server/default/conf/login-config.xml文件中342.13安全服务(Securityservice)352.13安全服务(Securityservice)下面我们开始安全服务的具体开发:第一步,定义安全域,安全域的定义有两种方法:第一种方法:通过Jboss部署描述文件jboss.xml进行定义(本例采用的方法)1.security-domain指定我们使用的安全域是“other”,2.unauthenticated-principalAnonymousUser/unauthenticated-principal节点指定允许匿名用户访问。3.jboss.xml必须放进Jar文件的META-INF目录。362.13安全服务(Securityservice)372.13安全服务(Securityservice)第三步,为业务方法定义访问角色(后台)。@RolesAllowed注释指定允许访问方法的角色列表,如果角色存在多个,可以用逗号分隔。@PermitAll注释指定任何角色都可以访问此方法。382.13安全服务(Securityservice)392.13安全服务(Securityservice)402.13安全服务(Securityservice)412.13.1自定义安全域把用户名/密码及角色存放在users.propertes和roles.properties文件,不便于日后的管理。大多数情况下都希望把用户名/密码及角色存放在数据库中。我们需要自定义安全域,下面的例子定义了一个名为foshanshop的安全域,它采用数据库存储用户名及角色。422.13.1自定义安全域432.13.1自定义安全域1.“DefaultMySqlDS”数据源,2.principalsQuery属性指定如何通过给定的用户名获取密码,3.rolesQuery属性指定如何通过给定的用户名获取角色列表。4.注意:SQL中的‘Roles’常量字段不能去掉。5.unauthenticatedIdentity属性指定允许匿名用户访问。442.13.1自定义安全域452.13.1自定义安全域46第三章实体Bean(EntityBean)1.Jboss数据源的配置2.单表映射的实体Bean3.成员属性映射4.建议重载实体Bean的Equals()和Hashcode()方法5.映射的表名或列名与数据库保留字同名时的处理6.多表映射的实体Bean7.持久化实体管理器EntityManager8.关系/对象映射9.JPQL查询473.1JBoss数据源的配置数据源用于配置数据库的连接信息,每个数据源必须指定一个唯