java ejb开发_Java实践之路——EJB(一)

本文介绍了Java EJB(企业JavaBean)的基本概念和用途,特别是其在分布式应用中的作用。文章通过百度百科的定义解释了EJB的主要特点,如可扩展性、分布式、事务处理等,并探讨了EJB与DCOM、远程调用和Web服务的区别。作者以EJB3.0为例,展示了如何开发和部署一个简单的无状态Session Bean,包括服务端和客户端的实现。文章结尾提出了关于有状态Session Bean的疑问,并邀请读者分享见解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面开始我的EJB之旅

学习任何一门技巧之前,都定然容易的打听一下该技巧的用处的优缺点。因而率先我们来看一下摘自百度百科上面对EJB的定义和解释

==========================================================================

EJB是sun的服务器端组件模型,最大的用处是安排散布式利用过程当然,还有众多措施能够告终散布式利用,相仿微软的.net技巧。依靠java跨平台的优势,用EJB技巧安排的散布式系统能够不限于特定的平台。EJB (Enterprise JavaBean)是J2EE的一局部,定义了一个用于开发基于组件的企业多重利用过程的规范。其个性包括网络服务扶持和中心开发工具(SDK)。 在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的中心代码,离别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。

一个技巧规范:EJB 从技巧上而言不是一种"产品" ,EJB 是一种规范描写了发生利用组件要处理的:

可伸展 (Scalable)

散布式 (Distributed)

事务处理 (Transactional)

数据存储 (Persistent)

平安性 (Secure)

===========================================================================

里面说得许多wh.whflsc.com,其实我会意和关怀的却并不多。率先EJB是一个服务器端的组件模型,能够安排散布式利用过程。我重要比拟关怀安排散布式利用过程。说实话,什么是散布式利用过程,我也是似懂非懂的,因而渴望穿越学习EJB更深入的打听一下。然后即便关怀EJB要处理的问题了:可伸展、散布式、事务处理、数据存储和平安性。我可信,学习完后能够把这几个局部搞懂就差不多了

说起散布式组件,我可信大家会想到微软的DCOM技巧,它们的差异在哪呢?跨平台问题?其他?不懂!

长途调用,和webservice有什么差异呢?摸索中

还有一点,可信许多人和我有共同的疑问。都说EJB是重量级的混杂的,然后又有许多声音说spring将会轮换它(当然我们这里学习的EJB3.0以上版本的,对于老版本我们这里就不关怀了),我不懂得这是怎么回事。

带着这么多疑问,我们开始EJB吧

隔了这么久,总认留难以下手。哈哈,其实也不是那么混杂。下?**颐蔷涂才乓桓鑫奘绿墓└镜亟涌诤统ね窘涌诘腟ession Bean吧。

率先开发服务端,服务端定然依靠Ejb的API,率先定义本地接口ILocalCalculator.java

package stateless.ejb;public inte***ce ILocalCalculator {double add(double x,double y);double minus(double x,double y);double mutilply(double x,double y);double devide(double x,double y);}

长途拜会接口,IRemoteCalculator.java,继承自本地接口

package stateless.ejb;public inte***ce IRemoteCalculator extends ILocalCalculator {double power(double x,int n);}告终一个无事态的Session Bean,CalculatorBean.java

package stateless.ejb;import javax.ejb.Local;import javax.ejb.Remote;import javax.ejb.Stateless;@Stateless@Remote({IRemoteCalculator.class})@Local({ILocalCalculator.class})public class CalculatorBean implements IRemoteCalculator {@Overridepublic double add(double x, double y) {return x+y;}@Overridepublic double devide(double x, double y) {if(y==0){return 0;}return x/y;}@Overridepublic double minus(double x, double y) {return x-y;}@Overridepublic double mutilply(double x, double y) {return x*y;}@Overridepublic double power(double x,int n) {double result=1;for(int i=1;i<=n;i++){result*=x;}return result;}}

接下来时安排,打包这以上三个文件EjbService.jar,放到JBOSS_HOME\server\default\deploy目录下,然后打包一份接口供客户端利用,包括两个接口文件,EjbServiceInte***ce.jar.

接下来即便客户端调用了,开发EjbBean.java

