通过 Web 服务传递二进制数据,第 2 部分:创建 EJB 模块
本教程的目标是创建一个公开两种方法的 EJB 模块,第一种方法用于提供单个图像,第二种用于提供所有图像。通常,这些图像应该来自于数据库。由于数据库检索不是本教程关注的重点,所以我们将这些图像放在 EJB 模块内的一个资源文件夹中。
本系列教程
- 概述
- => 创建 EJB 模块
- 创建 Web 服务
- 测试 Web 服务
- 修改模式和 WSDL 文件传递二进制数据
- 创建 Swing 客户机
- 登录和优化 Web 服务
创建 EJB 模块
在以下步骤中,创建一个包含图像的 Enterprise Java Bean (EJB),这些图像将被 Web 服务作为二进制数据传递。
要创建该 EJB 模块,请执行以下步骤:
- 选择“文件”>“新建项目”(Ctrl-Shift-N)。此时将打开“新建项目”向导。在“企业”类别中选择“EJB 模块”选项并单击“下一步”按钮。此时将打开“名称和位置”页面。
- 在“项目名称”字段中键入 FlowerAlbum。选择放置此项目的位置 — 对为此端到端应用程序创建的其他项目,使用同一位置。保留其他选项为默认设置,然后单击“下一步”按钮。此时将打开“服务器和设置”页面。
- 选择应用服务器和 Java EE 版本。这必须与端到端应用程序中的所有项目相同。IDE 会创建一个 EJB 模块项目,如下图中的“项目”窗口所示:
- 右键单击 FlowerAlbum 项目节点并选择“新建”>“会话 Bean”。或者,右键单击该项目节点并选择“新建”>“其他”。在“新建文件”向导中,在“企业”下面,选择“会话 Bean”。此时将打开“新建会话 Bean”向导。
- 将该会话 Bean 命名为 Flower,加上 flower.album 作为包名。确保选择“无状态和远程”。现在您应该看到以下内容:
单击“完成”按钮。
IDE 会给 Source Packages 节点添加一个会话 Bean,以及一个远程接口,如下所示。在“企业 Bean”节点,为您的新 FlowerBean 添加了一个新节点:
- 右键单击 FlowerBean 节点并选择“添加”>“业务方法”。此时将打开“业务方法”对话框。
-
在“业务方法”对话框中键入以下值:
- 名称: getFlower
- 返回类型: byte[]
单击“添加”按钮。在“名称”字段中,键入 name。其他值保持不变。现在您应该看到以下内容:
-
单击“异常”选项卡。单击“添加”按钮。打开“查找类型”对话框。键入 IO 并选择 IOException (java.io)。
单击“确定”。返回显示 IOException 的“业务方法”对话框。
单击“确定”。现在您的 Bean 类中已经有了方法的基本内容,在远程接口类中有方法声明。
- 再次调出“业务方法”对话框。这次键入以下值:
- 名称: allFlowers
- 返回类型: List<byte[]>
像以前一样,将 IOException 添加到“异常”选项卡。单击所有对话框,IDE 将创建方法。
- 在远程接口类中,注意以前的步骤已经成功生成了这些方法:
@Remote
public interface FlowerRemote {
byte[] getFlower(String name) throws IOException;
List<byte[]> allFlowers() throws IOException;
}
查看 Bean 类,注意到已经为声明的方法创建了桩模块:
@Stateless
public class FlowerBean implements FlowerRemote {
public byte[] getFlower(String name) throws IOException {
return null;
}
public List<byte[]> allFlowers() throws IOException {
return null;
}
}
如果不使用“业务方法”对话框,也可以手动向 Bean 类和远程接口类添加代码。但是,如果您使用“业务方法”对话框,IDE 将同时向 Bean 类和远程接口类添加代码。
-
Bean 和远程接口类中的“修复导入”。在每个类中,将光标放在代码中的任何位置,单击右键打开上下文菜单,选择“修复导入”。这将打开一个对话框,显示所有必须的导入。单击“确定”,NetBeans 生成导入语句。或者在每个类中按 Ctrl-Shift-I 打开导入对话框。
-
现在您已经在远程接口中声明了方法,并在 Bean 类中实现了桩模块。
现在“项目”窗口应该在 Enterprise Beans 节点中为您的新方法显示两个新节点,如下所示:
- 使用以下代码填充该 Bean 类,用于公开单个图像和公开所有图像:
@Stateless
public class FlowerBean implements FlowerRemote {
private static final String[] FLOWERS = {"aster", "honeysuckle", "rose", "sunflower"};
public byte[] getFlower(String name) throws IOException {
URL resource = this.getClass().getResource("/flower/album/resources/"+name+".jpg");
return getBytes(resource);
}
public List<byte[]> allFlowers() throws IOException {
List<byte[]> flowers = new ArrayList<byte[]>();
for (String flower:FLOWERS) {
URL resource = this.getClass().getResource("/flower/album/resources/"+flower+".jpg");
flowers.add(getBytes(resource));
}
return flowers;
}
private byte[] getBytes(URL resource) throws IOException {
InputStream in = resource.openStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
for(int read; (read = in.read(buf)) != -1;) {
bos.write(buf, 0, read);
}
return bos.toByteArray();
}
}
- 创建一个叫做 resources 的新子包。将以下图像复制到该包:
在“项目”视图中,这些图像应该显示如下:
在您的代码中,注意方法 getFlower 和 allFlowers 都使用此包中的图像。
现在您的 EJB 模块完成了!在下一部分,创建一个委托给 EJB 模块的 Web 服务,以便检索代码中相应点的图像。
未来计划:
创建 Web 服务
要发送意见和建议,获取支持,了解关于 NetBeans IDE Java EE 开发特性的最新发展,请加入 邮件列表。