java schema 增删改查

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class DomParser {
	private static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
	private static String W3C_XML_SCHEMA = "http://www.w3c.org/2001/XMLSchema";
	private static String W3C_APACHE = "http://apache.org/xml/features/validation/schema";
	File xmlFile = new File("xml/dest.xml");  //源文件
	DocumentBuilderFactory xmlfactory = null;
	DocumentBuilder builder = null;
	Document document = null;
	Element root = null;

	public DomParser() throws ParserConfigurationException, SAXException,
			IOException {
		xmlfactory = DocumentBuilderFactory.newInstance();
		xmlfactory.setValidating(true);
		xmlfactory.setNamespaceAware(true);
		xmlfactory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
		xmlfactory.setFeature(W3C_APACHE, true);
		xmlfactory.setIgnoringElementContentWhitespace(true);
		builder = xmlfactory.newDocumentBuilder();
		builder.setErrorHandler(new MyXmlErrorHandler());
		builder = xmlfactory.newDocumentBuilder();
		document = builder.parse(xmlFile);
		root = document.getDocumentElement();
		removeWhilespace(root);
	}

	/**
	 * @param express 节点路径
	 * @param source 根节点
	 * @return 返回指定节点
	 */
	private Node selectSingleNode(String expression, Object source) {
		XPathFactory xPathFactory = XPathFactory.newInstance();
		XPath xPath = xPathFactory.newXPath();
		Node result = null;
		try {
			result = (Node) xPath.evaluate(expression, source,
					XPathConstants.NODE);
		} catch (XPathExpressionException e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * @param express 节点路径
	 * @param source 根节点
	 * @return 返回指定节点下的所有结果集
	 */
	public static NodeList selectNodes(String express, Object source) {
		NodeList result = null;
		XPathFactory xpathFactory = XPathFactory.newInstance();
		XPath xpath = xpathFactory.newXPath();
		try {
			result = (NodeList) xpath.evaluate(express, source,
					XPathConstants.NODESET);
		} catch (XPathExpressionException e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 将修改或增加过记录的xml写入源文件
	 * @param node 已经被改变的根节点
	 */
	private void xml2File(Node node) {
		TransformerFactory tFactory = TransformerFactory.newInstance();
		try {
			Transformer transformar = tFactory.newTransformer();
			File file = new File("xml/dest.xml"); //目标文件
			file.createNewFile();
			Source source = new DOMSource(node);
			FileOutputStream out = new FileOutputStream(file);
			transformar.transform(source, new StreamResult(out));
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 根据.xsd文件校验参数类型是否合法
	 * @param node 根节点参数
	 */
	private void validate(Node node) {
		SchemaFactory schemaFactory = SchemaFactory
				.newInstance("http://www.w3.org/2001/XMLSchema");
		File xsdFile = new File("xml/students.xsd"); //校验文件
		try {
			Schema schema = schemaFactory.newSchema(xsdFile);
			Validator validator = schema.newValidator();
			Source source = new DOMSource(node);
			Result result = new DOMResult();
			validator.validate(source, result);
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private int removeWhilespace(Element element) {
		int count = 0;
		NodeList children = element.getChildNodes();
		if (children.getLength() <= 1) {
			return 0;
		} else {
			for (int i = children.getLength() - 1; i >= 0; i--) {
				Node child = children.item(i);
				if (child instanceof Text
						&& ((Text) child).getData().trim().length() == 0) {
					element.removeChild(child);
					count++;
				} else if (child instanceof Element) {
					count += removeWhilespace((Element) child);
				}
			}
		}
		return count;
	}

	public static void output(Node node) {
		TransformerFactory transFactory = TransformerFactory.newInstance();
		try {
			Transformer transformer = transFactory.newTransformer();
			transformer.setOutputProperty("indent", "yes");

			DOMSource source = new DOMSource();
			source.setNode(node);
			StreamResult result = new StreamResult();
			result.setOutputStream(System.out);

			transformer.transform(source, result);
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 查询所有记录
	 */
	public void traceDomTree() {
		NodeList children = root.getChildNodes();
		for (int i = 0; i < children.getLength(); i++) {
			System.out.println("第"+(i+1)+"条记录:");
			Element child = (Element) children.item(i);
			Element element = (Element) child.getFirstChild();
			while (element.getNextSibling() != null) {
				System.out.println(element.getTextContent());
				element = (Element) element.getNextSibling();
			}
			System.out.println(element.getTextContent());
		}
	}

	/**
	 * 插入一条记录
	 */
	public void insertOneNode() {
		Element theStudent = document.createElement("STUDENT");
		theStudent.setAttribute("STUDENT_ID", "11111");

		Element theElement = document.createElement("PASSWORD");
		theElement.setTextContent("1234567");
		theStudent.appendChild(theElement);

		theElement = document.createElement("FIRST_NAME");
		theElement.setTextContent("双江");
		theStudent.appendChild(theElement);

		theElement = document.createElement("LAST_NAME");
		theElement.setTextContent("李");
		theStudent.appendChild(theElement);

		theElement = document.createElement("MAJOR_NUMBER");
		theElement.setTextContent("14");
		theStudent.appendChild(theElement);

		root.appendChild(theStudent);
		validate(root);
		xml2File(root);
	}

	/**
	 * 删除一条记录
	 */
	public void deleteOneNode(int studentId) {
		Element theStudent = (Element) selectSingleNode(
				"/STUDENTS/STUDENT[@STUDENT_ID='"+studentId+"']", root);
		Node root = theStudent.getParentNode();
		root.removeChild(theStudent);
		validate(root);
		xml2File(root);
	}

	/**
	 * 更新一条记录
	 */
	public void updateOneNode() {
		Element theStudent = (Element) selectSingleNode(
				"/STUDENTS/STUDENT[FIRST_NAME='Miao']", root);
		theStudent.getElementsByTagName("MAJOR_NUMBER").item(0).setTextContent(
				"44");
		validate(root);
		xml2File(root);
	}
	
	public static void main(String[] args) throws ParserConfigurationException,
			SAXException, IOException {
		DomParser parser = new DomParser();
		parser.updateOneNode();
		parser.traceDomTree();
	}
}

import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class MyXmlErrorHandler implements ErrorHandler {

	@Override
	public void error(SAXParseException exception) throws SAXException {
		exception.printStackTrace();
	}

	@Override
	public void fatalError(SAXParseException exception) throws SAXException {
		exception.printStackTrace();
	}

	@Override
	public void warning(SAXParseException exception) throws SAXException {
		exception.printStackTrace();
	}
}



dest.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>  
<STUDENTS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:noNamespaceSchemaLocation="students.xsd">  
    <STUDENT STUDENT_ID="1">  
        <PASSWORD>19841230</PASSWORD>  
        <FIRST_NAME>建斌</FIRST_NAME>  
        <LAST_NAME>成</LAST_NAME>  
        <MAJOR_NUMBER>7</MAJOR_NUMBER>  
    </STUDENT>  
    <STUDENT STUDENT_ID="2">  
        <PASSWORD>19841230</PASSWORD>  
        <FIRST_NAME>Miao</FIRST_NAME>  
        <LAST_NAME>Wu</LAST_NAME>  
        <MAJOR_NUMBER>7</MAJOR_NUMBER>  
    </STUDENT>  
    <STUDENT STUDENT_ID="3">  
        <PASSWORD>19841230</PASSWORD>  
        <FIRST_NAME>Juntai</FIRST_NAME>  
        <LAST_NAME>Wang</LAST_NAME>  
        <MAJOR_NUMBER>7</MAJOR_NUMBER>  
    </STUDENT>  
</STUDENTS>



students.xml格式文件如下:
<?xml version="1.0" encoding="UTF-8"?>  
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"  
    elementFormDefault="qualified">  
    <xs:element name="STUDENTS" type="students-type" />  
    <xs:complexType name="students-type">  
        <xs:sequence maxOccurs="unbounded">  
            <xs:element name="STUDENT" type="student-type" />  
        </xs:sequence>  
    </xs:complexType>  
    <xs:complexType name="student-type">  
        <xs:sequence>  
            <xs:element name="PASSWORD" type="xs:string" />  
            <xs:element name="FIRST_NAME" type="xs:string" />  
            <xs:element name="LAST_NAME" type="xs:string" />  
            <xs:element name="MAJOR_NUMBER" type="xs:integer" />  
            <xs:any minOccurs="0" />  
        </xs:sequence>  
        <xs:attribute name="STUDENT_ID" type="xs:integer" use="required"/>  
    </xs:complexType>  
</xs:schema>



转载于:https://my.oschina.net/u/1413786/blog/180579

这里提供一个基于 JSP 和 Servlet 的增删改查(CRUD)示例。 先建立一个数据库表,例如名为 `student`,包含字段 `id`、`name` 和 `age`。 在 `WEB-INF` 目录下新建 `lib` 目录,并将 MySQL 驱动程序(`mysql-connector-java-x.x.xx.jar`)放入其中。 在 `WEB-INF` 目录下新建 `classes` 目录,在其中创建一个名为 `StudentBean` 的 JavaBean 类,用于封装学生信息: ```java public class StudentBean { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } ``` 在 `WEB-INF` 目录下新建 `web.xml` 文件,配置 Servlet 和 JSP: ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>StudentServlet</servlet-name> <servlet-class>com.example.StudentServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>StudentServlet</servlet-name> <url-pattern>/student/*</url-pattern> </servlet-mapping> </web-app> ``` 在 `WEB-INF` 目录下新建 `student.jsp` 文件,用于展示学生列表和表单: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.List" %> <%@ page import="com.example.StudentBean" %> <%@ page import="com.example.StudentDAO" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>学生信息管理</title> </head> <body> <h1>学生信息管理</h1> <table border="1"> <tr> <th>ID</th> <th>姓名</th> <th>年龄</th> <th>操作</th> </tr> <% List<StudentBean> students = StudentDAO.getAllStudents(); for (StudentBean student : students) { %> <tr> <td><%= student.getId() %></td> <td><%= student.getName() %></td> <td><%= student.getAge() %></td> <td> <form method="post" action="student"> <input type="hidden" name="_method" value="DELETE"> <input type="hidden" name="id" value="<%= student.getId() %>"> <input type="submit" value="删除"> </form> <form method="get" action="student/<%= student.getId() %>"> <input type="submit" value="编辑"> </form> </td> </tr> <% } %> </table> <h2>添加学生</h2> <form method="post" action="student"> <input type="hidden" name="_method" value="POST"> 姓名:<input type="text" name="name"><br> 年龄:<input type="text" name="age"><br> <input type="submit" value="添加"> </form> </body> </html> ``` 其中,使用 `<% %>` 包裹的代码块中,通过 `StudentDAO` 类获取所有学生信息,并展示在表格中。每一行中,通过两个表单按钮分别进行删除和编辑操作。 在 `src` 目录下新建 `StudentDAO` 类,用于访问数据库: ```java import java.sql.*; import java.util.ArrayList; import java.util.List; public class StudentDAO { private static final String URL = "jdbc:mysql://localhost:3306/test"; private static final String USER = "root"; private static final String PASSWORD = "password"; public static List<StudentBean> getAllStudents() { List<StudentBean> students = new ArrayList<>(); try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM student"); while (rs.next()) { StudentBean student = new StudentBean(); student.setId(rs.getInt("id")); student.setName(rs.getString("name")); student.setAge(rs.getInt("age")); students.add(student); } rs.close(); stmt.close(); conn.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } return students; } public static void addStudent(StudentBean student) { try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO student (name, age) VALUES (?, ?)"); pstmt.setString(1, student.getName()); pstmt.setInt(2, student.getAge()); pstmt.executeUpdate(); pstmt.close(); conn.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } public static void deleteStudent(int id) { try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement pstmt = conn.prepareStatement("DELETE FROM student WHERE id = ?"); pstmt.setInt(1, id); pstmt.executeUpdate(); pstmt.close(); conn.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } public static StudentBean getStudent(int id) { StudentBean student = null; try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM student WHERE id = ?"); pstmt.setInt(1, id); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { student = new StudentBean(); student.setId(rs.getInt("id")); student.setName(rs.getString("name")); student.setAge(rs.getInt("age")); } rs.close(); pstmt.close(); conn.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } return student; } public static void updateStudent(StudentBean student) { try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement pstmt = conn.prepareStatement("UPDATE student SET name = ?, age = ? WHERE id = ?"); pstmt.setString(1, student.getName()); pstmt.setInt(2, student.getAge()); pstmt.setInt(3, student.getId()); pstmt.executeUpdate(); pstmt.close(); conn.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } } ``` 其中,`getAllStudents` 方法用于获取所有学生信息,`addStudent` 方法用于添加学生,`deleteStudent` 方法用于删除学生,`getStudent` 方法用于获取指定 ID 的学生信息,`updateStudent` 方法用于更新学生信息。 在 `src` 目录下新建 `StudentServlet` 类,用于处理 HTTP 请求: ```java import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/student/*") public class StudentServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String pathInfo = request.getPathInfo(); if (pathInfo == null || pathInfo.equals("/")) { request.getRequestDispatcher("/WEB-INF/student.jsp").forward(request, response); } else { int id = Integer.parseInt(pathInfo.substring(1)); StudentBean student = StudentDAO.getStudent(id); if (student == null) { response.sendError(HttpServletResponse.SC_NOT_FOUND); } else { request.setAttribute("student", student); request.getRequestDispatcher("/WEB-INF/student_edit.jsp").forward(request, response); } } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String method = request.getParameter("_method"); if (method == null) { StudentBean student = new StudentBean(); student.setName(request.getParameter("name")); student.setAge(Integer.parseInt(request.getParameter("age"))); StudentDAO.addStudent(student); } else if (method.equals("DELETE")) { int id = Integer.parseInt(request.getParameter("id")); StudentDAO.deleteStudent(id); } else if (method.equals("PUT")) { StudentBean student = new StudentBean(); student.setId(Integer.parseInt(request.getParameter("id"))); student.setName(request.getParameter("name")); student.setAge(Integer.parseInt(request.getParameter("age"))); StudentDAO.updateStudent(student); } response.sendRedirect(request.getContextPath() + "/student"); } protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String pathInfo = request.getPathInfo(); if (pathInfo == null || pathInfo.equals("/")) { response.sendError(HttpServletResponse.SC_BAD_REQUEST); } else { int id = Integer.parseInt(pathInfo.substring(1)); StudentBean student = StudentDAO.getStudent(id); if (student == null) { response.sendError(HttpServletResponse.SC_NOT_FOUND); } else { request.setAttribute("student", student); request.getRequestDispatcher("/WEB-INF/student_edit.jsp").forward(request, response); } } } protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String pathInfo = request.getPathInfo(); if (pathInfo == null || pathInfo.equals("/")) { response.sendError(HttpServletResponse.SC_BAD_REQUEST); } else { int id = Integer.parseInt(pathInfo.substring(1)); StudentDAO.deleteStudent(id); response.sendRedirect(request.getContextPath() + "/student"); } } } ``` 其中,`doGet` 方法用于处理 GET 请求,根据 URL 中的 ID 参数,展示所有学生或编辑指定学生信息。`doPost` 方法用于处理 POST 请求,根据 `_method` 参数,添加、删除或更新学生信息。`doPut` 和 `doDelete` 方法分别用于处理 PUT 和 DELETE 请求,用于更新和删除学生信息。 在 `WEB-INF` 目录下新建 `student_edit.jsp` 文件,用于编辑学生信息: ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="com.example.StudentBean" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>编辑学生信息</title> </head> <body> <h1>编辑学生信息</h1> <form method="post" action="student"> <input type="hidden" name="_method" value="PUT"> <input type="hidden" name="id" value="<%= request.getAttribute("student").getId() %>"> 姓名:<input type="text" name="name" value="<%= request.getAttribute("student").getName() %>"><br> 年龄:<input type="text" name="age" value="<%= request.getAttribute("student").getAge() %>"><br> <input type="submit" value="保存"> </form> </body> </html> ``` 其中,使用 `request.getAttribute` 方法获取传递的学生信息,并在表单中展示。 最后,在浏览器中访问 `http://localhost:8080/项目名/student`,即可访问学生信息管理界面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值