|
|
第1课 本课将向大家介绍有关J2EE应用编程以及J2EE SDK的知识,并讲述如何编写包含有 HTML页面、Servlet和 session bean的简单的瘦客户多层企业应用程序。
J2EE SDK 是针对J2EE平台的非商品化的操作定义和规范,使用Sun Microsystems 系统的用户均可免费获得并可将其用于演示、原型制作和教育等用途。随J2EE SDK 还 提供了J2EE 应用服务器、Web服务器、数据库、J2EE API和一系列全面的开发和部署 工具。在本课程的学习中,你将逐渐熟悉这些特性和工具。
瘦客户多层应用范例
本课中的瘦客户多层应用范例接受调用Servlet的HTML表单的用户输入。这个 Servlet使用Java命名和目录界面(JNDI)来查找一个Session Bean,进而执行一个计 算。在接收到计算的结果后,该Servlet以HTML页面的形式将计算所得的数值返回到最 终用户。 这个范例是一个瘦客户应用,因为Servlet没有执行任何业务逻辑。这个简单的计 算是由J2EE应用服务器中的Session Bean完成的。因此,该客户是瘦客户,因为在这 个过程中,它没有进行处理操作,处理操作是由Session Bean完成的。 多层应用可以由3层或4层组成。如 图1所示, 这个多层范例由4层组成。通过将一个多线程应用服务器置于非Web客户应用和后端数 据库之间,可将标准的两层客户/服务器模型扩展为三层的结构。同时,用 Servlet/JavaServer Pages TM 技术支持的Web浏览器和HTML页面替换客户应用,可将 三层的模型扩展为4层的结构。
图1 : 多层结构
本课将只介绍这四层中的前三层,第四层中的数据库服务器内容我们将在第二课中 讲述。在接下来的几课中,我们将继续使用这个范例来讲述如何使用JavaServer Pages和XML技术。 J2EE 软件和安装
为了运行该范例,需要从以下的网址( http://java.sun.com/j2ee/download.html)下载和安装Java 2 SDK企业版 (J2EE), Version 1.2.1 Release,并从( http://java.sun.com/jdk/index.html)下载安装Java 2 SDK,Standard Edition(J2SE), Version 1.2或更高。 本教程的教学假设J2EE和J2SE已安装在monicap的home目录下的J2EE目录中。 注意: monicap在任何地方都表 示一个路径名,请将其改成你自己的用户名称。 Unix:
/home/monicap/J2EE/j2sdkee1.2.1
/home/monicap/J2EE/jdk1.2.2
Windows:
\home\monicap\J2EE\j2sdkee1.2.1
\home\monicap\J2EE\jdk1.2.2
路径和类路径设置
下载的内容包括J2EE应用服务程序、Cloudscape 数据库、一个采用SSL协议 (Secure socket layer, 即 HTTP over HTTPS)的Web服务程序、开发和部署工具以 及用于企业的Java API。 按照以下的描述来设置你的路径和类路径环境变量,以便使 用这些特性。 路径设置
路径设置可以使你从系统中的任何地方访问上述开发和部署工具。由于可能与以前 安装旧版JDK时设置的路径相冲突,应确保把这些路径设置放在原来的设置之前。 Unix:
/home/monicap/J2EE/jdk1.2.2/bin
/home/monicap/J2EE/j2sdkee1.2.1/bin
Windows: \home\monicap\J2EE\jdk1.2.2\bin
\home\monicap\J2EE\j2sdkee1.2.1\bin
类路径设置
通过类路径设置,可以告知Java 2 开发和部署工具到哪儿去找到它们所需用的不 同类库。 Unix:
/home/monicap/J2EE/j2sdkee1.2.1/lib/j2ee.jar
Windows:
\home\monicap\J2EE\j2sdkee1.2.1\lib\j2ee.jar
J2EE 应用组件
J2EE应用组件由J2EE应用程序设计师负责编写。一个J2EE组件是一个具有独立功能 的软件单元,与其它的应用组件一起被汇编到J2EE应用和接口中。J2EE 规范定义了以 下的应用组件: 在本课中,你将创建一个J2EE应用和两个J2EE组件: 一个Servlet和一个Session Bean。这个Servlet同它的HTML文件一同被捆绑到Web Archive(WAR)文件中, Session bean的接口和类被捆绑到一个JAR文件中。 这些WAR和JAR文件被添加到J2EE 应用中,并被捆绑到Enterprise Archive(EAR)文件中,用于验证测试和部署生产 环境。 当你在本课中逐一完成每个步骤时,实际上,你在执行着几项不同的操作。编写 Servlet和Session Bean代码是开发者的操作,而创建一个J2EE应用和向应用添加J2EE 组件则是装配操作。在现实中,这些操作是由不同公司的不同人员分别完成的。 创建HTML 页面
本课中的HTML页面我们称之为
图2 : HTML 页面
图3表明了数据是如何在浏览器和Session Bean之间流动的。该Session Bean在J2EE应用服务器中运行。
图3 : 数据流
HTML代码
HTML表单代码的一个有趣之处就是用来调用 这个范例假设Unix中的 <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>
创建Servlet
本范例假设
在以下的章节中,我们将介绍该Servlet代码的不同部分。 导入(Import)语句
Servlet代码是从对以下程序包的导入语句开始的:
init 方法
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("calcs");
homecalc = (CalcHome)PortableRemoteObject.narrow(obj
ref, CalcHome.class);
doGet 方法
如果在处理请求时出现输入或输出问题, 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{
//Retrieve Bonus and Social Security Information
String strMult = request.getParameter(
"MULTIPLIER");
Integer integerMult = new Integer(strMult);
multiplier = integerMult.intValue();
socsec = request.getParameter("SOCSEC");
//Calculate bonus
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();
}
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
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");
}
}
创建Session Bean
一个Session Bean代表与客户一次短暂的会话。如果服务器或客户端崩溃,则 Session bean及其数据就会消失。与之对应的是,entity bean是永久性的,代表数 据库中的数据。如果服务器或客户端崩溃,entity bean数据会得以保存。 由于在收到 图4 表明了Servlet和Session Bean在装配 并部署在一起时是如何作为一个完整的J2EE应用运行的。在阴影框中所显示的容器 (container)是Session Bean和支持该Session Bean的相关低级平台之间的接口。这 个容器是在部署过程中被创建的。
图4 : 应用组件
在以下的章节中将显示Session Bean的代码。在这个例子中,我们假设 注 : 此范例表明了如何编译一 个Session Bean,此外,还可以从供应商处直接购买到enterprise Bean并将其安装到 J2EE应用中。 CalcHome
package Beans;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface CalcHome extends EJBHome {
Calc create() throws CreateException,
RemoteException;
}
Calc
home 接口创建后, J2EE应用服务器会创建远程接口和Session Bean。 远程接口
扩展了 package Beans;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface Calc extends EJBObject {
public double calcBonus(int multiplier,
double bonus)
throws RemoteException;
}
CalcBean
Session Bean 类实现 空方法来自 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;
}
//These methods are described in more
//detail in Lesson 2
public void ejbCreate() { }
public void setSessionContext(
SessionContext ctx) { }
public void ejbRemove() { }
public void ejbActivate() { }
public void ejbPassivate() { }
public void ejbLoad() { }
public void ejbStore() { }
}
C编译Session Bean和Servlet
为了减少打字操作,编译Session 和Servlet代码的最简单的方法是使用脚本 (Unix平台)或批处理文件(Windows平台)进行编译。 编译Session Bean
Unix
#!/bin/sh
cd /home/monicap/J2EE
J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2.1
CPATH=.:$J2EE_HOME/lib/j2ee.jar
javac -d . -classpath "$CPATH" Beans/CalcBean.java
Beans/CalcHome.java Beans/Calc.java
Windows
cd \home\monicap\J2EE
set J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2.1
set CPATH=.;%J2EE_HOME%\lib\j2ee.jar
javac -d . -classpath %CPATH% Beans/CalcBean.java
Beans/CalcHome.java Beans/Calc.java
编译Servlet
Unix
#!/bin/sh
cd /home/monicap/J2EE/ClientCode
J2EE_HOME=/home/monicap/J2EE/j2sdkee1.2.1
CPATH=.:$J2EE_HOME/lib/j2ee.jar:
/home/monicap/J2EE
javac -d . -classpath "$CPATH" BonusServlet.java
Windows
cd \home\monicap\J2EE\ClientCode
set J2EE_HOME=\home\monicap\J2EE\j2sdkee1.2
set CPATH=.;%J2EE_HOME%\lib\j2ee.jar;
\home\monicap\J2EE
javac -d . -classpath %CPATH% BonusServlet.java
启动J2EE应用服务器
在部署和运行该范例之前,需要首先启动J2EE应用服务器。用来启动服务器的命令 在J2EE安装目录下的 j2ee -verbose
注 : 如果Outlook 运行时,有时J2EE服务器可能 会无法启动。 如果上述办法不成功,则从 Unix:
j2sdkee1.2.1/bin/j2ee -verbose
Windows:
j2sdkee1.2.1\bin\j2ee -verbose
当服务器启动后, 启动部署工具
为了安装和部署 deploytool
如果上述办法不成功,则从 Unix:
j2sdkee1.2.1/bin/deploytool
Windows:
j2sdkee1.2.1\bin\deploytool
注 : 如果在启动 部署工具
图5中所显示的部署工具有4个主要的窗口。 “本地应用”窗口中显示的是J2EE应用及其组件。“服务器”窗口中显示的是本地主 机上所运行的应用服务器的信息。“服务器应用”窗口中显示的是所安装的应用。当 你按照这个步骤来安装J2EE应用范例,你会看到“本地应用”,“检查”和“服务器 应用”窗口所显示的信息。
图5 : 部署工具
注: “服务器应用”窗口的右 侧是一个灰色的 A装配J2EE应用
装配J2EE应用包括创建一个新的应用,和添加该应用的组件。下面对几个装配步骤 进行了概括,在接下来的叙述中,我们将详细介绍每个装配步骤。
创建J2EE应用
J2EE组件安装到J2EE EAR文件中。 文件菜单 : 选择 New Application(新应用)。 “新应用”对话框:
“新应用”文件选择器:
此时,
enterprise Bean(entity bean和Session Bean)被捆绑到JAR文件中。 文件菜单:选择“新enterprise Bean”。 “新enterprise Bean向导”出现,显示出一个“介绍”对话框, 概括了你将采取的步骤。阅毕,点击”下一步”。 EJB JAR 对话框:指明以下信息:
“将文件添加到.JAR”对话框 :进入J2EE目录。你可以键入路
径名称或使用浏览器进入。在进入
特别注意
:“将内容添加到 .JAR”对话框应该如图6所显示的一样。
“ Enterprise Bean JAR”类所显示的
图6 : 选择Session Bean 类文件
“普通” 对话框:选择以下信息:
环境项目对话框: 本范例中没有采用这个属性(环境项目), 因此,你可以:
检验JAR文件确实被添加到J2EE应用中:
创建Web组件
Web 组件(Servlet,或JavaServer Pages技术)被捆绑在一个WAR文件中。 文件菜单 : 选择“新Web组件”。 出现“新Web组件向导”, 显示一个窗口,介绍该采取哪些步骤。阅毕,点击”下一步”。 “WAR文件一般属性”对话框: 提供以下信息:
“将内容添加到WAR”对话框:
注 : 在添加
图7 : 添加BonusServlet.class
将内容添加到WAR 对话框:画面显示应如 图8。 >
图8
: 添加
|
|
||||||||||||||||||||||||||||||||||||