第19章实例主要内容:无状态会话Bean实例,完成的功能是计算个人所得税;有状态会话Bean实例,模拟一个网上书店的购物车;WebService实例,是一个无状态会话Bean,能够对用户进行简单的响应;定时服务实例,定时服务是JavaEE5中的一个比较特殊的服务。19.1无状态会话Bean实例19.1.1实例功能描述使用EJB完成个人所得税的计算,计算的时候需要提供应纳税部分工资和起征点。采用无状态会话Bean:因为不需要保存客户端信息。该实例由两个文件组成业务接口Bean类包括两种类型的客户端Application客户端Web客户端,采用JSP19.1.2创建业务接口/*PersonalRevenue.java*/packagech19;importjavax.ejb.Remote;@Remote()publicinterfacePersonalRevenue{publicfloatgetPersonalRevenue(floatsalary,floatstart);}需要实现业务接口中的方法@Stateless表示EJB是无状态会话BeanimplementsPersonalRevenue表示实现了业务接口PersonalRevenue。代码://PersonalRevenueBean.java19.1.3创建Bean类19.1.4创建Application客户端获取对EJB实例的引用@EJBprivatestaticPersonalRevenuepersonalRevenue;访问EJB的业务方法floatrevenue=personalRevenue.getPersonalRevenue(3000,1600);完整代码//PersonalRevenueClient.java19.1.5创建Web客户端使用page指令导入要用到的类%@pageimport=com.neu.javaee.ejb,javax.naming.*%查找业务接口%!privatePersonalRevenuepersonalRevenue=null;publicvoidjspInit(){try{InitialContextic=newInitialContext();personalRevenue=(PersonalRevenue)ic.lookup(PersonalRevenue.class.getName());}catch(Exceptionex){System.out.println(不能创建personalRevenuebean。+ex.getMessage());}}publicvoidjspDestroy(){personalRevenue=null;}%调用业务方法%Stringsalary=request.getParameter(salary);Stringstart=request.getParameter(start);if(salary!=null&&salary.length()0&&start!=null&&start.length0){try{floatfsalary=Float.parseFloat(salary);floatfstart=Float.parseFloat(fstart);floatrevenue=personalRevenue.getPersonalRevenue(fsalary,fstart);}catch(Exceptionex){out.println(应该输入大于0的数字!);}}%19.2有状态会话Bean实例功能:本实例模拟一个网上书店的购物车,能够向购物车中添加图书、能够删除购物车中的图书、能够察看购物车中的信息。包含两个文件业务接口会话Bean类涉及两个辅助类IdVerifierBookException19.2.1业务接口packagech19;importjava.util.List;importjavax.ejb.Remote;@RemotepublicinterfaceCart{publicvoidinitialize(Stringperson)throwsBookException;publicvoidinitialize(Stringperson,Stringid)throwsBookException;publicvoidaddBook(Stringtitle);publicvoidremoveBook(Stringtitle)throwsBookException;publicListStringgetContents();publicvoidremove();}19.2.2Bean类使用Stateful进行标识实现业务接口publicclassCartBeanimplementsCart实现业务接口中定义的所有业务方法实现Remove方法@Remove()publicvoidremove(){contents=null;}19.2.3辅助类IdVerifier验证ID是否合法BookException自定义的异常类19.2.4访问过程与无状态会话Bean的访问过程相同19.3WebService实例作为WebService的会话Bean必须是无状态会话Bean。另外还有如下特殊要求:使用javax.jws.WebService或者javax.jws.WebServiceProvider标识标记。实现类可以通过@WebService标识的endpointInterface元素显式的引用一个SEI。实现类的业务方法必须是public,并且不能被声明为static、final或者abstract。给WebService客户端的业务方法使用javax.jws.WebMethod元注释标记。给WebService客户端的业务方法的参数和返回值类型必须与JAXB兼容。实现类必须有一个默认的公有类型的构造器。实现类必须使用@Stateless进行标识。实现类不能定义finalize方法。实现类可以实现生命周期事件回调方法19.4使用定时服务定时功能要解决的问题在某个特定的时刻产生一个事件在一段时间之后产生一个事件以一定的时间间隔产生某个事件EJB容器的定时服务能够为所有EJB提供定时服务;编写定时服务的过程在需要定时服务的EJB的Bean类中编写一个方法,方法中包含当定时事件发生时候的处理代码。方法的返回值是void,参数是javax.ejb.Timer对象。使用@Timeout元注释修饰这个方法,写在方法的前面即可。使用定时服务包括得到TimerService对象。调用TimerService的createTimer方法创建Timer。这样当时间到期的时候系统会调用Bean的定时方法。如果需要取消Timer可以调用Timer接口的cancel方法。如果需要访问Timer的信息,可以通过Timer接口访问。19.4.1Timeout方法@Timeoutpublicvoidtimeout(Timertimer){System.out.println(TimerBean:timeout发生了);}19.4.2TimerService接口可以通过依赖注入访问TimerService可以通过EJBContext接口的getTimerService方法查找可以通过JNDI名字空间查找主要方法createTimer,参数:时间(毫秒)和信息。(某个时间段之后)createTimer,参数:时间(毫秒)、间隔(毫秒)和信息。(某个时间段之后,以特定间隔)createTimer,参数:时刻和信息。(某个特定的时间)createTimer,参数:时刻、间隔(毫秒)和信息。(某个特定时刻之后,以特定间隔)getTimers,得到定时器19.4.3Timer和TimerHandleTimer接口允许Bean提供者取消定时器或者获取定时器信息。主要方法:cancel,取消定时服务getTimeRemaining,获取剩余时间getNextTimeout,获取下一次事件的时间getHandle,得到TimerHandlegetInfo,得到定时信息TimerHandle接口允许Bean提供者获取串行化的timer。主要方法:getTimer,获取定时器19.4.4创建定时器调用TimerService接口的createTimer方法。调用createTimer的时候,定时服务开始不停的减少时间的长度实例:Timertimer=timerService.createTimer(intervalDuration,Creatednewtimer);19.4.5取消和保存定时服务Timer可以被下面的事件取消:当单事件定时器超时的时候,EJB容器调用@Timeout方法,然后取消Timer。当调用Timer接口的cancel方法的时候,容器取消定时器。要保存Timer,调用getHandle得到TimerHandle对象,该对象可以串行化然后保存到数据库。要获取保存的Timer,先从数据库中得到TimerHandle对象,然后调用getTimer方法。19.4.6获取定时器信息publiclonggetTimeRemaining();publicjava.util.DategetNextTimeout();publicjava.io.SerializablegetInfo();19.4.7事务和定时服务如果事务回滚了,定时器的创建也要回滚。如果在事务内取消了定时器,这个事务回滚了,则取消定时器这个动作也要回滚。在使用容器管理事务的Bean中,@Timeout方法通常使用Required事务属性来保证事务的整体性。TimerSession.javaTimerSessionBean.javatimerTest.jsp19.4.8实例本章小结无状态会话Bean有状态会话Bean作为WebService的Bean定时服务下一章消息服务与消息驱动Bean