JavaWeb -- xml & servlet & jsp

本文深入探讨了JavaWeb开发中的XML、Servlet和JSP技术。从XML的结构、验证、DOM模型到Servlet的生命周期、应用场景及JSP的基本语法、重用策略,全方位解析了这三大核心技术。此外,还介绍了请求响应处理、session和cookie的使用,以及EL表达式和JSTL标签库的应用,帮助读者全面理解JavaWeb开发的核心概念和实践技巧。
摘要由CSDN通过智能技术生成

Xml

简介

全称可扩展标记语言

xml 与 html 非常相似,都是编写标签;但是 xml 没有预定义标签,html 中存在大量预定义标签;xml 重在保存与传输数据,html 用于显示信息

xml 用途:
1、Java 程序的描述配置文件
2、用于保存程序产生的数据
3、网络间的数据传输

xml 文档结构

xml 声明说明 xml 的基本信息,包括版本号和字符集,写在 xml 的第一行

<?xml version="1.0" encoding="UTF-8"?>

示例:

<!--xml注释-->
<hr>
	<employee no="3310">
		<name>张三</name>
		<age>31</age>
		<department>
			<dname>会计部</dname>
		</department>
	</employee>
	<employee no="3309">
		<name>李四</name>
		<age>30</age>
		<department>
			<dname>工程部</dname>
		</department>
	</employee>
</hr>

如何校验格式

直接在浏览器中新建标签页,将 xml 文件直接拖进去

标签书写规则

1、合法的标签名:标签名要有意义;建议使用英文,小写字母,单词之间使用 - 分割;建议多级标签不要存在重名的情况

2、适当的注释和缩进

3、合理使用属性:标签属性用于描述标签不可或缺的信息;对标签分组或者为标签设置 Id 时常用属性表示

4、处理特殊字符

出现 <,> 等特殊字符,会破坏文档结构

解决方案1:使用实体引用
在这里插入图片描述
只适用于特殊字符比较少的场景

解决方案2:使用 CDATA 标签

CDATA 指的是不应由 xml 解析器进行解析的文本数据,从 <![CDATA] 开始,]]> 结束。可以针对一段代码

5、有序的子元素,在 xml 多层嵌套的子元素中,标签的前后顺序应保持一致,如上面提到的 employee ,name,age 等标签的顺序最好一致

语义约束

DTD

DTD 文件的扩展名为 .dtd

利用 DTD 中的 <!ELEMENT> 标签,我们可以定义 xml 文档中允许出现的节点和数量

# hr 节点下只允许出现1个employee子节点
<!ELEMENT hr (employee)>

如果某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符

