分享
 
 
 

Bean和Servlet的企业应用

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

J2EE是一个企业应用程序的开发平台,包括了对EJB、Servlet、JavaServer Page、JNDI、XML等的支持。在这个平台上可以开发瘦客户端的多层体系结构的企业应用程序。

Enterprise JavaBean技术是J2EE的主要基础。EJB技术对在分布式的计算环境中执行应用逻辑提供了一个可伸缩的框架结构。J2EE通过将EJB组件结构和其它的企业技术相结合,解决了在Java平台上进行开发和配置服务端应用程序的无缝结合。

要使用J2EE开发您的企业应用,您必须要在您的机器上安装一个Web服务器,还要支持XML。为了在浏览器中运行Java 2的API,还要给您的浏览器安装一个支持Java2的插件。

下面就介绍怎样用J2EE SDK写一个包括了Html页面,Servlet和Session Bean的一个简单的瘦客户端的多层体系结构的企业应用程序。听起来是不是心动了呢?下面就开始吧。

还要提醒一点的就是:在编程的时候,适当的增加catch子句是一个很好编程风格。假如例子代码抛出了一个正确的异常,代码就被 try/catch这样的程序结构包围。Catch子句应该中应该加入处理异常的代码,千万不要留成空白。至少,应该加入语句:e.printStackTrace()来在控制台显示异常信息。

J2EE SDK是一个J2EE平台上用于演示、教育等用途的非商业的东东。可以从javasoft的网站上免费下载。很适合用来学习。假如你没有出国权限,还可以从国内各高校的FTP服务器上去下载,速度比较快,但可能版本不是最新的。

瘦客户端的多层体系结构的应用程序的例子:

本例子通过一个HTML页面的输入来调用一个Servlet,Servlet再用Java的名字目录服务接口(JNDI)APIs来寻找一个会话Session Bean,用这个Session Bean来执行一个计算。当Servlet得到了计算的结果的之后,Servlet把计算结果返回给HTML页面的用户。

之所以说这是一个瘦客户端的应用程序,是因为Servlet本身并没有执行任何的应用逻辑。这个简单的计算是由一个Session Bean在J2EE的应用服务器上执行的。客户没有参与过程的任何操作,所有的计算都是由Session Bean完成的。

所谓的多层体系结果实际上是由三或者四层组成的。我们的例子实际上是四层的一个结构。三层的体系结构是在标准的两层的客户/服务器结构基础上,将一个多线程的应用服务器加到了非浏览器的客户端和后台数据库之间。而四层的体系结构是通过Servlet和JavaServer Pages技术将客户端的应用程序由浏览器和HTML页面来取代。这个例子我们暂时只用其中的三层,在下一个例子中。我们再去访问数据库。这样,就扩展到四层了。再以后,我们会涉及到JavaServer Pages技术和XML技术。

J2EE软件的安装:

为了使我们的例子能够运行起来,首先要下载一个Java2 SDK Enterprise Edition(J2EE)的1.2.1的版本和一个J2SE(Java 2 Standard Edition)的1.2以上的版本。在windows 2000系统中,假设我们把J2EE和J2SE都装到了C:J2EE目录下。安装具体目录如下:

J2EE:C:J2EEj2sdkee1.2.1

J2SE:C:J2EEjdk1.2.2

Path和ClassPath的设置:

下载的东西包括了J2EE的应用服务器、Cloudscape数据库、使用了加密套接字协议层的Web服务器、开发和配置的工具、企业级的Java APIs。其Path和ClassPath的设置如下:

Path的设置:在Windows系统中,需要把Path的目录包含下面两个目录:

C:J2EEj2sdkee1.2.1in

C:J2EEjdk1.2.2in

Classpath的设置:在Windows系统中,需要把Classpath参数包含下面的文件:

C:J2EEj2sdkee.1.2.1libj2ee.jar

另外,还要配置环境变量:

J2EE_HOME=C:J2EEj2sdkee1.2.1

JAVA_HOME=C:J2EEjdk1.2.2

这样,就可以执行C:J2EEj2sdkee1.2.1in目录下面的批处理命令了。仔细看看里面的批处理,你会发现不少的东西的。

J2EE应用程序组件:

J2EE程序员编写J2EE组件。J2EE组件是一个功能齐全的软件单元。将其它的应用程序组件组装到J2EE的应用程序和接口中。J2EE规范中定义如下的应用程序组件:

应用程序客户组件

Enterprise JavaBean组件

Servlet和JavaServer Pages组件(也叫做Web组件)

Applet

在本例子中,我们创建了一个J2EE的应用程序和两个J2EE的组件:一个Servlet和一个Session Bean。Servlet和HTML文件是捆绑在一个WAR(WEB Archive)文件中。Session Bean的类和接口捆绑到了一个JAR文件中。然后再把WAR文件和JAR文件加到J2EE的应用程序,捆绑到一个EAR(Enterprise Archive)文件中。并验证测试产品环境的配置。

在这所有的步骤中。实际上执行了很多的不用的角色的功能。编写Session Bean和Servlet是开发工作。而创建一个J2EE的应用程序,将J2EE组件组装到应用程序中是应用程序的组装工作。实际上,这些工作可以在不同的地方由不用的人员来做。

创建一个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:J2EEClient-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:J2EEBeans目录下面。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的创建或者删除里面,你需要附加一些你自己的操作。否者,你并不需要提供这些方法的行为。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有