JSP如何调用EJB

yantuodi 2003-08-22 02:10:44
请问高手JSP调用EJB与调用JAVA BEAN一样吗?
若不一样,能否结合例子讲一下!
...全文
260 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
orant 2003-08-23
  • 打赏
  • 举报
回复
我也在学研究用JSP调用EJB
让我问一下 ,再回
xinshou1979330 2003-08-22
  • 打赏
  • 举报
回复
Bean和Servlet的企业应用

创建一个HTML页面:

这个页面名字为bonus.html。HTML代码如下:

  代码中,让人感兴趣的是用别名来调用BonusServlet.class。因为在后面提到的应用程序的组装的时候,将它映射到了这个别名BonusServlet上

<HTML>

<BODY BGCOLOR = "WHITE">

<BLOCKQUOTE>

<H3>Bonus Calculation</H3>

<FORM METHOD="GET" ACTION="BonusAlias">

<P>

Enter social security Number:

<P>

<INPUT TYPE="TEXT" NAME="SOCSEC"></INPUT>

<P>

Enter Multiplier:

<P>

<INPUT TYPE="TEXT" NAME="MULTIPLIER"></INPUT>

<P>

<INPUT TYPE="SUBMIT" VALUE="Submit">

<INPUT TYPE="RESET">

</FORM>

</BLOCKQUOTE>

</BODY>

</HTML>

  这个HTML文件有两个数据域,用户可以输入社会保险号和一个乘数。当用户单击了Submit按纽。BonusServlet就得到了终端用户的数据。然后寻找Session Bean。将用户数据传递给Session Bean。Session Bean计算出奖金,把结果返回给Servlet。Servlet再通过另一个HTML页面将奖金结果返回给用户。



创建Servlet:

例子假定BonusServlet.java文件是在C:\J2EE\Client-Code目录下面。在运行的时候,Servlet代码执行如下操作:


获得用户数据


查找Session Bean


将用户数据传递给Session Bean


在得到Session Bean的返回结果以后,创建一个HTML页面将结果返回给客户。


Servlet代码如下:

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import javax.naming.*;

import javax.rmi.PortableRemoteObject;

import Beans.*;

public class BonusServlet extends HttpServlet {

CalcHome homecalc;

public void init(ServletConfig config)

throws ServletException{

//Look up home interface

try{

InitialContext ctx = new InitialContext();

Object objref = ctx.lookup("calcs");

homecalc =

(CalcHome)PortableRemoteObject.narrow(

objref,

CalcHome.class);

} catch (Exception NamingException) {

NamingException.printStackTrace();

}

}

public void doGet (HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

String socsec = null;

int multiplier = 0;

double calc = 0.0;

PrintWriter out;

response.setContentType("text/html");

String title = "EJB Example";

out = response.getWriter();

out.println("<HTML><HEAD><TITLE>");

out.println(title);

out.println("</TITLE></HEAD><BODY>");

try{

Calc theCalculation;

//Get Multiplier and Social Security Information

String strMult =

request.getParameter("MULTIPLIER");

Integer integerMult = new Integer(strMult);

multiplier = integerMult.intValue();

socsec = request.getParameter("SOCSEC");

//Calculate bonus.10 AUGUST 28, 2000

double bonus = 100.00;

theCalculation = homecalc.create();

calc =

theCalculation.calcBonus(multiplier, bonus);

} catch(Exception CreateException){

CreateException.printStackTrace();

}

//Display Data

out.println("<H1>Bonus Calculation</H1>");

out.println("<P>Soc Sec: " + socsec + "<P>");

out.println("<P>Multiplier: " +

multiplier + "<P>");

out.println("<P>Bonus Amount: " + calc + "<P>");

out.println("</BODY></HTML>");

out.close();

}

public void destroy() {

System.out.println("Destroy");

}

}


  在import子句中,javax.servlet包括了Servlet Class的协议。Java.io是系统输入输出包。Javax.naming里面包含了Java名字目录服务APIs。Javax.rmi是用来Session Bean的home接口和Remote对象的通信使用的。

  在BonusServlet.init方法中,查找Session Bean的home接口。并且产生它的实例。方法使用了JNDI在组件的组装中的指定的名字calcs。用它来得到home接口的reference。然后就把这个reference和home接口类传递给PortableRemoteObject.narrow方法。来保证把reference转化为CalcHome类型。

  DoGet()方法有两个参数。一个是request对象,另一个是reponse对象。浏览器发送一个request对象给Servlet。而Servlet返回一个response对象给浏览器。方法访问request对象里面的信息,可以发现是谁在发出的请求、请求的数据在什么表单里面、是哪个HTTP头被发送。并使用reponse对象产生一个HTML页面来响应浏览器的请求。

  当方法处理请求的时候,如果产生输入输出错误,就抛出一个IOException异常。如果不能处理请求,就会抛出一个ServletException异常。为了计算奖金值,doGet()创建了一个home接口,调用它的calcBonus。


