用Eclipse Europa进行Web开发,第1部分 - Eclipse Java EE
Eclipse 将询问您应当将哪类连接用于数据库。选择 Generic JDBC Connection。
图 2. 连接类型
现在配置连接。需要告诉 Eclipse 连接到哪个数据库。我们在清单 2 中已经创建了一个 baseball 数据库,因此就使用那个数据库。
图 3. JDBC 连接配置
?
需要通过单击 Browse 按钮创建一个新驱动程序,如上所示。此操作 将打开各种数据库类型列表。
图 4. 数据库类型
向下滚动找到 MySQL V5.1(或者任何一种适用于您所用数据库的类型 )。单击 Add 打开驱动程序定义对话框。
图 5. JDBC 驱动程序定义
单击 Add Jar/Zip。此操作将打开一个简单的文件浏览器,您可以使 用该浏览器浏览到已下载的 MySQL 驱动程序的 JAR 文件。选中 JDBC JAR 之后 ,应当会刷新驱动程序定义列表。
图 6. 更新驱动程序定义列表
现在可以选择刚创建的驱动程序定义并单击 OK。此操作将打开连接属 性。您可能需要编辑此属性以反映将使用的用户名和密码。
图 7. JDBC 连接属性
?
输入相应的连接信息后,可以测试连接。应当会显示一个成功对话框 。
图 8. 测试连接
如果未获得如上所示的成功消息,则需要调整设置。连接测试通过后,应当 能够在 Data Source Explorer 中启动与数据库的连接。
图 9. 从 Data Source Explorer 连接
现在已经创建了与数据库的连接。该来为将要存储的数据创建一些表了。
创建表
要创建表,首先要查看 Data Source Explorer 中的表列表。
图 10. 列出的数据库表
目前还没有表,因为还未创建。如果重用现有数据库,则应当会看到表列表 。无论是哪一种情况,都请右键单击 Tables 文件夹,然后选择 New Table。
图 11. 选择新建表
此操作将打开创建选项列表。
图 12. 创建表选项
?
此操作将打开新建表对话框。
图 13. 新建表
我们将创建一张名为 Players 的表并给它提供三列:Id、First_Name 和 Last_Name。所有这三列都是必需的,并且以 Id 为主键。
图 14. 主键定义
单击 Finish。此操作不对数据库执行任何 SQL DDL。相反,它将为您生成 SQL 语句。
图 15. 生成的 SQL 语句
?
这其中最棒的是可以在执行前亲自调整 SQL。把 Id 列设置为自动累加的列 ,并把 first-name 和 last-name 列中的字符长度限制为 50 个字符。该 SQL 将类似清单 3。
清单 3. Players 表 SQL
CREATE TABLE Players (
Id INT NOT NULL AUTO_INCREMENT,
First_Name VARCHAR(50) NOT NULL,
Last_Name VARCHAR(50) NOT NULL,
PRIMARY KEY (Id)
);
要执行 SQL,请高亮选中并右键单击 Execute selected Text。
图 16. 执行 SQL
执行 SQL 后应当会在 SQL Results 窗口中生成一条确认成功的消息。
图 17. 确认 SQL 执行成功
您已经从 Eclipse 中创建了 Players 表,还可以打开 Data Source Explorer 来检验劳动成果。
图 18. 从 Data Source Explorer 查看 Players 表
还需要另外一张表,该表将保存棒球应用程序的比赛数据。可以按照上面的 方法创建。需要执行的最后一条 SQL 语句如清单 4 所示:
清单 4. Games 表 SQL
CREATE TABLE Games (
Id INT NOT NULL AUTO_INCREMENT,
Player_Id INT DEFAULT '' NOT NULL,
AB INT DEFAULT 0 NOT NULL,
H INT DEFAULT 0 NOT NULL,
2B INT DEFAULT 0 NOT NULL,
3B INT DEFAULT 0 NOT NULL,
HR INT DEFAULT 0 NOT NULL,
BB INT DEFAULT 0 NOT NULL,
R INT DEFAULT 0 NOT NULL,
RBI INT DEFAULT 0 NOT NULL,
PRIMARY KEY (Id)
);
CREATE INDEX Player_Id ON Games (Player_Id ASC);
执行完该 SQL 语句后,就已经创建了应用程序所需的两张表。在使用数据库 期间,让我们继续并输入一些测试数据。
?
输入测试数据
使用 Eclipse 创建表非常简单。管理那些表中的数据甚至更简单。可以右键 单击 Data Source Explorer 中的表名并选择 Data > Edit 开始添加数据。
图 19. 向 Players 表中添加数据
此操作将打开用于输入表格数据的简单图形界面。
图 20. 输入数据
可以根据需要添加任意数目的数据。只需要为 First_Name 和 Last_Name 输 入值。完成后,在表内右键单击鼠标并选择 Save。
图 21. 保存测试数据
在 SQL Results 窗口中,您将看到正被执行的实际 SQL 以及数据库的返回 消息。可以在 Players 窗口中右击并选择 Refresh。此操作将从数据库中重新 查询数据。您将看到行的 ID,因为这些数据是由数据库创建的。现在我们可以 对 Games 表执行相同操作。根据需要创建测试数据。完成后,就可以设置 Eclipse 来使用 Web 服务器。
?
使用 Web 服务器
在此部分中,先了解 Eclipse 的基本概念和透视图,然后再设置 Eclipse 来使用 Web 服务器。完成后,将开始实际编写应用程序的过程。
用 Eclipse 设置 Tomcat
Eclipse 中的一个重要概念是透视图。不同的透视图将为您提供适用于具体 开发类型的窗口和命令组。让我们通过选择 Window > Open Perspective > Other 再选择 Java EE 切换到 Java EE 透视图。
图 22. 切换到 Java EE 透视图
现在选择 File > New > Other 并从列表中选择 Server。
图 23. 新服务器
单击 Next 并为服务器定义选择 Tomcat v6.0 Server。需要选择一个运行时 。
图 24. 选择服务器运行时
在文件浏览器中浏览到 Tomcat 安装目录。当 Eclipse 知道 Tomcat 目录的 所在位置后,单击 Finish。现在已经设置了应用程序的所有基础设施,该开始 编写一些代码了。
?
创建 Web 应用程序
是时候开始开发此 Web 应用程序了。这是 Eclipse 发挥实际作用的部分。 选择 File > New > Other 并选择 Dynamic Web Application 来创建新 Web 应用程序。
图 25. 新动态 Web 应用程序
接下来,填写项目名称 —— 称为 baseball。还要将目标运行时设为刚创建 的 Tomcat V6.0 服务器。
图 26. 项目信息
完成后,该开始开发应用程序的域模型了。单击 Next 以打开 Project Facets。将使用 Java Persistence API 来管理数据访问(下一部分中将介绍有 关该操作的更多信息),因此确保选中该选项。
图 27. Project facets
?
单击 Next。此操作将打开 Web 模块元数据。在这里可以使用默认值,但我 喜欢把 Web 模块目录称为 “war”,可以一目了然地理解所构建的内容。
图 28. Web 模块信息
单击 Next 将打开 JPA 配置。由于使用的是 Tomcat,因此没有 “内置的” JPA 实现。如 “系统要求” 中所述,使用 OpenJPA。需要选择 Configure default JPA implementation library。
图 29. JPA 配置
此操作将打开 Default JPA Implementation Library 首选项。单击 Configure user libraries。
图 30. 为默认 JPA 实现库设置用户库
?
这将使您可以选择 OpenJPA(或者其他实现,例如 TopLink 或 Hibernate) JAR 文件。配置了 JPA 实现后,系统将把您带回到 JPA 配置屏幕中,您可以在 该屏幕中选择新库,然后单击 Finish。
图 31. JPA 配置完成
单击 Finish,然后 Eclipse 将开始工作。它将创建 Web 应用程序所需的目 录结构以及所需的许多工件,例如 web.xml 和 persistence.xml 文件。现在应 用程序已经建立,让我们开始创建它的域模型。
Eclipse 和数据访问代码:使用 JPA
了解 Java Persistence API 如何能减轻在 Java 语言中使用数据库的痛苦 ,并了解 Java EE for Eclipse 如何在开始创建应用程序的域模型时支持该域 模型。
创建域模型:使用 JPA
如果您是一名早期 Java 开发人员,则知道使用数据库有多么痛苦。通常涉 及创建大量 JDBC 代码或人工编写的长串 SQL 字符串,还涉及用许多接口创建 实体 EJB 并编写部署描述符。那种日子已经一去不复返,这要归功于 EJB V3.0 和 JPA 的出现。现在不但 EJB 易于使用,而且无需使用重量级应用服务器就可 以使用它们。
Java EE for Eclipse 可以充分支持 JPA。甚至还提供了 JPA 透视图。要切 换到该透视图,请选择 Window > Open Perspective > Other 并选择 JPA Development。
图 32. 打开 JPA 开发透视图
要创建域模型,只需创建简单的 Java 类。首先为 Players 表创建一个名为 org.developerworks.baseball.Player 的类。该类的代码如清单 5 所示:
清单 5. Player 类
package org.developerworks.baseball;
public class Player {
private int id;
private String firstName;
private String lastName;
}
您将需要此类的 getter 和 setter。幸运的是,Eclipse 使这一切变得十分 简单。选择 Source > Generate Getters and Setters。
图 33. 生成代码
?
此操作将打开 Generate Getters and Setters 对话框。单击 Select All 和 OK。
图 34. 生成 getter 和 setter
得到的代码如清单 6 所示:
清单 6. 带有 getter 和 setter 的 Player 类
package org.developerworks.baseball;
public class Player {
private int id;
private String firstName;
private String lastName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
要把类与数据库表关联起来,请在 JPA Structure 窗口中单击 Player 类。
图 35. JPA 结构
?
在 JPA Details 中,选择 Map As > Entity。
图 36. JPA 详细信息
在 Table 部分中,选择模式,并且可以在 Name 下拉框中选择 Players 表 。
图 37. 指定表
此操作应当会使代码发生更改。
图 38. 生成的 player 代码
在 Package Explorer 中选择 persistence.xml 文件,右键单击该文件,然 后选择 JPA Tools > Synchronize Classes。
图 39. 与数据库同步
此操作将使 Eclipse 针对数据库验证代码。您将注意到自己的代码无效。
图 40. 无效的 Player 类
?
这是怎么回事?看看 Problems 窗口。
图 41. Problems 窗口
第一个问题是我们的类未指定主键。要解决此问题,请在 JPA Structure 窗 口中单击 Id 属性。在 JPA Details 窗口中,选择 Map As > Id。
图 42. ID 属性的 JPA 详细信息
另请注意,由于 ID 列已设置为自动累加的列,因此需要指定主键使用 Identity 键生成策略。如果再执行一次 JPA 同步,就应当会看到已经解决了一 个问题。
其他问题源自 JPA 不能把 firstName 和 lastName 字段映射到 Players 表 的列中。那是因为没有把 Java 字段命名为与表列完全相同的名称。在 JPA Structure 窗口中选择 firstName 字段。在 JPA Details 的下拉列表中选择相 应的列。
图 43. 把 firstName 映射到 First_Name
对 lastName 字段执行相同的操作。再执行一次 JPA 同步,所有问题都应当 会解决。应当会更新 Player 类的代码,如清单 7 所示:
清单 7. 完成的 Player 类
package org.developerworks.baseball;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Column;
@Entity
@Table(schema="baseball", name = "Players")
public class Player {
@Id
@GeneratedValue(strategy=IDENTITY)
private int id;
@Column(name="First_Name")
private String firstName;
@Column(name="Last_Name")
private String lastName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
?
现在可以执行相同的过程并创建映射到 Games 表的 Game 类。Game 类的代 码如清单 8 所示:
清单 8. Game 类
package org.developerworks.baseball;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Column;
@Entity
@Table(schema="baseball", name = "Games")
public class Game {
@Id
@GeneratedValue(strategy=IDENTITY)
private int id;
@ManyToOne(optional=false)
@JoinColumn(name="Player_Id", nullable=false, updatable=false)
private Player player;
@Column(name="H")
private int hits;
@Column(name="2B")
private int doubles;
@Column(name="3B")
private int triples;
@Column(name="HR")
private int homeRuns;
@Column(name="BB")
private int walks;
@Column(name="R")
private int runs;
@Column(name="RBI")
private int rbis;
@Column(name="AB")
private int atBats;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Player getPlayer() {
return player;
}
public void setPlayer(Player player) {
this.player = player;
}
public int getHits() {
return hits;
}
public void setHits(int hits) {
this.hits = hits;
}
public int getDoubles() {
return doubles;
}
public void setDoubles(int doubles) {
this.doubles = doubles;
}
public int getTriples() {
return triples;
}
public void setTriples(int triples) {
this.triples = triples;
}
public int getHomeRuns() {
return homeRuns;
}
public void setHomeRuns(int homeRuns) {
this.homeRuns = homeRuns;
}
public int getWalks() {
return walks;
}
public void setWalks(int walks) {
this.walks = walks;
}
public int getRuns() {
return runs;
}
public void setRuns(int runs) {
this.runs = runs;
}
public int getRbis() {
return rbis;
}
public void setRbis(int rbis) {
this.rbis = rbis;
}
public int getAtBats() {
return atBats;
}
public void setAtBats(int atBats) {
this.atBats = atBats;
}
}
所有的类都完成了映射。最后需要做的就是编辑 persistence.xml。这是 Java Persistence API 的键元数据类并包含连接信息。
清单 9. persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
org.developerworks.baseball.Game
org.developerworks.baseball.Player
"openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/baseball"/>
Eclipse 应当已经为您把类放到此文件中。您只需放入数据库的连接信息。 现在已经使用 Eclipse 设置了 Java Persistence API 以进行数据访问,接下 来可以为这些数据创建 UI。
?
Eclipse 和 Web 页面
在此部分中,将为要访问的数据创建 UI,把 JSP Model 2 架构用于我们的 应用程序。首先创建用于处理业务逻辑的 servlet,然后将其转发给用于呈现输 出的 JSP。
创建 servlet
使用 Eclipse 创建 servlet。返回到 Java EE 透视图,右键单击 baseball 项目并选择 New > Servlet。
图 44. 新建 servlet
此操作将打开 Create Servlet 对话框。填写 servlet 的 Java package 和 Class name 并单击 Next。
图 45. 创建 servlet
在这里无需进行任何编辑操作,但是请注意指向 servlet 的 URL 映射。这 是访问 servlet 所需的相关 URL。Eclipse 将自动为我们在 web.xml 文件中设 置此 servlet 映射。根本不需要改动该文件。记住此映射并单击 Finish。
图 46. Servlet 信息
?
在 Servlet 类中,使用 Java Persistence API 来获得所有球员的列表并将 此列表转发给 JSP。该 servlet 的代码如清单 10 所示:
清单 10. PlayerServlet 代码
package org.developerworks.baseball.web;
import java.io.IOException;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.developerworks.baseball.Player;
/**
* Servlet implementation class for Servlet: PlayersServlet
*
*/
public class PlayersServlet extends javax.servlet.http.HttpServlet
implements javax.servlet.Servlet {
static final long serialVersionUID = 1L;
private EntityManagerFactory factory;
private EntityManager em;
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#HttpServlet()
*/
public PlayersServlet() {
super();
factory = Persistence.createEntityManagerFactory ("baseball");
em = factory.createEntityManager();
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doGet (HttpServletRequest request,
HttpServletResponse response)
*/
@SuppressWarnings("unchecked")
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
List players =
em.createQuery("select p from Player p").getResultList ();
request.setAttribute("players", players);
request.getRequestDispatcher("/players.jsp").forward (request, response);
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doPost (HttpServletRequest request,
HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
|-------10--------20--------30--------40--------50--------60-------- 70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
this.doGet(request, response);
}
}
注意,在 servlet 的构造函数中,使用 Java Persistence API 创建引用 “baseball” 持久单元的 EntityManager 实例。此持久单元来自 persistence.xml,如清单 9 所示:
创建视图的 JSP
用 Eclipse 创建 JSP 十分轻松。只需右键单击 baseball 项目并选择 New > JSP。
图 47. 新建 JSP
?
首先只需列出棒球球员。该列表的代码如清单 11 所示:
清单 11. players.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
"http://www.w3.org/TR/html4/loose.dtd">
Baseball Players
?
用 Eclipse 进行部署
我们创建了一个基本应用程序,且已经准备好测试。此时可以想到可能要用 Ant 或诸如 Perl 或 Groovy 之类的脚本语言编写部署脚本。您可以那样做 — — Eclipse 可以很好地支持 Ant 和 Maven —— 但是有一种更轻松的方法。
从 Eclipse 运行
要从 Eclipse 部署应用程序,只需右键单击 baseball 项目并选择 Run As > Run On Server。
图 48. 在服务器上运行应用程序
Eclipse 将询问需要部署到哪台服务器。只需选择先前创建的 Tomcat 实例 并单击 Finish。
图 49. 选择服务器
?
此操作将打开 Servers 窗口并显示 baseball 应用程序已经发布到 Tomcat 中。
图 50. 发布到 Tomcat 中的 Baseball 应用程序
现在可以在 Web 浏览器中键入 http://localhost:9762/baseball/PlayersServlet 打开应用程序,并且将显示 先前创建的样例数据。
图 51. Baseball 应用程序
此列表应当与先前创建的样例数据完全相同。如果得到任何错误,则可能需 要确保连接属性都正确并且所有相应的 JAR 均已被复制到 /WEB-INF/lib 目录 中。例如,OpenJPA JAR(及依赖性)是必需的,并且 JDBC 驱动程序 JAR 应当 在该目录中。我们使用了一些 JSTL,因此也需要 JSTL JAR。记住,使用 Eclipse 也可以轻松地进行调试。
用 Eclipse 进行调试
让我们返回到应用程序并执行一些调试。Eclipse 的调试功能是其主要功能 之一,而且这种能够调试在 Web 服务器运行的活动代码的功能非常重要。返回 到 servlet 类并在使用 Java Persistence API 查询数据库的位置设置一个断 点。
图 52. 设置断点
现在在 Server 窗口中右键单击我们使用的服务器并选择 Stop 来停止服务 器。将重新启动服务器,但是这次选择 Debug。
图 53. 调试服务器
现在可以重新装载 Web 页面,而 Eclipse 应当切换到 Debug 透视图。
图 54. Eclipse Debug 透视图
从调试透视图中,您可以逐步完成代码、设置监视方式等。无需对服务器执 行任何特殊操作。我们可以像调试 Java 主方法的可执行类一样调试 Web 应用 程序。
结束语
我们已经看到如何使用 Eclipse 设置 Web开发所需的一切内容。Eclipse 集成了数据库、Web 服务器以及所需的其他内容;拥有可以帮助您快速利用 Java EE 技术集的许多工具。我们使用 Eclipse 连接到数据库以创建表并填充 数据,然后返回并利用相同的工具创建 Java Persistence API 映射以简化数据 访问代码。使用了 Eclipse 创建 JSP 和 servlet。然后可以部署 Web 应用程 序,并且甚至直接从 Eclipse 进行调试。现在,我们可以添加更多用于创建球 员和比赛及计算统计信息的 Web 页面,详见共分三部分的系列教程 “用 Eclipse Europa 进行 Web 开发” 的第 2 部分。
文章来源:
http://www.ibm.com/developerworks/cn/edu/os-dw-os-eclipse- europa1.html