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开发者有所帮助。