创建Session Bean:

  Session Bean代表了与客户的一个短暂的会话。如果服务或者客户有一方崩溃了。数据就消失了。相反,Entity Bean代表了数据库中一段持久的数据。如果服务或者客户又一方崩溃了,底层的服务保证数据能被保存下来。

  因为这个Enterprise Bean只是应BonusServlet的请求,执行了一个简单的计算。如果发生崩溃,可以重新初始化计算。这样,我们在本例子中就选择Session Bean来实现这个计算。

 在组装配置好以后,Servlet组件和Session Bean组件如何在一个J2EE应用程序中协同工作。容器是Session Bean和支持Session Bean的底层平台之间的接口。容器是在配置期间产生的。

  本例子假定CalcBean.java、Calc.java和CalcHome.java文件都放在C:\J2EE\Beans目录下面。CalcHome.java文件前面的Package名字 Beans和目录Beans的名字应该是一样的。当这些文件被编译的时候,是从Beans目录中编译,其名字是包的名字后面加一个斜线在加上类或者接口的名字。


 

CalcHome.java文件:

package Beans;

import java.rmi.RemoteException;

import javax.ejb.CreateException;

import javax.ejb.EJBHome;

public interface CalcHome extends EJBHome {

Calc create() throws CreateException, RemoteException;

}

  BonusServlet并不直接同Session Bean通信。而是通过产生一个CalcHome的实例。这个Home接口扩展了EJBHome接口。有一个Create()方法,用来在容器中产生一个Session Bean。如果无法产生Session Bean,将会抛出一个CreateException异常。如果不能与Session Bean的远程方法通信,就会抛出一个RemoteException异常。


Calc.java文件:

package Beans;

import javax.ejb.EJBObject;

import java.rmi.RemoteException;

public interface Calc extends EJBObject {

public double calcBonus(int multiplier,

double bonus)

throws RemoteException;

}

  产生一个Home接口以后,J2EE应用程序就创建一个Remote接口和一个Session Bean。Remote接口扩展了EJBObject接口。并且声明了一个calcBonus()方法来计算奖金值。方法需要抛出javax.rmi.RemoteException异常。方法的实现在CalcBean类里面。


CalcBean.java文件:

package Beans;

import java.rmi.RemoteException;

import javax.ejb.SessionBean;

import javax.ejb.SessionContext;

public class CalcBean implements SessionBean {

public double calcBonus(int multiplier,

double bonus) {

double calc = (multiplier*bonus);

return calc;

}

public void ejbCreate() { }

public void setSessionContext(

SessionContext ctx) { }

public void ejbRemove() { }

public void ejbActivate() { }

public void ejbPassivate() { }

public void ejbLoad() { }

public void ejbStore() { }

}

  本Session Bean类实现了SessionBean接口,提供了CalcBonus()方法的行为。在BonusServlet调用CalcHome的Create()方法以后,依次调用setSessionContext()方法和ejbCreate()方法。

  这些空的方法是从SessionBean中来的。由容器负责调用。除非在Bean的创建或者删除里面,你需要附加一些你自己的操作。否者,你并不需要提供这些方法的行为。

不知道是不是楼主想要的
自我感觉真的很难因为我的水平还不够, 学习ing
wueg2003 2003-08-22
  • 打赏
  • 举报
回复
与servlet一样调用
howelltech 2003-08-22
  • 打赏
  • 举报
回复
jsp最好不要调用ejb或javabean,因为不符合mvc模式。
用servlet调用ejb,写法就像wizardho(hh)写的。
Alain_Delone 2003-08-22
  • 打赏
  • 举报
回复
就是把SERVLET中调用的方法放到JSP中
的《% %》中
不过你这样太恐怖了,哪有JSP调EJB,那么后端的东西,放SERVLET都有些太浅了
至少弄个代理吧
conning333 2003-08-22
  • 打赏
  • 举报
回复
和其他地方调用ejb方法一样
Leemaasn 2003-08-22
  • 打赏
  • 举报
回复
和servlet调用ejb 一样
lcfgaoyong 2003-08-22
  • 打赏
  • 举报
回复
mark
wizardho 2003-08-22
  • 打赏
  • 举报
回复
Context ctx=new InitialContext();
InfoSLBHome infoslbhome=(InfoSLBHome)ctx.lookup("InfoSLB"); InfoSLB infoslb=infoslbhome.create();

通过servlet比较好

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