java ejb开发_Java实践之路——EJB(一)
下面開始我的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客戶端+-*/powerajax哀求
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。但把過程寫得極其有“面向對象”的風格,
總結
以上是生活随笔為你收集整理的java ejb开发_Java实践之路——EJB(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows Server 2019
- 下一篇: 阿里 delphi java_Delph