Java 中 XML 数据读写与 Servlet 开发
1. XML 数据读写基础
1.1 ReadLibrary 应用读取 XML 文件
ReadLibrary 应用可读取使用特定库书方言的 XML 文件。若要使用该应用读取
collection.librml
文件,可在命令行输入:
java ReadLibrary collection.librml
程序将显示如下输出:
Title: Catch-22
Author: Joseph Heller
Publisher: Simon and Schuster
Publication Date: 09/1996
Edition: Trade
ISBN: 0684833395
Review: heller-catch22.html
Title: Slaughterhouse-Five
Author: Kurt Vonnegut
Publisher: Dell
Publication Date: 12/1991
Edition: Paperback
ISBN: 0440180295
Review: null
1.2 XML 与 Java 的关系及优势
在很多方面,可扩展标记语言(XML)在数据层面与 Java 语言相当。它能将数据从创建它的软件及其运行的操作系统中解放出来,就像 Java 能使软件摆脱特定操作系统的束缚一样。
使用 XML 表示数据有诸多优势,其中最大的优势之一是总能获取到这些数据。若要将数据迁移到关系型数据库、MySQL 数据库或其他形式,都能轻松检索信息。此外,还可通过多种技术(包括 Java 及其他语言开发的工具)将 XML 转换为其他形式,如 HTML。
1.3 XML 相关问答
| 问题 | 答案 |
|---|---|
| 为什么可扩展标记语言叫 XML 而非 EML? | 语言的创始人似乎都未记录选择 XML 作为缩写的原因。XML 社区普遍认为,选择它是因为它比 EML “听起来更酷”。另外,也有可能是为避免与早于可扩展标记语言的名为 EML(扩展机器语言)的编程语言混淆。 |
| 使用 Java API for XML Processing 处理 XML 相当复杂,在 Java 中有没有更简单的方法从 XML 文件读取数据? | 有几个类库旨在简化 Java 中的 XML 处理。例如 JDOM,它是一个开源库,通过处理 Java 对象而非 XML 解析方法来读取、写入和操作 XML,更多信息可访问项目网站 http://www.jdom.org。另一个开源替代方案是 XOM,该项目仍处于早期版本,它是因认为 JDOM 存在不足而创建的,更多信息可访问 XOM 网站 http://www.cafeconleche.org/XOM/。 |
1.4 相关问题及答案
| 问题 | 选项 | 答案 |
|---|---|---|
| 当文档中所有起始元素标签、结束元素标签和其他标记都一致应用时,用哪个形容词描述该文档? |
a. Validating
b. Parsable c. Well-formed | c. 为使数据被视为 XML,它必须格式良好。 |
javax.xml.parsers
包中哪个类用于创建 SAX 解析器?
|
a. SAXParserFactory
b. SAXParser c. DefaultHandler |
a.
SAXParserFactory
类用于根据你的规范创建 SAX 解析器。
|
| 以下哪个是 XML 中可接受的结束元素标签? |
a.
b. c. |
a. 每个结束元素标签必须是由
</
和
>
包围的名称。选项 b
<Category/>
可作为不包含任何数据的元素标签。
|
1.5 认证练习
考虑以下代码:
public class BadClass {
String field[] = new String[10];
int i = 0;
public BadClass() {
for ( ; i < 10; i++)
field[i] = packField(i);
}
private String packField(int i) {
StringBuffer spaces = new StringBuffer();
for (int j = 0; j < i; j++) {
spaces.append(' ');
}
return spaces;
}
}
该程序中哪一行会导致其无法成功编译?
a.
String field[] = new String[10];
b.
for ( ; i < 10; i++)
c.
StringBuffer spaces = new StringBuffer();
d.
return spaces;
答案可在相关网站查询,访问对应页面并点击认证练习链接。
1.6 练习
- 创建一个 XML 文件,用于保存之前项目中的琐事问题和答案。
- 创建两个应用程序:一个从数据库中检索记录并生成包含相同信息的 XML 文件;另一个从该 XML 文件读取数据并显示。
2. Java Servlet 开发基础
2.1 Servlet 概述
随着 Java 的发展,它已超越了在网页上运行的小程序和在本地计算机上运行的应用程序。Servlet 是由连接到万维网的服务器运行的应用程序,是当今 Java 开发中最受欢迎的途径之一。
Servlet 在 Web 上使用 Java,且没有小程序那样严格的安全限制。Servlet 在服务器而非用户计算机上运行,因此可以使用该语言的所有功能。它用于创建 Web 应用程序,即收集信息并将其作为网页呈现的程序。
2.2 Web Servlet 的使用
2.2.1 Servlet 与 CGI 的比较
Java Servlet 由支持 Java Servlet 规范的 Web 服务器解释器运行,该解释器通常称为 Servlet 引擎,它经过优化,能以最少的 Web 服务器资源运行 Servlet。
Java Servlet 的作用与使用通用网关接口(CGI)实现的程序相同。CGI 是一种用于编写通过 Web 服务器发送和接收信息的软件的协议,大多数 CGI 程序(也称为 CGI 脚本)使用 Perl、Python、PHP 和 C 等语言编写。
Java Servlet 不仅能完成 CGI 程序的所有功能,还支持一些使用大多数 CGI 脚本语言极难实现的行为。例如,Servlet 提供对会话的全面支持,可跟踪 Web 用户在一段时间内浏览网站各部分、打开和关闭页面的情况。此外,只要服务器支持 Java Servlet,它就能通过标准接口与这些程序交换信息。
2.2.2 Servlet 的优势
Java Servlet 具有与 Java 语言本身相同的可移植性优势。除了 Sun 与 Apache Web 服务器设计者合作创建的官方实现外,其他服务器开发者也推出了支持 Java Servlet 的工具,如 IBM WebSphere Application Server、BEA WebLogic、Jetty 和 Microsoft Internet Information Server。
在内存使用方面,Servlet 也更高效。如果 10 个人同时使用同一个 CGI 脚本,Web 服务器将在内存中加载 10 个该脚本的副本;而如果 10 个人使用 Java Servlet,内存中仅加载一个 Servlet 副本,该 Servlet 会生成线程来处理每个用户。
2.3 支持 Servlet
Java Servlet 和 JavaServer Pages 由 Sun Microsystems 通过 Tomcat 提供支持,Tomcat 由 Sun Microsystems 和 Apache Software Foundation 开发,该基金会负责管理 Apache Web 服务器。
Tomcat 包含两个 Java 类库
javax.servlet
和
javax.servlet.http
,以及为 Apache Web 服务器添加 Servlet 功能的软件。还有一个独立的 Servlet 解释器,可在将 Servlet 部署到 Web 之前进行测试。
若要使用 Servlet,必须有支持这些程序的 Web 服务器。如果有 Apache Web 服务器且熟悉如何扩展其功能,可向服务器添加 Tomcat 支持。当前的 Web 服务器或 Web 应用程序服务器可能已包含对 Servlet 的支持。
若没有服务器但想开始开发 Servlet,有几家公司提供支持 Java Servlet 的商业 Web 托管服务。这些公司已安装并配置好 Tomcat 以与他们的服务器配合使用,你只需专注于使用
javax.servlet
和
javax.servlet.http
包中的类编写 Servlet。
2.4 开发 Servlet
2.4.1 安装和配置
要在计算机上编译 Servlet,必须安装
javax.servlet
和
javax.servlet.http
这两个 Java Servlet 包,它们不是 Java 2 版本 1.4 标准 Java 类库的一部分。截至编写本文时,这些包的最后一个完整版本是 Java Servlet 2.3,由 Tomcat 4.0 版本支持。
下载步骤如下:
1. 访问 Java Servlet 网站 http://java.sun.com/products/servlet/,点击“Download”链接(也可直接访问 http://java.sun.com/products/servlet/download.html,但 Sun 可能会不时移动其 Java 网站上的页面)。
2. 这些包以 ZIP 存档文件形式提供,需使用能提取 ZIP 文件的软件(如 Windows 系统上的 WinZip)打开。提取文件时,选择使用存档中现有文件夹名称的选项。
3. 下载的文件位于页面的 2.3 Final Release 部分,标题为“Download Class Files 2.3”旁边。
4. 版本 2.3 包含两个包中的所有类文件、类的 Javadoc 文档以及一个包含所有类的 jar 文件。这个 Java 存档名为
servlet.jar
,它将安装到
lib
子文件夹中,需将该文件添加到计算机的
CLASSPATH
中。
2.4.2 创建 Servlet
创建 Servlet 时,需创建
HttpServlet
类的子类,该类是
javax.servlet
包的一部分。这个类包含表示 Servlet 生命周期的方法以及从运行 Servlet 的 Web 服务器接收信息的方法。
以下是 Servlet 生命周期相关方法:
-
init(ServletConfig)
方法:当 Web 服务器首次启动 Servlet 以处理用户请求时自动调用。一个 Java Servlet 可以处理来自不同 Web 用户的多个请求,但
init()
方法仅在 Servlet 上线时调用一次。若 Servlet 已在线,再次收到使用该 Servlet 的请求时,
init()
方法不会再次调用。该方法有一个参数
ServletConfig
,它是
javax.servlet
包中的一个接口,包含用于了解 Servlet 运行环境的方法。
-
destroy()
方法:当 Web 服务器将 Servlet 下线时调用。与
init()
方法一样,它仅在所有用户完成从 Servlet 接收信息时调用一次。如果在指定时间内未完成,
destroy()
方法将自动调用,以防止 Servlet 在等待与用户交换信息时挂起。
2.4.3 处理表单数据
Servlet 的主要任务之一是从 Web 用户收集信息并作出响应。可以通过表单收集用户信息,表单是网页上的一组文本框、单选按钮、文本区域和其他输入字段。
Web 浏览器通过超文本传输协议(HTTP)与服务器通信,表单数据可通过两种 HTTP 请求发送到服务器:GET 和 POST。
- GET 请求:将表单上的所有数据附加到 URL 末尾,例如
http://www.java21pro.com/servlets/beep?number=5551220&repeat=no
。
- POST 请求:将表单数据作为单独发送的头信息包含在 URL 之外。通常首选 POST 请求,尤其是在表单收集机密信息时。此外,一些 Web 服务器和浏览器不支持超过 255 个字符的 URL,这限制了 GET 请求中可发送的信息量。
Java Servlet 通过从
HttpServlet
类继承的方法处理这两种请求:
doGet(HttpServletRequest, HttpServletResponse)
和
doPost(HttpServletRequest, HttpServletResponse)
。这些方法会抛出两种异常:
ServletException
(属于
javax.servlet
包)和
IOException
(标准
java.io
包中涉及输入和输出流的异常)。
在 Java Servlet 编程中,常用的技术是使用一个方法调用另一个方法,示例代码如下:
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
2.4.4 响应客户端
Servlet 通过调用
HttpServletResponse
类的方法向用户发送信息。准备响应时,首先要定义 Servlet 发送到浏览器的内容类型,可调用
setContentType(String)
方法,传入内容类型作为参数。最常见的响应形式是 HTML,可通过调用
setContentType("text/html")
设置。也可将响应作为文本(
"text/plain"
)、图形文件(
"image/gif"
、
"image/jpeg"
)和特定应用程序格式(如
"application/msword"
)发送。
要向浏览器发送数据,需创建与浏览器关联的 Servlet 输出流,然后调用该流的
println(String)
方法。Servlet 输出流由
ServletOutputStream
类表示,它是
javax.servlet
包的一部分。可通过调用
HttpServletResponse
类的
getOutputStream()
方法获取该流。示例代码如下:
ServletOutputStream out = response.getOutputStream();
out.println("<html>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
2.4.5 ROT-13 翻译 Servlet 示例
以下是一个接收 Web 表单文本、使用 ROT-13 进行翻译并在新 Web 表单中显示结果的 Servlet 示例:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Rot13 extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String text = req.getParameter("text");
String translation = translate(text);
res.setContentType("text/html");
ServletOutputStream out = res.getOutputStream();
out.println("<html>");
out.println("<body>");
out.println("<head><title>ROT-13 Translator</title></head>");
out.println("<h1>ROT-13 Translator</h1>");
out.println("<p>Text to translate:");
out.println("<form action=\"Rot13\" method=\"POST\">");
out.println("<textarea name=\"text\" ROWS=8 COLS=55>");
out.println(translation);
out.println("</textarea>");
out.println("<p><input type=\"submit\" value=\"translate\">");
out.println("</form>");
out.println("</body>");
out.println("</html>");
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doPost(req, res);
}
String translate(String input) {
StringBuffer output = new StringBuffer();
if (input != null) {
for (int i = 0; i < input.length(); i++) {
char inChar = input.charAt(i);
if ((inChar >= 'A') & (inChar <= 'Z')) {
inChar += 13;
if (inChar > 'Z')
inChar -= 26;
}
if ((inChar >= 'a') & (inChar <= 'z')) {
inChar += 13;
if (inChar > 'z')
inChar -= 26;
}
output.append(inChar);
}
}
return output.toString();
}
}
保存该 Servlet 后,使用 Java 编译器进行编译。要使 ROT-13 Servlet 可用,需将其类文件发布到 Web 服务器上为 Java Servlet 指定的文件夹中。在配备 Tomcat 的 Apache 服务器上,Servlet 通常放在主 Web 文件夹的
WEB-INF/classes
子文件夹中(例如,如果
/htdocs
是网站的根文件夹,Servlet 将位于
/htdocs/WEB-INF/classes
)。通过在 Web 浏览器的地址栏中输入其 URL(如
http://www.cadenhead.org/servlet/Rot13
)来运行 Servlet,需将 URL 的第一部分替换为自己 Web 服务器的名称或 IP 地址。
2.5 使用 Cookie
许多网站可根据用户信息进行定制,这得益于 Web 浏览器的 Cookie 功能。Cookie 是包含网站想记住的用户信息(如用户名、访问次数等)的小文件,这些文件存储在用户计算机上,网站只能读取自己创建的 Cookie。
由于隐私考虑,大多数 Web 浏览器可配置为拒绝所有 Cookie 或在允许网站创建 Cookie 之前请求许可,大多数浏览器的默认行为是接受所有 Cookie。
在 Servlet 中,可轻松创建和检索 Cookie。
javax.servlet.http
包中的
Cookie
类支持 Cookie。创建 Cookie 时,调用
Cookie(String, String)
构造函数,第一个参数是要给 Cookie 的名称,第二个参数是 Cookie 的值。例如,以下语句创建一个名为
visits
且初始值为 1 的 Cookie:
Cookie visitCookie = new Cookie("visits", "1");
创建 Cookie 时,需决定它在用户计算机上的有效时长。可调用 Cookie 的
setMaxAge(int)
方法设置 Cookie 的有效时间(以秒为单位)。若使用负值作为参数,Cookie 仅在用户 Web 浏览器打开时有效;若使用 0 作为值,Cookie 不会存储在用户计算机上,其目的是告诉 Web 浏览器删除已有的同名 Cookie。
要将 Cookie 发送到用户计算机,需调用
HttpServletResponse
对象的
addCookie(Cookie)
方法。当 Web 浏览器请求 URL 时,会检查是否有与该 URL 关联的 Cookie,若有,则将这些 Cookie 随请求一起发送。在 Servlet 中,可调用
HttpServletRequest
对象的
getCookies()
方法接收
Cookie
对象数组,然后调用每个 Cookie 的
getName()
和
getValue()
方法了解该 Cookie 信息并处理数据。
以下是一个允许用户选择 Servlet 显示页面背景颜色的 Servlet 示例:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SetColor extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String pageColor;
String colorParameter = req.getParameter("color");
if (colorParameter != null) {
Cookie colorCookie = new Cookie("color", colorParameter);
colorCookie.setMaxAge(31536000);
res.addCookie(colorCookie);
pageColor = colorParameter;
} else {
pageColor = retrieveColor(req.getCookies());
}
ServletOutputStream out = res.getOutputStream();
res.setContentType("text/html");
out.println("<html>");
out.println("<body bgcolor=\"" + pageColor + "\">");
out.println("<head><title>The U.S. Constitution</title></head>");
out.println("<h1>The U.S. Constitution</h1>");
displayFile("constitution.html", out);
out.println("<h5>Choose a new color</h5>");
out.println("<form action=\"SetColor\" method=\"POST\">");
out.println("<input type=\"text\" name=\"color\" value=\"" +
pageColor + "\" SIZE=40>");
out.println("<p><input type=\"submit\" value=\"Change Color\">");
out.println("</form>");
out.println("</body>");
out.println("</html>");
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
doPost(req, res);
}
String retrieveColor(Cookie[] cookies) {
String inColor = "#FFFFFF";
for (int i = 0; i < cookies.length; i++) {
String cookieName = cookies[i].getName();
if (cookieName.equals("color")) {
inColor = cookies[i].getValue();
}
}
return inColor;
}
void displayFile(String pageName, ServletOutputStream out) {
try {
ServletContext servletContext = getServletContext();
String filename = servletContext.getRealPath(pageName);
FileReader file = new FileReader(filename);
BufferedReader buff = new BufferedReader(file);
boolean eof = false;
while (!eof) {
String line = buff.readLine();
if (line == null)
eof = true;
else
out.println(line);
}
buff.close();
} catch (IOException e) {
log("Error -- " + e.toString());
}
}
}
该
SetColor
Servlet 显示 HTML 文件的内容,示例中使用的是
constitution.html
(美国宪法的 HTML 格式副本),可从相关网站下载该文件。编译该 Servlet 并将其放在 Web 服务器的 Servlet 文件夹中后,通过在浏览器中加载其 URL(如
http://www.cadenhead.org/servlet/SetColor
)来运行它。
2.6 Servlet 的部署与运行流程
为了更清晰地了解 Servlet 的部署和运行过程,下面给出一个 mermaid 格式的流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B(安装 Tomcat 及相关包):::process
B --> C(配置 CLASSPATH):::process
C --> D(编写 Servlet 代码):::process
D --> E(编译 Servlet):::process
E --> F{部署到服务器}:::decision
F -->|是| G(指定 Servlet 文件夹):::process
F -->|否| D
G --> H(运行 Servlet):::process
H --> I(用户通过浏览器访问):::process
I --> J(服务器处理请求):::process
J --> K(执行 Servlet 逻辑):::process
K --> L(返回响应给用户):::process
L --> M([结束]):::startend
这个流程图展示了从开始准备环境到最终用户访问 Servlet 的完整过程。下面对每个步骤进行详细说明:
1.
安装 Tomcat 及相关包
:按照前面提到的步骤,从 Java Servlet 网站下载 Java Servlet 2.3 版本的 ZIP 存档文件,并使用解压软件打开,将
servlet.jar
文件安装到
lib
子文件夹。
2.
配置 CLASSPATH
:将
servlet.jar
文件添加到计算机的
CLASSPATH
中,确保 Java 编译器能够找到所需的类文件。
3.
编写 Servlet 代码
:创建
HttpServlet
类的子类,实现
init()
、
destroy()
、
doGet()
和
doPost()
等方法,处理用户请求和响应。
4.
编译 Servlet
:使用 Java 编译器对编写好的 Servlet 代码进行编译。
5.
部署到服务器
:将编译后的 Servlet 类文件发布到 Web 服务器上为 Java Servlet 指定的文件夹中,如在配备 Tomcat 的 Apache 服务器上,通常是主 Web 文件夹的
WEB-INF/classes
子文件夹。
6.
运行 Servlet
:用户通过在 Web 浏览器的地址栏中输入 Servlet 的 URL 来访问 Servlet。
7.
服务器处理请求
:Web 服务器接收到用户请求后,将其转发给相应的 Servlet 进行处理。
8.
执行 Servlet 逻辑
:Servlet 根据请求类型(GET 或 POST)调用相应的方法,处理用户输入的数据,并生成响应。
9.
返回响应给用户
:Servlet 将生成的响应发送回 Web 服务器,再由服务器返回给用户的浏览器进行显示。
2.7 Servlet 开发的注意事项
在进行 Servlet 开发时,有一些注意事项需要牢记:
-
HTML 基础
:由于 Servlet 的用户界面是通过 Web 页面实现的,因此需要对 HTML 有基本的了解。可以参考相关书籍学习 HTML 知识。
-
异常处理
:
doGet()
和
doPost()
方法会抛出
ServletException
和
IOException
异常,需要在代码中进行适当的处理,以确保程序的健壮性。
-
Cookie 管理
:在使用 Cookie 时,要注意 Cookie 的有效期设置和隐私问题。同时,要确保在处理 Cookie 时进行必要的验证和错误处理。
-
资源管理
:在使用文件、数据库连接等资源时,要及时关闭和释放资源,避免资源泄漏。
2.8 总结
本文详细介绍了 Java 中 XML 数据读写和 Servlet 开发的相关知识。在 XML 数据读写方面,我们了解了如何使用 ReadLibrary 应用读取 XML 文件,以及 XML 与 Java 的关系和优势。同时,通过问答和练习加深了对 XML 相关概念的理解。
在 Servlet 开发方面,我们学习了 Servlet 的基本概念、与 CGI 的比较、支持 Servlet 的环境以及开发和部署 Servlet 的详细步骤。通过 ROT-13 翻译 Servlet 和 SetColor Servlet 两个示例,展示了如何处理表单数据、响应客户端和使用 Cookie。
通过掌握这些知识和技能,你可以开发出功能强大的 Web 应用程序,实现数据的读写和交互。希望本文对你的 Java 开发之旅有所帮助,祝你在开发过程中取得成功!
2.9 常见问题解答
| 问题 | 解答 |
|---|---|
| Servlet 与 CGI 相比,有哪些性能优势? | Servlet 在内存使用上更高效,多个用户访问同一个 Servlet 时,内存中仅加载一个 Servlet 副本,通过生成线程处理每个用户请求;而 CGI 每个用户请求都会加载一个新的脚本副本。 |
| 如何处理 Servlet 中的中文乱码问题? |
可以在
doGet()
和
doPost()
方法中设置请求和响应的字符编码,例如
request.setCharacterEncoding("UTF-8");
和
response.setCharacterEncoding("UTF-8");
。
|
Servlet 的
init()
方法和
destroy()
方法在什么情况下会被调用?
|
init()
方法在 Servlet 首次上线处理用户请求时调用,且仅调用一次;
destroy()
方法在所有用户完成从 Servlet 接收信息,服务器将 Servlet 下线时调用,若在指定时间内未完成,也会自动调用。
|
| Cookie 的有效期如何设置? |
可以调用 Cookie 的
setMaxAge(int)
方法设置有效期,以秒为单位。负值表示仅在浏览器打开时有效,0 表示删除已有的同名 Cookie。
|
超级会员免费看
1241

被折叠的 条评论
为什么被折叠?



