XML/web/servlet
一 XML
1. 标记语言
标记语言,是一种将文本(Text)以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码。当今广泛使用的标记语言是超文本标记语言
(HyperText Markup Language, HTML)和可扩展标记语言(Extensible Markup
Language XML)。标记语言广泛应用于网页和网络应用程序。
1)、超文本标记语言 HTML\
(1)写法格式: <a href="link.html">link</a>
(2)关注数据的展示与用户体验
(3)标记是预定义、不可扩展的(如 <a></a>表示超链接)
2)、可扩展的标记语言 XML
(1)写法格式:同 html 样式
(2)仅关注数据本身
(3)标记可扩展,可自定义
xml 和 Html 语言由同一种父语言 SGML(Standard Generalized Markup
Language,标准通用标记语言)发展出来的两种语言。
xml 由 html 发展而来,与 html 格式相似,但是比 html 严格。 XML
描述的是结构、内容和语义,它不描述页面元素的格式化。
HTML 侧重于如何表现信息,内容描述与显示整合为一体。 XML
中的每个元素名都是成对出现的,结束标签前加一个/。
2、 XML 作用
XML 可以用于描述数据、存储数据、传输(交换)数据。 XML
现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便,用户可以定义自己需要的标记。
1)、存储、交换数据
XML 只用元素和属性来描述数据,而不提供数据的显示方法,这使得 XML
具有能够运行于不同系统平台之间和转换成不同格式目标文件。 用 XML
在应用程序和公司之间作数据交换,几个应用程序可以共享和解析同一个 XML
文件,不必使用传统的字符串解析或拆解过程。
2)、配置
许多应用都将配置数据存储在各种文件里,如 SSH、 Android。使用 XML
配置文件的应用程序能够方便地处理所需数据,不用像其它应用那样要经过重新编译才能修改和维护应用系统。
xml 比
数据库占用的资源少,操作方便,用来存储简单的信息,现在主要用在程序的配置文件上(比如
web.xml) 。 现在有越来越多的设备也支持 XML 了。
3、 格式良好的 xml
3.1、语法规范:
1)、必须有 XML 文档声明:
<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" standalone="yes"?>
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
说明:
XML standalone 定义了外部定义的 DTD 文件的存在性. standalone element
有效值
是 yes 和 no. 如下是一个例子:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE s1 PUBLIC "http://www.ibm.com/example.dtd"
"example.dtd">
<s1>.........</s1>
值 no 表示这个 XML 文档不是独立的而是依赖于外部所定义的一个 DTD. 值 yes
表
示这个 XML 文档是自包含的(self-contained).
注意文本文件保存时候默认的编码格式是ANSI,需用记事本把它手动改为UTF-8保存。
2)、必须有且仅有一个根元素
3)、 严格区分大小写
4)、属性值用引号(双引号或单引号)
:等号分开的名称-值对;在一个元素上,相同的属
性只能出现一次
5)、标记成对;
6)、空标记关闭;
7)、元素正确嵌套。
3.2、元素命名规则
1)、名称中可以包含字母、数字或者其他可见字符;
2)、名称不能以数字开头;
3)、不能以 XML/xml/Xml...开头;
4)、名称中不能含空格;
5)、名称中不能含冒号(注:冒号留给命名空间使用)
3.3、 实体
实体叫 ENTITY,实体的作用是避免重复输入。作用相当于宏或者变量。
1)内置的 5 种实体
实体 符号
2)自定义实体
<!DOCTYPE 根元素[
<!ENTITY 实体名 "实体内容">
]>
<!-- 定义实体 -->
<!DOCTYPE shsxt[
<!--实体声明 -->
<!ENTITY uname "admin">
<!ENTITY gender "男">
]>
<!-- 根元素 -->
<shsxt>
<teacher>Hello
<!-- 标签成对出现 ,属性值用引号-->
<name age="18">Lisa</name>
<gender>女</gender>
</teacher>
<teacher age="19">
<name>李四</name>
<gender>男</gender>
</teacher>
<!-- 使用实体 -->
<teacher>
<name>&uname;</name>
<gender>&gender;</gender>
</teacher>
<!-- CDATA -->
<desc><![CDATA[战国时期,芈月是楚威王最宠爱的小公主,但<desc>在楚威王
死后生活一落千丈,母亲向氏被楚威后逐出宫,芈月和弟弟芈戎躲过了一次次灾难和危机。
芈月与楚公子黄歇青梅竹马,真心相爱,但被作为嫡公主芈姝的陪嫁媵侍远嫁秦国。芈姝当
上了秦国的王后,芈月不得已成为宠妃...]]>
</desc>
</shsxt>
4、组成
1)、 构成
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:\
- 元素\
- 属性\
- 实体\
- PCDATA
- CDATA
- CDATA 节(character data)
2)、 CDATA
***用于把整段文本解释为纯字符数据而不是标记的情况。如包含大量的<、 >、
&、或者"字符。 CDATA
节中的所有字符都会被当做元素字符数据的常量部分,而不是 XML
标记,可以输入除]]>外任意字符,不能嵌套。
<![CDATA[ ...... ]]>
**3)、 PCDATA
**PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。不过,被解析的字符数据不应当包含任何
&、 < 或者 > 字符;需要使用 &、 < 以及 >的内置实体来分别替换它们。
**5. XML 解析(重点)
**基本的解析方式有两种:一种叫 SAX,另一种叫 DOM。
SAX(Simple API for XML)是基于事件流的解析,
DOM(Document Object Model)是基于 XML 文档树结构的解析。
SAX:效率高,数据量小,仅一次获取 ,
DOM:整颗树加载到内存中,耗内存,可多次获取。
5.1、 DOM 解析
与 js 中的类似,使用 JAXP(Java API for XML Parsing),即:用于 XML
解析的 Java API.
DOM(Document Object Model, 文档对象模型),在应用程序中,基于 DOM 的
XML
分析器将一个 XML 文档转换成一个对象模型的集合(通常称为 DOM
树),应用程序正是通过对这个对象模型的操作,来实现对 XML
文档数据的操作。
XML 本身是以树状的形式出现的,所以 DOM
操作的时候,也将按章树的形式进行转换。在整个 DOM 树种,最大的地方指的是
Document,表示一个文档,在这个文档中存在一个根节点。
注意:在使用 DOM
操作的时候,每一个文字的区域也是一个节点,称为文本节点。
**核心操作接口
**在 DOM 解析中有以下四个核心的操作接口
Document : 此接口代表了整个 XML 文档,表示的是整棵 DOM
树的根,提供了对文
档中的数据进行访问和操作的入口,通过 Document 节点可以访问 XML
文件中所有的
元素内容。
Node : 此接口在整个 DOM 树种具有举足轻重的低位,DOM
操作的核心接口中有很大一部分接口是从 Node
接口继承过来的。例如:Document、 Element 等接口,在 DOM树种,每一个 Node
接口代表了 DOM 树种的一个节点。
NodeList :
此接口表示的是一个节点的集合,一般用于表示有顺序关系的一组节点,
例如:一个节点的子节点,当文档改变的时候会直接影响到 NodeList 集合。
NamedNodeMap :
此接口表示的是一组节点和其唯一名字对应的一一对应关系,本
接口主要用于属性节点的表示上。
**DOM 解析过程
**如果一个程序需要进行 DOM 解析读取操作的话,也需要按照如下的步骤进行:
① 建 立 DocumentBuilderFactory :
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
②建立 DocumentBuilder: DocumentBuilder builder = factory.newDocumentBuilder();
③建立 Document : Document doc = builder.parse(“要解析的文件路径”);
④建立 NodeList : NodeList nl = doc.getElementsByTagName(“读取节点”);
⑤进行 XML 信息读取
DOM 操作除了可以进行解析外,也可以进行文档的生成
如果想要生成 XML 文件,则在创建文档的时候,就应该使用 newDocument()方法
如果要将 DOM 的文档输出,本身是比较麻烦的 。一次编写多次 copy
public static void createXml() throws Exception{
//获取解析器工厂
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//获取解析器
DocumentBuilder builder=factory.newDocumentBuilder();
//创建文档
Document doc=builder.newDocument();
//创建元素、设置关系
Element root=doc.createElement("people");
Element person=doc.createElement("person");
Element name=doc.createElement("name");
Element age=doc.createElement("age");
name.appendChild(doc.createTextNode("shsxt"));
age.appendChild(doc.createTextNode("10"));
doc.appendChild(root);
root.appendChild(person);
person.appendChild(name);
person.appendChild(age);
//写出去
// 获得变压器工厂
TransformerFactory tsf=TransformerFactory.newInstance();
Transformer ts=tsf.newTransformer();
//设置编码
ts.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//创建带有DOM节点的新输入源,充当转换Source树的持有者
DOMSource source=new DOMSource(doc);
//充当转换结果的持有者
File file=new File("src/output.xml");
StreamResult result=new StreamResult(file);
ts.transform(source, result);
}
5.2 SAX 解析
SAX(Simple API for XML)解析是按照 xml 文件的顺序一步一步的来解析。 SAX
没有官方的标准机构,它不属于任何标准阻止或团体,也不属于任何公司或个人,而是提供任何人使用的一种计算机技术。
SAX(Simple API for XML,操作 XML 的简单接口),与 DOM 操作不同的是,SAX
采用的
是一种顺序的模式进行访问,是一种快速读取 XML 数据的方式。当使用 SAX
解析器进行操作的时候会触发一系列的事情,当扫描到文档(document)开始与结束、元素
(element)开始与结束时都会调用相关的处理方法,并由这些操作方法作出相应的操
作,直至整个文档扫描结束。
如果要想实现这种 SAX 解析,则肯定首先建立一个 SAX 的解析器
// 1、创建解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2、 获得解析器
SAXParser parser = factory.newSAXParser();
// SAX解析器 ,继承 DefaultHandler
String path = new File("resource/demo01.xml").getAbsolutePath();
// 解析
parser.parse(path, new MySaxHandler());
5.3、 DOM4j 解析
dom4j 是一个简单的开源库,用于处理 XML、 XPath 和 XSLT,它基于 Java
平台,使
用 Java 的集合框架,全面集成了 DOM,SAX 和 JAXP。下载路径:
http://www.dom4j.org/dom4j-1.6.1/
http://sourceforge.net/projects/dom4j
可以使用 DOM4J 进行 XML 文件的读、写操作
DOM4J 与 JDOM 一样都属于一个免费的 XML
开源组建,但是由于现在的开发框架中使用该技术较多,比如 Hibernate、
Spring 等都使用 DOM4J 这个功能,所以作为介绍,
大家可以对该组件有一个了解。并没有谁好谁坏,一般框架使用 DOM4J
较多,而我们
平时如果要用则 JDOM 较常见。
可以发现 DOM4J 发挥了很多新特性,比如输出格式就可以很好解析。
解析XML文件
package com.shsxt.xml;
import java.io.File;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* Dom4j解析
* 1、得到要解析的文件file对象
* 2、得到读取器 SaxReader
* 3、通过读取器 SaxReader得到Document对象
* 4、得到Document对象的根节点
* 5、得到根节点的所有子节点
* 6、迭代所有的子节点,得到对应结果
*
*/
public class Dom4jparse {
@SuppressWarnings("unchecked") // 抑制警告
public static void main(String[] args) throws Exception {
// 1、得到要解析的文件file对象
File file = new File("src/test.xml");
// 2、得到读取器 SaxReader
SAXReader reader = new SAXReader();
// 3、通过读取器 SaxReader得到Document对象
Document document = reader.read(file);
// 4、得到Document对象的根节点
Element element = document.getRootElement();
// 打印根节点
System.out.println(element.getName());
// 5、得到根节点的所有子节点
Iterator<Element> iterator = element.elementIterator();
// 6、迭代所有的子节点,得到对应结果
while(iterator.hasNext()) {
// 得到每一个子节点
Element e = iterator.next();
//System.out.println(e.getName() + "====" + e.getStringValue());
//System.out.println(e.getName() + "====" + e.getText());
String name = e.elementText("name");
System.out.println(name + " = " + e.elementText("gender") );
}
}
}
创建xml文件
package com.shsxt.xml;
import java.io.File;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Dom4jwriter {
public static void main(String[] args) throws Exception {
// 使用DocumentHelper来创建 Document对象
Document document = DocumentHelper.createDocument();
// 创建元素并设置关系
Element person = document.addElement("person");
Element name = person.addElement("name");
Element age = person.addElement("age");
// 设置文本
name.setText("shsxt");
age.setText("10");
// 创建格式化输出器
OutputFormat of = OutputFormat.createPrettyPrint();
of.setEncoding("utf-8");
// 输出到文件
File file = new File("src/outputdom4j.xml");
XMLWriter writer = new XMLWriter(new FileOutputStream(new
File(file.getAbsolutePath())),of);
// 写出
writer.write(document);
writer.flush();
writer.close();
}
}
5.4 JDOM 解析
下载路径: http://www.jdom.org/downloads/index.html
JDOM 是一种使用 XML 的独特 Java 工具包,用于快速开发 XML 应用程序。 JDOM
是一个开源项目,它基于树形结构,利用纯 Java 的技术对 XML
文档实现解析、生成、序列化及多种操作。
**JDOM 解析
**掌握 JDOM 开发工具的使用及产生原理
可以使用 JDOM 进行读取或写入的操作
在 W3C 本身提供的 XML 操作标准,DOM 和 SAX,但是从开发角度上看,DOM 和
SAX本身是各有特点的,DOM 可以修改,但不适合读取大文件,而 SAX
可以读取大文件,但是本身不能修改
所谓的 JDOM = DOM 的可修改 + SAX 的读取大文件
JDOM 本身是一个免费的开源组建,直接从 www.jdom.org 上下载
下载后解压,将 jdom.jar 包拷贝到 Tomcat 目录(项目)的 lib 中
JDOM 主要操作的类:
我们发现 JDOM 的输出操作要比传统的 DOM
方便得多,而且也更加直观,包括在输出的时候都很容易了。
此时观察到的是 JDOM 对于 DOM 解析的支持,但是也说,JDOM 本身也支持了 SAX
的特点;所以,可以使用 SAX 进行解析操作。
解析
// 获取SAX解析器
SAXBuilder builder = new SAXBuilder();
File file = new File("resource/demo01.xml");
// 获取文档
Document doc = builder.build(new File(file.getAbsolutePath()));
// 获取根节点
Element root = doc.getRootElement();
System.out.println(root.getName());
// 获取根节点下所有的子节点, 也可以根据标签名称获取指定的直接点
List<Element> list = root.getChildren();
System.out.println(list.size());
for(int x = 0; x<list.size(); x++){
Element e = list.get(x);
// 获取元素的名称和里面的文本
String name = e.getName();
System.out.println(name + "=" + e.getText());
System.out.println("==================");}
创建
// 创建节点
Element person = new Element("person");
Element name = new Element("name");
Element age = new Element("age");
// 创建属性
Attribute id = new Attribute("id","1");
// 设置文本
name.setText("shsxt");
age.setText("10");
// 设置关系
Document doc = new Document(person);
person.addContent(name);
name.setAttribute(id);
person.addContent(age);
XMLOutputter out = new XMLOutputter();
File file = new File("resource/outputjdom.xml");
out.output(doc, new FileOutputStream(file.getAbsoluteFile()));
**\
6、 XPATH\
6.1、 XPATH
**XPath 是一门在 XML 档中查找信息的语言,可用来在 XML
文档中对元素和属性进\行遍历。 XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer
同时被构\建于 XPath 表达之上。因此,对 XPath 的理解是很多高级 XML 应用的基础。
XPath
非常类似对数据库操作的 SQL 语言,或者说
JQuery,它可以方便开发者抓起文档中需
要的东西。(dom4j 也支持 xpath)
6.2.节点类型
XPath
中有七种结点类型:元素、属性、文本、命名空间、处理指令、注释以及文档节点
(或称为根节点)。
文档中存在元素节点,属性节点,根节点
6.3.常用路径表达式
6.4.限定语
用来查找某个特定的节点或者包含某个指定的值的节点。以方括号括起
6.5 .通配符
**7、 DTD
**使用 DTD 可以对文档的内容进行约束,XML 中的 DTD
数据必须用<!DOCTYPE>标记说明,
语法格式如下:
<!DOCTYPE 根元素名称[DTD 定义数据]>
XML 的元素内容定义格式如下:
<!ELEMENT 元素内容描述字符串>
DTD 还可以描述子元素的结构,其使用语法:
<!ELEMENT 子元素结构名称 子元素结构表达式>
其中子元素结构有以下几种常用的定义方式:
1.按顺序包括 B、 C、 D、的所有内容: <!ELEMENT A(B,C,D)>
2.在 A 中要包含 B、 C、 D、的任意一个的内容: <!ELEMENT A(B|C|D)>
3.在 A 中包含 0-1 个 B: <!ELEMENT A(B?)>
4.在 A 中要包含 1 次以上各 B: <!ELEMENT A(B+)>
5.在 A 中要包含 O 次以上各 B: <!ELEMENT A(B*)>
6.空元素 <!ELEMENT A EMPTY>
如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persons[
<!ELEMENT persons (person+)>
<!ELEMENT person ( name , password? , age+) >
<!ATTLIST person sex (男|女) #REQUIRED>
<!ATTLIST person id ID #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<persons>
<person sex="男" id="p1">
<name></name>
<password></password>
<age></age>
</person>
<person sex="女" id="p2">
<name></name>
<password></password>
<age></age>
</person>
</persons>
**8、 schema 简单编写
**XML Schema 本身也是一种 XML
构造,它用来描述[哪个元素,在什么时候出现],[该
元素具有什么样的属性]等等,也就是说,XML Schema 是对 XML
的树形构造加以描述说明的一种语言。
原本,使用 DTD 对 XML 的树形构造加以描述说明,但 DTD
存在严重的局限性,DTD
不能定义数据的类型,语法也与 XML
语言完全不一样,在使用的便利性,数据结构表
达的严谨性上存在问题。
使用 schema 对 xml 格式严格检查。
简单的 XML Schema 例
hello.xml
<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:///C:/Users/Administrator/Desktop/t
est.xsd">xmlschema简单入门 </hello>
写一个简单的 XML Schema
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="hello" type="xs:string"/>
</xs:schema>
解说:
**第一行:
**<?xml version="1.0" encoding="utf-8"?>
XML 申明。 XML Schema 本身也是 XML 文档,所以它遵循 XML 记述语法。使用
encoding
属性指定文档的编码格式。
根节点:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
其中 xs 是命名空间,schema 是根节点名。
注意 xs:schema 与 xmlns:xs 中的 xs
要完全一样(名称可以任意,只要一样就可以),
它标明以 xs:开头的节点元素是 http://www.w3.org/2001/XMLSchema
定义的元素。
**element 元素
**<xs:element name="hello" type="xs:string">
上面已经说明,xs:element 表示 element 是
http://www.w3.org/2001/XMLSchema 中
定义的元素。它的 name 属性用来定义它所描述的 XML 文档中的节点名。 type
是表示该节点的值的类型。这里的 xs:string(string 类型)表示 hello
节点不能包含子节点,
不能包含属性,它的内容值应该是 string 类型。除了 string 之外,XML
Schema 还有很多其他类型。
**最后使用
**</xs:schema>
完成整个 XML Schema 描述。
二Web
1. 简单通信
回顾 Socket 编程给我们最大的感受,是可以在多台电脑之间进行数据的传
输,这就是网络编程的开端和基础,通过客户端请求服务器端通信,直观了解
Web 编程。
总结通信条件如下:
1、 需要有服务器端(server) :等待被请求,需要暴露 ip 和 port
2、 需要有客户端(client):主动发起请求 ,知晓服务端的 ip 和 port
3、 通信规则(协议): TCP/IP 协议
ip
用于定位计算机;端口号(定位程序),用于标识进程的逻辑地址,不同进程的
标志;有效端口:0~65535,其中 0~1024
由系统使用或者保留端口,开发中建议使用
1024 以上的端口。
随着客户需求越来越复杂,需要的功能越来越多,我们的服务器端需要处理
的请求越来越多,需要区分不同的请求,还需要按照不同请求进行请求数据的提
取以及资源的分配和运算还有逻辑的处理,最后还需要响应给客户端,这就使得
服务器端代码越来越复杂,实现越来越困难。
根据以往的经验,双方进行通信只需要遵循一定的规则就可以很明确地知道
各部分数据的含义,于是出现了网络更上层的应用协议(后面讲的 HTTP
协议),
规定服务器端和客户端通信的规则。
客户端请求服务器端和服务器端响应客户端,都按照固定的规则,那么接收
请求和相应数据这部分操作就可以固定下来,交给特定的一段代码来执行,从而
减少服务器端的代码量,于是出现了接下来说的服务器。
2. 服务器的出现
当客户端请求的资源越来越丰富,需求越来越复杂,程序的核心就应该放在
解决业务和 计算响应数据上,于是出现了服务器统一接收客户端处理并进行分
发到不同的资源,由各个资源进行处理,最后结果交由服务器响应。
从上面的描述可以发现,现在所说的服务器只是负责接收请求,对请求进行
分发,以及最后将获取的数据进行相应的固定框架,至于数据怎么计算得出还得根据具体的业务需求编
写(填充)代码。在没有业务需求的情况下就能将服务器准备出来,现在市面上的服务器有
很多,
比较常用的有: Tomcat、 JBOOS、 IBM的 WebSphere、 BEA 的 WebLogic 以及
Apache 等。
3、 JavaWeb 简介
随着 Java 语言的流行, Java 在网站和企业级应用的开发上应用得越来越普
遍, Java Web 开发已经成为 Java
企业级解决方案中不可或缺的重要组成部分。
Java Web 是用 Java 技术来解决相关 web 互联网领域的技术总和。
Web 包括:
web 服务器和 web 客户端两部分。 Java 在客户端的应用有 java applet,不
过使用得很少, Java 在服务 器端的应用非常的丰富,比如 Servlet, JSP
和第三方框架等等。 Java 技术对 Web 领域的发展 注入了强大的动力。 Web
开发可以理解为做网站。
随着网络技术的不断发展,单机的软件程序已经难以满足网络计算的需要。
为此,各种 各样的网络程序开发体系应运而生。其中,运用最多的网络应用程
序开发体系结构可以分为 两种,一种是基于浏览器/服务器的 B/S 结构,另一
种是基于客户端/服务器的 C/S 结构。
3.1. C/S 体系结构
C/S 是 Client/Server
的缩写,即客户端/服务器结构。在这种结构中,服务
器通常采用高 性能的 PC 机或工作站,并采用大型数据库系统(如 Oracle 或
SQL Server)
,客户端则需要安装专用的客户端软件。这种结构可以充分利用两端硬件环境的优势,将任务合理分配到客户端和服务器,从而降低了系统的通信开销。在
2000 年以前, C/S 结构占据网络程序开发领域的主流。
3.2. B/S 体系结构
B/S 是 Browser/Server 的缩写,即浏览器/服务器结构。在这种结构中,客
户端不需要开发任何用户界面,而统一采用如 IE、 Firefox、 Chrome
等浏览器,
通过 Web 浏览器向 Web 服务器发送请求,由 Web 服务器进行处理,并将处
理结果逐级传回客户端。这种结构利用不断成熟和普及的浏览器技术实现原来需要复杂专用软件才能实现的强大功能,从而节约了开发成本,是一种全新的软件体系结构。这种体系结构已经成为当今应用软件的首选体系结构。
4. Web 应用程序
4.1. Web 应用程序的工作原理
Web 应用程序大体上可以分为两种,即静态网站和动态网站。早期的 Web
应用主要是 静态页面的浏览,即静态网站。这些网站使用 HTML 语言来编写,
放在 Web 服务器上,用户使用浏览器通过 HTTP 协议请求服务器上的 Web 页
面,服务器上的 Web 服务器将接收到 的用户请求处理后,再发送给客户端浏
览器,显示给用户。
随着网络的发展,很多线下业务开始向网上发展,基于 Internet 的 Web 应
用也变得越来越复杂,用户所访问的资源已不能只是局限于服务器上保存的静态网页,更多的内容需要根据用户的请求动态生成页面信息,即动态网站。这些网站通常使用
HTML 语言和动态脚本语言(如 JSP、 ASP 或者是 PHP
等)编写,并将编写后的程序部署到 Web 服务器上, 由 Web
服务器对动态脚本代码进行处理,并转化为浏览器可以解析的 HTML
代码,返回给客户端浏览器,显示给用户。
就好比,静态网站类似于 10 年前的手机,这种手机只能使用出厂时设置的
功能和铃声,用户自己并不能对其铃声进行添加和删除等;而动态网站则类似于现在研制的手机,用户在使用这些手机时,不再是只能使用手机中默认的铃声,而是可以根据自己的喜好任意设置。
4.2. Web 应用技术
在开发 Web 应用程序时,通常需要应用客户端和服务器端两方面的技术。
其中,客户端应用的技术主要用于展现信息内容,而服务器端应用的技术,则主要用于进行业务逻辑的处理和与数据库的交互等。
1) 客户端应用的技术
在进行 Web 应用开发时,离不开客户端技术的支持。目前,比较常用的客
户端技术包 括 HTML 语言、 CSS、 Flash 和客户端脚本技术。
✓ HTML
HTML 语言是客户端技术的基础,主要用于显示网页信息,有浏览
器解释执行,它不需 要编译。
✓ CSS
CSS 就是一种叫做样式表的技术,也有人称之为层叠样式表。在制
作网页时才有用 CSS 样式,可以有效地对页面的布局、字体、颜色、背景和其
他效果实现更加精确的控制。
✓ Flash
Flash 是一种交互式矢量动画制作技术,它可以包含动画、音频、
视频以及应用程序, 而且 Flash 文件比较小,非常适合在 Web 上应用。
✓ 客户端脚本技术
客户端脚本技术是指嵌入到 Web 页面中的程序代码,
这些程序代码是一种解释性的语言,浏览器可以对客户端脚本进行解释。通过脚本语言可以实现以编程的方式对页面元素进行控制,从而增加页面的灵活性。常用的客户端脚本语言由
JavaScript 和 VBScript。目前, 应用最广泛的客户端脚本语言是 JavaScript
脚本,它是 Ajax 的重要组成部分。
2) 服务器端应用的技术
在开发动态网站时,离不开服务器端技术,比较传统和经典的 Web 服务器
端技术主要 有: CGI、 ASP、 SERVLET/JSP、 PHP 等。
✓ CGI(公用网关接口)
CGI 可以说是最早的 WEB 服务器端技术,它是
个 HTTP 过滤程序,其大致的原理是: CGI 是在 WEB
服务器上运行的一个程序,该程序定义了 WEB 客户请求与应答的一种方法。客户
向服务器的请求(主要是 HTML 表单)只要属于 CGI 定义范围,就启动 CGI
程序,其任务是
把客户的请求从网管的环境变量中取出并加以转换,提交给服务器上的 CGI
应用程序,这些 程序可以用 C/C++/PERL
等语言编写,这些程序具备访问服务器资源(比如数据库)的能力,
这些程序的运行结果,通过 CGI 转换成 HTML 格式,发送到客户端。 CGI
程序很容易实现对服务器资源的访问,但是向客户端输出则比较麻烦,程序员不能
使用"所见即所得"的网页制作工具,只能一行行手写HTML
代码,向客户端输出,不适合生成复杂页面,这项技术现在使用的人不多。但是,
CGI 的基本原理却被后续的服务器端网页技术沿用。
✓ ASP
ASP 是微软研发的技术,出现于 1997 年前后。它解决了 CGI 的输
出麻烦。 ASP 允许 HTML 和服务器端脚本混合编程。可以在 HTML 中插入括
起来的代码段, 这些代码可以用 JavaScript\VBScript
等脚本语言编写,但他们
是在服务器上执行的。 ASP 编程是非常方便的,你可以先用"所见即所得"的网
页制作工具把页面效果做出来, 然后再在其中插入服务器端脚本输出服务器端
的计算结果。它的缺点是: HTML
和脚本混合编程,使程序的可读性很差,不利于维护大型 WEB
项目,脚本程序的调试也是个问题。 2003 年前后退出的
ASP.NET 基本解决了上述问题。 ASP 还内置了几个对象,这些对象不需要实例
化即可使用,实现网页的状态维护、 HTTP 模拟等功能,这些对象后来大都出现于
JSP 中。
✓ PHP
PHP 语法类似于 C,别切混合了 Perl、 C++和 Java 的一些特性。它
是一种开元的 Web 服 务器脚本语言,于 ASP 一样可以在页面中加入脚本代码
来生成动态内容。对于一些复杂的 操作可以封装到函数或类中。在 PHP 中提
供了许多已经定义好的函数,例如提供的标准的 数据库接口,是的数据库连接
方面,扩展性强。 PHP 可以被多个平台支持但被广泛应用于 UNIX/Linux 平台。
由于 PHP 本身的代码对外开放,并且经过许多软件工程师的检测,因此到 目
前为止该技术具有公认的安全性能。
✓ JSP
Java Server Page 简称 JSP。 JSP 是以 Java 为基础开发的,所以它沿
用 Java 强大的 API 功 能。 JSP 页面中的 HTML 代码用来显示静态内容部分,
嵌入到页面中的 Java 代码与 JSP 标记 用来生成动态的内容。 JSP 允许程序员
编写自己的标签库来完成应用程序的特定要求。 JSP
可以被预编译,提高了程序的运行速度。另外, JSP
开发的应用程序经过一次编译后,便可
随时随地运行。所以在绝大部分系统平台中,代码无需做修改即可在支持 JSP
的任何服务器中运行。
✓ Servlet
Servlet 是 Java 早期的 Web 服务器端技术,用 Java
语言编写。无论是从原理和编程方式 上,几乎就是 CGI 的翻版,具有 CGI
的缺点和优点,与 CGI 主要不同的是, Servlet
对每个请求都是单独启动一个线程,而不是进程。
5、 Tomcat
5.1. 什么是 Tomcat
**
**Tomcat 是一个符合 JavaEE WEB 标准的最小的 WEB 容器,所有的 JSP 程
序一定要有 WEB 容器的支持才能运行,而且在给定的 WEB 容器里面都会支持
事务处理操作。
Tomcat 是由 Apache 提供的(www.apache.org)提供的可以用安装版和解
压版,安装版可以在服务中出现一个 Tomcat 的服务,免安装没有,开发中使用
免安装版。 Tomcat 简单的说就是一个运行 Java 的网络服务器, 底层是
Socket的一个程序,它也是 JSP 和 Servlet 的一个容器。 Tomcat 是
Apache 软件基金会(Apache Software Foundation)的 Jakarta
项目中的一个核心项目,由
Apache、 Sun 和其他一些公司及个人共同开发而成。
由于有了 Sun 的参与和支持,最新的 Servlet 和 JSP 规范总是能在 Tomcat
中得到体现。因为 Tomcat 技术先进、性能稳定,而且免费,因而深受 Java 爱
好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的 Web
应用服务器。
Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级
应用服务器, 在中小型系统和并发访问用户不是很多的场合下被普遍使用,是
开发和调试 JSP 程序的首选。 对于一个初学者来说,可以这样认为,当在一台
机器上配置好 Apache 服务器,可利用它响应
HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上 Tomcat 部分是
Apache 服务器的扩展,但它是独立运行的,所以当你运行 tomcat
时,它实际上作为一个与 Apache 独立的进程单独运行的。
当配置正确时, Apache 为 HTML 页面服务,而 Tomcat 实际上是在运行
JSP 页面和 Servlet。另外, Tomcat 和 IIS 等 Web 服务器一样,具有处理
HTML页面的功能,另外它还是 一个 Servlet 和 JSP 容器,独立的 Servlet
容器是Tomcat 的默认模式。不过, Tomcat 处理静态 HTML 的能力不如 Apache
服务器。目前 Tomcat 最新版本为 9.0。
5.2. 安装 Tomcat
**
**运行 Tomcat 需要 JDK 的支持【Tomcat 会通过 JAVA_HOME 找到所需要的
JDK】。 安装就是解压缩过程。启动 Tomcat,能访问则算安装好了
1、解压
2、 ROOT 目录中查看 index.html 或 index.jsp 文件
Tomcat8 中自带了页面,而 tomcat7 免安装下没有,如果直接访问会出 404
Tomcat7.XXX 则需要查看 webapps->ROOT 目录中是否有 index.html 或者
index.jsp,如果没有则自己手动添 加一个 html 文件或者到其他地方拷贝一份
jsp,此时能访问该页面则是配置成功。
3、启动 Tomcat (在 tomcat 的安装目录下的 bin 目录 使用命令行启动
tomcat)
启动后该启动窗口不能关
4、打开浏览器输入 http://localhost:8080/访问
OK Tomcat 安装成功。
5、调用 shutdown 命令关闭 Tomcat
5.3. Tomcat 目录结构
1. bin:启动和关闭 tomcat 的 bat 文件\
- conf:配置文件 server.xml 该文件用于配置 server 相关的信息,比如
tomcat 启动的端口号,配置主机(Host) web.xml 文件配置与 web 应用(web 应
用相当于一个 web 站点)
tomcat-user.xml 配置用户名密码和相关权限.\
- lib:该目录放置运行 tomcat 运行需要的 jar 包\
- logs:存放日志,当我们需要查看日志的时候,可以查询信息\
- webapps:放置我们的 web 应用\
- work 工作目录:该目录用于存放 jsp 被访问后生成对应的 server 文件
和.class 文件
**5.4. Eclipse 关联 Tomcat
**WindowpreferencesServerRuntime Environmentaddapache-tomcat-8.0.23
6、 HTTP 协议
HTTP 协议(Hypertext Transfer Protocol,
超文本传输协议),是一个客户端请
求和回应的 标准协议,这个协议详细规定了浏览器和万维网服务器之间互相通
信的规则。用户输入地址 和端口号之后就可以从服务器上取得所需要的网页信
息。通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容
格式。
客户端发送给服务器的格式叫"请求协议";
服务器发送给客户端的格式叫"响应协议"。
6.1. 浏览器中的书写格式
在 B/S 体系架构中,客户端都统一成了浏览器,要请求服务器端资源需要
通过浏览器进行,此时由浏览器将我们给出的请求解析为满足 HTTP 协议的格
式并发出。则我们发出的请求格式需要按照浏览器规定的格式来书写,在浏览器中书写格式如下:
当浏览器获取到信息以后,按照特定格式解析并发送即可。接收到服务器端
给出的响应时,也按照 HTTP 协议进行解析获取到各个数据,最后按照特定格
式展示给用户。
6.2. HTTP 协议的主要特点
1.)支持客户/服务器模式。
2.)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求
方法常用的 有 GET、 POST。每种方法规定了客户与服务器联系的类型不同。由于
HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
3.)灵活: HTTP 允许传输任意类型的数据对象。
正在传输的类型由Content-Type 加以 标记。
4.) HTTP1.1 支持持续连接。通过这种连接,就有可能在建立一个 TCP 连接
后,发送请求并得到回应,然后发送更多的请求并得到更多的回应.通过把建立和
释放 TCP 连接的开销分摊到多个请求上,则对于每个请求而言,由于 TCP 而造
成的相对开销被大大地降低了。而且,
还可以发送流水线请求,也就是说在发送请求 1
之后的回应到来之前就可以发送请求
2.也可以认为,一次连接发送多个请求,由客户机确认是否关闭连接,而服务器会认为这些请求分别来自不同的客户端。
5.)无状态: HTTP 协议是无状态协议。无状态是指协议对于事务处理没有
记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送
的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
6.3. HTTP 之 URL
**
**http(超文本传输协议)是一个基于请求与响应模式的、应用层的协议,常
基于 TCP 的连接方式,绝大多数的 Web 开发,都是构建在 HTTP 协议之上的
Web 应用。
HTTP URL (URL 是一种特殊类型的 URI,包含了用于查找某个资源的足够的
信息)的格式 如下:
http://host[":"port][abs_path]
http 表示要通过 HTTP 协议来定位网络资源; host 表示合法的 Internet 主
机域名或 者 IP 地址;
port 指定一个端口号,为空则使用缺省端口 80; abs_path
指定请求资源的 URI; 如果 URL 中没有给出 abs_path,那么当它作为请求
URI时,必须以"/"的形式给出,通常 这个工作浏览器自动帮我们完成。
6.4. HTTP 请求
http 请求由三部分组成,分别是: 请求行、 请求头、 请求正文
通过 chrome 浏览器, F12Network 查看
get(没有请求体)
post
格式
请求行
请求头 1
请求头 2
...
请求空行
请求体
请求行以一个方法符号开头,以空格分开,后面跟着请求的 URI 和协议的
版本,格式如 下:
Method Request-URI HTTP-Version CRLF 其中 Method 表示请求方法;
Request-URI 是一个统一资源标识符;
HTTP-Version 表示请 求的 HTTP
协议版本; CRLF 表示回车和换行
6.5. HTTP 响应
在接收和解释请求消息后,服务器返回一个 HTTP 响应消息。 HTTP 响应也
是由三个部分组成,分别是: 状态行、 消息报头、 响应正文
格式
状态行
响应头 1
响应头 2
...
响应空行
响应体
6.6. 消息头
HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消
息和响应消 息都是由开始行(对于请求消息,开始行就是请求行,对于响应消
息,开始行就是状态行), 消息报头(可选),空行(只有 CRLF
的行),消息正文(可选)组成。
每一个报头域都是由名字+": "+空格+值组成,消息报头域的名字是大小写
无关的。
请求头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信
息。
Refere: 该请求头指明请求从哪里来
如果是地址栏中输入地址访问的都没有该请求头 地址栏输入地址,通过请
求可以看到,此时多了一个 Referer 的请求头,并且后面的值 为该请求从哪里
发出,百度竞价,只能从百度来的才有效果,否则不算;通常用来做统计工作、
防盗链
响应头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务
器的信息和 对 Request-URI 所标识的资源进行下一步访问的信息。
Location: Location 响应报头域用于重定向接受者到一个新的位置。 Location
响应报头域, 常用在更换域名的时候。
response.sendRedirect("http://www.shsxt.com");
Refresh:自动跳转(单位是秒),可以在页面通过 meta 标签实现,也可在
后台实现。
<meta http-equiv="refresh" content="3;url=http://www.shsxt.com">