package bean;import java.util.Properties;import javax.naming.InitialContext;import javax.naming.NamingException;import stateless.ejb.ILocalCalculator;import stateless.ejb.IRemoteCalculator;public class EjbBean {/** * 穿越调用ejb服务计算收获 * @param x * @param y * @param operator * @param type 1-local,2-remote * @return */public double Calc(double x,double y,String operator,int type){Properties props = new Properties(); props.setProperty("java.naming.factory.initial", "org.jnp.inte***ces.NamingContextFactory"); props.setProperty("java.naming.provider.url", "localhost:1099"); InitialContext ctx =null;try {ctx = new InitialContext(props);if(type==1) {ILocalCalculator calculator=(ILocalCalculator)ctx.lookup("CalculatorBean/local");if(operator.equals("+")){return calculator.add(x, y);}else if(operator.equals("-")){return calculator.minus(x, y);}else if(operator.equals("*")){return calculator.mutilply(x, y);}else if(operator.equals("/")){return calculator.devide(x, y);} } else if(type==2) { IRemoteCalculator calculator=(IRemoteCalculator)ctx.lookup("CalculatorBean/remote"); if(operator.equals("+")){return calculator.add(x, y);}else if(operator.equals("-")){return calculator.minus(x, y);}else if(operator.equals("*")){return calculator.mutilply(x, y);}else if(operator.equals("/")){return calculator.devide(x, y);}else if(operator.equals("power")){return calculator.power(x, (int)y);} }} catch (NamingException e) {e.printStackTrace();}return 0.0001;}}

这里定然增加EjbServiceInte***ce.jar依靠emi7.com,

然后即便开发service,EjbService.java

package service;import java.io.IOException;import java.io.PrintWriter;import java.util.Vector;import javax.mail.MessagingException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import bean.EjbBean;import bean.EmailBean;import entity.Email;public class EjbService {private HttpServletRequest req;private HttpServletResponse res;public HttpServletRequest getReq() {return req;}public void setReq(HttpServletRequest req) {this.req = req;}public HttpServletResponse getRes() {return res;}public void setRes(HttpServletResponse res) {this.res = res;}public EjbService(){}public EjbService(HttpServletRequest req,HttpServletResponse res){this.req=req;this.res=res;}public void calc(double x,double y,String operator,int type){EjbBean bean=new EjbBean();double result = bean.Calc(x, y, operator, type);try {PrintWriter out =this.res.getWriter();out.print(result);} catch (IOException e) {e.printStackTrace();}}}

然后即便哀求处理,EjbServlet.java

package servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import service.EjbService;import service.EmailService;public class EjbServlet extends HttpServlet {private EjbService service;/** * Constructor of the object. */public EjbServlet() {super();}/** * Destruction of the servlet.
*/public void destroy() {super.destroy(); // Just puts "destroy" string in log// Put your code here}/** * The doGet method of the servlet.
* * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");response.setCharacterEncoding("UTF-8");request.setCharacterEncoding("UTF-8");service=new EjbService(request,response);String action="";action=request.getParameter("action");if(action==null || action.equals("")){return;}//凑近处理哀求种类if(action.toUpperCase().equals("CALCRESULT")){double x=Double.parseDouble(request.getParameter("x_value"));double y=Double.parseDouble(request.getParameter("y_value"));String operator=request.getParameter("operator");String method=request.getParameter("method");int type=1;if(method.equals("remote")){type=2;}service.calc(x, y, operator, type);}}/** * The doPost method of the servlet.
* * This method is called when a form has its tag value method equals to post. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request,response);}/** * Initialization of the servlet.
* * @throws ServletException if an error occurs */public void init() throws ServletException {// Put your code here}}

最后即便出现层的in.intkb.com入口

EJB客户端
+-*/power

ajax哀求

function calc(){var x=$("#x").val();var y=$("#y").val();//定然引入扶持select标签的jquery伸展 jquery.select.jsvar oper=$("#operator").getSelectedValue();var type="local";if(oper=="power"){type="remote";}$.get("EjbServlet",{action:"CALCRESULT",x_value:x,y_value:y,operator:oper,method:type},function(data){$("#calc_result").val(data);});}

好,到这里就开发好了。启用jboss服务器,输入数据测验穿越。

归纳:

1、在开发中遭到一个问题,报错消息为msg:javax.naming.NameAlreadyBoundException: remote

精细琢磨了一下,发目前导出jar文件给客户端利用时,不能包括告终进去,只能包括供给的接口。在切实开发安排中也正是这么,提供给客户端利用确乎定只有接口,否则EJB就错过了它的含义。而且依据这个讹谬提醒,该当是服务器和客户端在统一台电脑上安排厉行才会揭示这个讹谬。猜想是这么的,不懂得是否准确

2、这里开发的无事态的Session Bean。那有事态的Session Bean和这个有什么差异呢。

其实有事态的即便会记拨取户的事态。举个例子。例如警?**穸薊JB中有一个成员变量total,告终的功能是每次登陆时加1垄断,无事态的即便每个用户登陆顺次都会对这个数据举行加1,而有事态的是会离别登记每个用户登陆的次数,而不是所有用户的总登陆次数,现有会意的它们的差异就在这里。其它的待挖掘。万一你有什么更好的会意,请不吝赐教。一个java版本的“Helloworld”过程就很OO。但把过程写得极其有“面向对象”的风格,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值