# hr节点下最少出现1个employee子节点
<!ELEMENT hr (employee+)>
# hr节点下可出现0...n个employee子节点
<!ELEMENT hr (employee*)>
# hr节点下最多出现1个employee子节点
<!ELEMENT hr (employee?)>
# employee节点下必须包含以下四个节点,且按顺序出现
# employee 后面必须跟一个空格
<!ELEMENT employee (name,age,salary,department)>
# 定义name标签体只能是文本
<!ELEMENT name (#PCDATA)>
# 标签的名称 属性的名字 节点的类型 没有填写时的默认值
<!ATTLIST employee no CDATA "">

xml源码
<employee no="3301">
	<name>李铁柱</name>
	<age>37</age>
	<salary>3600</salary>
	<department>
		<dname>人事部</dname>
		<address>XX大厦-B105</address>
	</department>
</employee>

提示报错:Attribute "no" must be declared for element type "employee".

此时应该在dtd文件中加上 <!ATTLIST employee no CDATA "">

在 xml 中使用 <!DOCTYPE> 标签来引用 DTD 文件

# hr 根节点名字
# SYSTEM 表示本地
# hr.dtd 与xml在同一目录下的dtd文件
<!DOCTYPE hr SYSTEM "hr.dtd">

hr.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd">
<!-- 人力资源管理系统 -->
<hr>
	<employee no="3301">
		<name>李铁柱</name>
		<age>37</age>
		<salary>3600</salary>
		<department>
			<dname>人事部</dname>
			<address>XX大厦-B105</address>
		</department>
	</employee>
	<employee no="3302">
		<name>林海</name>
		<age>50</age>
		<salary>7000</salary>
		<department>
			<dname>财务部</dname>
			<address>XX大厦-B106</address>
		</department>
	</employee>
</hr>

hr.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT hr (employee+)>
<!ELEMENT employee (name,age,salary,department)>
<!ATTLIST employee no CDATA "">
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT salary (#PCDATA)>
<!ELEMENT department (dname,address)>
<!ELEMENT dname (#PCDATA)>
<!ELEMENT address (#PCDATA)>

XML Schema

相比 DTD 更为复杂,提供了数据类型,格式限定,数据范围等特性

hr.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 人力资源管理系统 -->
<hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="hr.xsd">
	<employee no="3309">
		<name>张三</name>
		<age>31</age>
		<salary>4000</salary>
		<department>
			<dname>会计部</dname>
			<address>XX大厦-B103</address>
		</department>
	</employee>
	<employee no="3310">
		<name>李四</name>
		<age>23</age>
		<salary>3000</salary>
		<department>
			<dname>工程部</dname>
			<address>XX大厦-B104</address>
		</department>
	</employee>
</hr>

hr.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
	<element name="hr">
		<!--complexType标签含义是:复杂节点。包含子节点时必须使用这个标签 -->
		<!--如hr下面有子节点employee -->
		<complexType>
			<!--子节点必须按顺序严格书写 -->
			<sequence>
			<!--employee子节点最少出现一次,最多出现9999-->
				<element name="employee" minOccurs="1" maxOccurs="9999">
					<complexType>
						<sequence>
							<element name="name" type="string"></element>
							<element name="age">
								<simpleType>
									<restriction base="integer">
										<minInclusive value="18"></minInclusive>
										<maxInclusive value="60"></maxInclusive>
									</restriction>
								</simpleType>
							</element>
							<element name="salary" type="integer"></element>
							<element name="department">
								<complexType>
									<sequence>
										<element name="dname" type="string"></element>
										<element name="address" type="string"></element>
									</sequence>
								</complexType>
							</element>
						</sequence>
						<attribute name="no" type="string" use="required"></attribute>					
					</complexType>
				</element>
			</sequence>
		</complexType>
	</element>	
</schema>

DOM文档对象模型

简介

DOM 定义了访问和操作 xml 文档的标准方法,DOM 把 xml 文档作为树结构来查看,能够通过 DOM 树来读写所有元素

Dom4j 是一个易用的,开源的库,用于解析 xml。他应用于 Java 平台,具有性能优异,功能强大,极易使用等特点。其将 xml 视为 Document 对象,xml 标签被定义为 Element 对象

如何引用 jar 包

首先登录 dom4j 的官网下载 jar 包,https://dom4j.github.io/,下载 dom4j-2.1.1.jar

如何引用 jar 包,在 jar 包上点右键,Add to build path

读取 xml

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class HrReader {
   
	public void readXml(){
   
		String file = "*****hr.xml";
		// SAXReader用于将xml解析后以树的形式保存在内存中
		SAXReader reader = new SAXReader();
		try {
   
			Document document = reader.read(file);
			// 获取xml文档的根节点
			Element root = document.getRootElement();
			List<Element> employees =  root.elements("employee");
			for(Element employee : employees){
   
				// 采用两种方式获取子节点信息
				Element name = employee.element("name");
				String empName = name.getText();
				System.out.println(empName);
				System.out.println(employee.elementText("age"));
				System.out.println(employee.elementText("salary"));
				Element department = employee.element("department");
				System.out.println(department.element("dname").getText());
				System.out.println(department.element("address").getText());
				// 提取属性
				Attribute att = employee.attribute("no");
				System.out.println(att.getText());
			}
		} catch (DocumentException e) {
   
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
   
		HrReader reader = new HrReader();
		reader.readXml();
	}
}

更新 xml

新增一个 employee 子节点

public class HrWriter {
   
	public void writeXml(){
   
		String file = "*****hr.xml";
		SAXReader reader = new SAXReader();
		try {
   
			Document document = reader.read(file);
			Element root = document.getRootElement();
			Element employee = root.addElement("employee");
			employee.addAttribute("no", "3311");
			Element name = employee.addElement("name");
			name.setText("张三");
			employee.addElement("age").setText("37");
			employee.addElement("salary").setText("3600");
			Element department = employee.addElement("department");
			department.addElement("dname").setText("人事部");
			department.addElement("address").setText("XX大厦-B105");
			Writer writer = new OutputStreamWriter(new FileOutputStream(file) , "UTF-8");
			document.write(writer);
			writer.close();
		} catch (Exception e) {
   
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
   
		HrWriter hrWriter = new HrWriter();
		hrWriter.writeXml();
	}
}

XPath

XPath 路径表达式是 xml 文档中查找数据的语言

基本表达式

nodename  选取此节点的所有子节点
/  从根节点选取
//  从全文中查找符合条件的节点,不去考虑他们所在的为准
.  选取当前节点
..  选取当前节点的父节点
@  选取属性

在这里插入图片描述
在这里插入图片描述

Jaxen

Jaxen 是一个 Java 编写的开源 Xpath 库。适应多种不同的对象模型,包括 DOM,XOM,dom4j,JDOM

Dom4j 底层依赖 Jaxen 实现 XPath 查询

搜索 jar 包路径:https://maven.aliyun.com/mvn/search,下载 jaxen-1.1.6.jar

public class XPathTestor {
   
	public void xpath(String xpathExp){
   
		String file = "******hr.xml";
		SAXReader reader = new SAXReader();
		try {
   
			Document document = reader.read(file);
			List<Node> nodes = document.selectNodes(xpathExp);
			for(Node node : nodes){
   
				Element emp = (Element)node;
				System.out.println(emp.attributeValue("no"));
				System.out.println(emp.elementText("name"));
				System.out.println(emp.elementText("age"));
				System.out.println(emp.elementText("salary"));
				System.out.println("==============================");
			}
			
			
		} catch (DocumentException e) {
   
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
   
		XPathTestor testor = new XPathTestor();
		// 获得根目录hr下一级所有的employee节点
		testor.xpath("/hr/employee");
		// 全文查找employee节点,不考虑位置
		// 对hr.xml而言,得到的结果与上面的一致
		testor.xpath("//employee");
		// 全文查找工资小于4000的员工
		testor.xpath("//employee[salary<4000]");
		testor.xpath("//employee[name='李铁柱']");
		// 全文查找工号为3301的员工
		testor.xpath("//employee[@no=3301]");
		// 全文查找第一个employee节点,从1开始
		testor.xpath("//employee[1]");
		testor.xpath("//employee[last()]");
		// 结果合并
		testor.xpath("
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值