JSP XML 数据处理学习笔记
1. 概述
JSP(Java Server Pages)是一种基于Java语言开发的服务器端Web开发技术,而XML(Extensible Markup Language)则是一种用于存储和传输数据的标记语言。在JSP开发中,我们经常需要使用XML来处理数据,因此学习XML对于JSP开发至关重要。
2. XML基础知识
2.1 XML简介
XML是一种可扩展标记语言,它与HTML类似,但XML更为通用。XML具有以下特点:
- 纯文本格式;
- 具有自我描述性;
- 可扩展性;
- 简单性。
2.2 XML文档结构
XML文档由以下三部分组成:
- XML声明:声明文档使用的XML版本和编码方式;
- DOCTYPE声明:规定了文档类型定义(DTD),也可以指向外部DTD文件;
- XML元素:文档的主体部分,由标签、属性和内容组成。
下面是一个XML文档的例子:
xmlCopy Code<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>John</to>
<from>Doe</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
2.3 XML解析方式
在JSP开发中,我们经常需要将XML数据解析为Java对象。XML解析方式有以下两种:
- DOM(Document Object Model):将整个XML文档加载到内存中,形成一个树形结构,便于遍历和操作;
- SAX(Simple API for XML):基于事件驱动的解析方式,逐行解析XML文档,适用于文件较大或性能要求较高的场景。
3. JSP中使用XML
3.1 JSP中解析XML
在JSP中,我们可以使用Java提供的DOM或SAX等API进行XML解析。下面是一个使用DOM解析XML的例子:
jspCopy Code<%@ page import="java.io.*, javax.xml.parsers.*, org.w3c.dom.*" %>
<%
// 加载XML文档
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("books.xml"));
// 获取根节点
Element root = doc.getDocumentElement();
// 遍历子节点
NodeList books = root.getElementsByTagName("book");
for (int i = 0; i < books.getLength(); i++) {
Element book = (Element) books.item(i);
String title = book.getElementsByTagName("title").item(0).getTextContent();
String author = book.getElementsByTagName("author").item(0).getTextContent();
out.println("书名:" + title + ",作者:" + author);
}
%>
3.2 JSP中生成XML
在JSP中,我们也可以通过Java的DOM或SAX等API生成XML文档。下面是一个使用DOM生成XML的例子:
jspCopy Code<%@ page import="java.io.*, javax.xml.parsers.*, org.w3c.dom.*" %>
<%
// 创建XML文档
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
// 创建根节点
Element root = doc.createElement("books");
doc.appendChild(root);
// 创建子节点
Element book = doc.createElement("book");
root.appendChild(book);
Element title = doc.createElement("title");
title.setTextContent("Java入门教程");
book.appendChild(title);
Element author = doc.createElement("author");
author.setTextContent("张三");
book.appendChild(author);
// 将XML文档输出到文件
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
String xml = writer.getBuffer().toString();
out.println(xml);
%>
4. 实例
下面是一个使用JSP和XML实现图书管理系统的例子,主要包括以下功能:
- 添加图书;
- 删除图书;
- 修改图书信息;
- 查询图书列表。
4.1 XML数据格式
我们使用以下XML格式来存储图书信息:
xmlCopy Code<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1">
<title>Java入门教程</title>
<author>张三</author>
<price>29.99</price>
</book>
<book id="2">
<title>Web开发实战</title>
<author>李四</author>
<price>39.99</price>
</book>
...
</books>
4.2 JSP页面设计
我们使用以下JSP页面来实现图书管理系统:
htmlCopy Code<%@ page import="java.io.*, javax.xml.parsers.*, org.w3c.dom.*, java.util.UUID" %>
<%
// 定义XML文件路径和文档对象
String xmlPath = application.getRealPath("/") + "WEB-INF/books.xml";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File(xmlPath));
// 获取操作参数
String action = request.getParameter("action");
String id = request.getParameter("id");
String title = request.getParameter("title");
String author = request.getParameter("author");
String price = request.getParameter("price");
// 添加图书
if ("add".equals(action)) {
Element book = doc.createElement("book");
book.setAttribute("id", UUID.randomUUID().toString());
Element t = doc.createElement("title");
t.setTextContent(title);
book.appendChild(t);
Element a = doc.createElement("author");
a.setTextContent(author);
book.appendChild(a);
Element p = doc.createElement("price");
p.setTextContent(price);
book.appendChild(p);
Element root = doc.getDocumentElement();
root.appendChild(book);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
String xml = writer.getBuffer().toString();
FileWriter fw = new FileWriter(xmlPath);
fw.write(xml);
fw.close();
response.sendRedirect("books.jsp");
}
// 删除图书
else if ("delete".equals(action)) {
NodeList books = doc.getElementsByTagName("book");
for (int i = 0; i < books.getLength(); i++) {
Element book = (Element) books.item(i);
if (id.equals(book.getAttribute("id"))) {
book.getParentNode().removeChild(book);
break;
}
}
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
String xml = writer.getBuffer().toString();
FileWriter fw = new FileWriter(xmlPath);
fw.write(xml);
fw.close();
response.sendRedirect("books.jsp");
}
// 修改图书信息
else if ("update".equals(action)) {
NodeList books = doc.getElementsByTagName("book");
for (int i = 0; i < books.getLength(); i++) {
Element book = (Element) books.item(i);
if (id.equals(book.getAttribute("id"))) {
book.getElementsByTagName("title").item(0).setTextContent(title);
book.getElementsByTagName("author").item(0).setTextContent(author);
book.getElementsByTagName("price").item(0).setTextContent(price);
break;
}
}
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
String xml = writer.getBuffer().toString();
FileWriter fw = new FileWriter(xmlPath);
fw.write(xml);
fw.close();
response.sendRedirect("books.jsp");
}
%>
<!-- 添加图书 -->
<form method="post" action="books.jsp">
<input type="hidden" name="action" value="add">
书名:<input type="text" name="title"><br>
作者:<input type="text" name="author"><br>
价格:<input type="text" name="price"><br>
<input type="submit" value="提交">
</form>
<!-- 图书列表 -->
<table border="1">
<tr>
<th>编号</th>
<th>书名</th>
<th>作者</th>
<th>价格</th>
<th>操作</th>
</tr>
<%
NodeList books = doc.getElementsByTagName("book");
for (int i = 0; i < books.getLength(); i++) {
Element book = (Element) books.item(i);
String bid = book.getAttribute("id");
String btitle = book.getElementsByTagName("title").item(0).getTextContent();
String bauthor = book.getElementsByTagName("author").item(0).getTextContent();
String bprice = book.getElementsByTagName("price").item(0).getTextContent();
%>
<tr>
<td><%= bid %></td>
<td><%= btitle %></td>
<td><%= bauthor %></td>
<td><%= bprice %></td>
<td>
<a href="books.jsp?action=delete&id=<%= bid %>">删除</a>
<a href="book_edit.jsp?id=<%= bid %>">修改</a>
</td>
</tr>
<% } %>
</table>
5. 总结
JSP中使用XML处理数据是一种非常重要的技术,本文介绍了XML的基础知识、JSP中解析和生成XML的方法以及一个实例,希望对JSP开发者有所帮助。