WEB的对象

 

初识服务器

 

.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 中的每个元素名都是成对出现的,结束标签前加一个/。

 

.XML作用

 

1 、存储、交换数据

 

XML 只用元素和属性来描述数据,而不提供数据的显示方法,这使得 XML 具有能够运行于不同系统平台之间和转换成不同格式目标文件。  XML 在应用程序和公司之间作数据交换,几个应用程序可以共享和解析同一个 XML 文件,不必使用传统的字符串解析或拆解过程。

 

2 、配置

 

许多应用都将配置数据存储在各种文件里,如 SSH、Android。使用 XML 配置文件的应用程序能够方便地处理所需数据,不用像其它应用那样要经过重新编译才能修改和维护应用系统。xml 比 数据库占用的资源少,操作方便,用来存储简单的信息,现在主要用在程序的配置文件上(比如 web.xml) 。 现在有越来越多的设备也支持 XML 了。

 

文档的后缀名是 xml,每个文档有且仅有一个根元素,所谓根元素就是包含了其他所有元素的元素。XML 目前只有一个版本,即 1.0.XML 是自描述数据,使用现有的国际标准。XML 中有格式良好(Well-formed)的 XML 和有效的(validate)XML。

 

.XML格式

 

1.语法规范

 

(1).必须有文档声明: <?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.

 

值 no 表示这个 XML 文档不是独立的而是依赖于外部所定义的一个 DTD. 值 yes 表示这个 XML 文档是自包含的(self-contained).注意文本文件保存时候默认的编码格式是ANSI,需用记事本把它手动改为UTF-8保存。

 

(2)、必须有且仅有一个根元素

 

(3)、严格区分大小写

 

(4)、属性值用引号(双引号或单引号) :等号分开的名称-值对;在一个元素上,相同的属性只能出现一次

 

(5)、标记成对;

 

(6)、空标记关闭;

 

(7)、元素正确嵌套。

 

2.元素命名规则

 

(1)、名称中可以包含字母、数字或者其他可见字符;

 

(2)、名称不能以数字开头;

 

(3)、不能以 XML/xml/Xml…开头;

 

(4)、名称中不能含空格;

 

(5)、名称中不能含冒号(注:冒号留给命名空间使用)

 

3.实体

 

实体叫 ENTITY,实体的作用是避免重复输入。作用相当于宏或者变量。

 

(1)内置的 5 种实体: < <;> >;& &;" ";'

 

(2)自定义实体: <!DOCTYPE 根元素[

 

<!--实体声明-->

 

<!ENTITY 实体名 "实体内容">

 

]>

 

4.文档类型声明

 

文档类型定义——DOCTYPE,文档类型声明,紧跟 XML 声明之后,包含所有实体声明

 

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

 

<!DOCTYPE 根元素标记名[

 

<!--实体声明-->

 

]>

 

5.CDATA

 

用于把整段文本解释为纯字符数据而不是标记的情况。如包含大量的<、>、&、或者"字符。CDATA 节中的所有字符都会被当做元素字符数据的常量部分,而不是 XML 标记,可以输入除]]>外任意字符,不能嵌套。

 

6.PCDATA

 

PCDATA 的意思是被解析的字符数据(parsed character data)。

 

可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

 

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 >的内置实体来分别替换它们。

 

.XML解析

 

基本的解析方式有两种:一种叫 SAX,另一种叫 DOM。SAX(Simple API for XML)是基于事件流的解析,DOM(Document Object Model)是基于 XML 文档树结构的解析。SAX:效率高,数据量小,仅一次获取 ,DOM:整颗树加载到内存中,耗内存,可多次获取。

 

1 、DOM 解析

 

与 js 中的类似,使用 JAXP(Java API for XML Parsing),即:用于 XML 解析的 Java API.DOM(Document Object Model, 文档对象模型),在应用程序中,基于 DOM 的 XM分析器将一个 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();

 

//设置编码

 

上海尚学堂智能科技有限公司

 

www.shsxt.com

 

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);

 

}

 

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());

 

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 发挥了很多新特性,比如输出格式就可以很好解析

 

File file = new File("resource/outputdom4j.xml");

 

SAXReader reader = new SAXReader();

 

// 读取文件作为文档

 

Document doc = reader.read(file);

 

// 获取文档的根元素

 

Element root = doc.getRootElement();

 

// 根据跟元素找到全部的子节点

 

Iterator<Element> iter = root.elementIterator();

 

while(iter.hasNext()){

 

Element name = iter.next();

 

System.out.println("value = " + name.getText());

 

}

 

创建

 

// 使用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("resource/outputdom4j.xml");

 

XMLWriter writer = new XMLWriter(new FileOutputStream(new

 

File(file.getAbsolutePath())),of);

 

// 写出

 

writer.write(document);

 

writer.flush();

 

writer.close();

 

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 中.

 

.JavaWeb

 

1.简介: Java Web 是用 Java 技术来解决相关 web 互联网领域的技术总和。Web 包括:web 服务器和 web 客户端两部分。Java 在客户端的应用有 java applet,不过使用得很少,Java 在服务 器端的应用非常的丰富,比如 Servlet,JSP 和第三方框架等等。Java 技术对 Web 领域的发展 注入了强大的动力。Web 开发可以理解为做网站。

 

2. C/S 体系结构: C/S 是 Client/Server 的缩写,即 客户端/ 服务器结构。在这种结构中,服务器通常采用高 性能的 PC 机或工作站,并采用大型数据库系统(如 Oracle 或SQL Server),客户端则需要安装专用的客户端软件。这种结构可以充分利用两端硬件环境的优势,将任务合理分配到客户端和服务器,从而降低了系统的通信开销。在 2000 年以前,C/S 结构占据网络程序开发领域的主流。

 

3. B/S 体系结构

 

B/S 是Browser/Server 的缩写,即 浏览器/ 服务器结构。在这种结构中,客户端不需要开发任何用户界面,而统一采用如IE、Firefox、Chrome等浏览器,通过 Web 浏览器向 Web 服务器发送请求,由Web 服务器进行处理,并将处理结果逐级传回客户端。这种结构利用不断成熟和普及的浏览器技术实现原来需要复杂专用软件才能实现的强大功能,从而节约了开发成本,是一种全新的软件体系结构。这种体系结构已经成为当今应用软件的首选体系结构。

 

. Web 应用程序

 

1. Web 应用程序的工作原理: Web 应用程序大体上可以分为两种,即静态网站和动态网站。早期的 Web应用主要是 静态页面的浏览,即静态网站。这些网站使用 HTML 语言来编写,放在 Web 服务器上,用户使用浏览器通过 HTTP 协议请求服务器上的 Web 页面,服务器上的 Web 服务器将接收到 的用户请求处理后,再发送给客户端浏览器,显示给用户.

 

2. Web 应用技术

 

(1). 客户端应用的技术: 在进行 Web 应用开发时,离不开客户端技术的支持。目前,比较常用的客户端技术包  HTML 语言、CSS、Flash 和客户端脚本技术。

 

(2). 服务器端应用的技术: 在开发动态网站时,离不开服务器端技术,比较传统和经典的 Web 服务器端技术主要 有:CGI、ASP、SERVLET/JSP、PHP等。

 

(3).主要应用技术: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 对每个请求都是单独启动一个线程,而不是进程

 

. Tomcat

 

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.

 

.HTTP协议

 

1. 浏览器中的书写格式:HTTP://IP地址:端口/资源路径/资源/属性.

 

2. HTTP 协议的主要特点:

 

(1).支持客户/服务器模式;(2). 简单快速;(3). 灵活;(4). HTTP1.1 支持持续连接;(5). 无状态;

 

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时,必须以“/”的形式给出,通常 这个工作浏览器自动帮我们完成。

 

4. HTTP 请求

 

http 请求由三部分组成,分别是:请求行、请求头、请求正文

 

通过 chrome 浏览器, F12à Network 查看.

 

5. HTTP 响应

 

在接收和解释请求消息后,服务器返回一个 HTTP 响应消息。HTTP 响应也是由三个部分组成,分别是:状态行、消息报头、响应正文.

 

6. 消息头

 

HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消 息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行), 消息报头(可选),空行(只有 CRLF 的行),消息正文(可选)组成。

 

每一个报头域都是由名字+“:”+空格+值组成,消息报头域的名字是大小写无关的。

 

请求头

 

请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。

 

Refere:该请求头指明请求从哪里来

 

如果是地址栏中输入地址访问的都没有该请求头 地址栏输入地址,通过请求可以看到,此时多了一个 Referer 的请求头,并且后面的值 为该请求从哪里发出,百度竞价,只能从百度来的才有效果,否则不算;通常用来做统计工作、 防盗链

 

响应头

 

响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和  Request-URI 所标识的资源进行下一步访问的信息。

 

Location:Location 响应报头域用于重定向接受者到一个新的位置。Location响应报头域,常用在更换域名的时候。 response.sendRedirect(“http://www.shsxt.com”) ;

 

Refresh:自动跳转(单位是秒),可以在页面通过 meta 标签实现,也可在后台实现。

 

<metahttp-equiv=”refresh” content=”3;url=http://www.shsxt.com”>.

 

.servlet

1.工作原理

 

执行过程

客户端发出请求 根据 web.xml 文件的配置,找到对应的 读取中的值找到对应的 找到该 class 并加载执行该 class,返回结果 由 Web 服务器将结果响应给客户端.

 

 

2.生命周期

Servlet 没有 main()方法,不能独立运行,它的运行完全由 Servlet 引擎来控制和调度。 所谓生命周期,指的是 servlet 容器何时创建 servlet 实例、何时调用其方法进行请求的处理、 何时并销毁其实例的整个过程。(此处讨论默认的生命周期)

实例和初始化时机

当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创建实例并 进行初始化。

就绪/调用/服务阶段

有请求到达容器,容器调用 servlet 对象的 service()方法,处理请求的方法在整个声明周 期中可以被多次调用;

HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。但是, 这两个 do 方法默认情况下,会抛出异常,需要子类去 override。

销毁时机

当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁。上述的生命周期可以通过 Servlet 中的生命周期方法来观察。在 Servlet 中有三个生命周 期方法,不由用户手动调用,而是在特定的时机有容器自动调用,观察这三个生命周期方法 即可观察到 Servlet 的生命周期。init 方法,在 Servlet 实例创建之后执行(证明该 Servlet 有实例创建了)

 service 方法,每次有请求到达某个 Servlet 方法时执行,用来处理请求(证明该 Servlet 进行 服务了)destroy 方法,Servlet 实例销毁时执行(证明该 Servlet 的实例被销毁了)Servlet 的生命周期,简单的概括这就分为四步:servlet 类加载-->实例化-->

服务-->销毁。下面我们描述一下 Tomcat 与 Servlet 是如何工作的,看看下面的时序图.

 

1)Web Client 向 Servlet 容器(Tomcat)发出 Http 请求

2)Servlet 容器接收 Web Client 的请求

3)Servlet 容器创建一个 HttpRequest 对象,将 Web Client 请求的信息封装到这个对象中

4)Servlet 容器创建一个 HttpResponse 对象

5)Servlet 容器调用 HttpServlet 对象的 service 方法,把 HttpRequest 对象与 HttpResponse 对象作为参数,传给 HttpServlet 对象

6)HttpServlet 调用 HttpRequest 对象的有关方法,获取 Http 请求信息

7)HttpServlet 调用 HttpResponse 对象的有关方法,生成响应数据

8)Servlet 容器把 HttpServlet 的响应结果传给 Web Client

3. Servlet 的配置

servlet-name:Servlet 对象的名称

servlet-class:创建 Servlet 对象所要调用的类

param-name:参数名称

param-value:参数值

load-on-startup:Servlet 容器启动时加载 Servlet 对象的顺序

servlet-mapping/servlet-name:要与 servlet 中的 servlet-name 配置节内容对应url-pattern:客户访问的 Servlet 的相对 URL 路径.说明: url-pattern 可以配多个(一个 servlet 可以通过多个 url-pattern 访问)当多个 servlet 配置成了同一个 url-pattern,报错java.lang.reflect.InvocationTargetExceptionion 通配符 “*”只能放在最前面或最后面,不能放中间且不能单独存在(以/分割的,不能和单词组成整体)。 越精确越优先。常规配置即可。

.请求方式

1. 地址栏输入

2. 超链接

3. Form 表单

4. ajax

5. 请求转发

6. 重定向

. HttpServletRequest 对象

1.介绍: HttpServletRequest 对象:主要作用是用来接收客户端发送过来的请求信息,

例如:请求的参数,发送的头信息等都属于客户端发来的信息,service()方法中形参接收的是 HttpServletRequest 接口的实例化对象,表示该对象主要应用在HTTP 协议上,该对象是由 Tomcat 封装好传递过来。HttpServletRequest 是 ServletRequest 的子接口,ServletRequest 只有一个子接口,就是 HttpServletRequest。既然只有一个子接口为什么不将两个接口合并为一个?

从长远上讲:现在主要用的协议是 HTTP 协议,但以后可能出现更多新的协议。若以后想要支持这种新协议,只需要直接继承 ServletRequest 接口就行了。

在 HttpServletRequest 接口中,定义的方法很多,但都是围绕接收客户端参数的。但是怎么拿到该对象呢?不需要,直接在 Service 方法中由容器传入过来,而我们需要做的就是取出对象中的数据,进行分析、处理。

2.常用形式

1).常用方法

 

2).获取请求头

 

3).获取客户端请求参数

 

3. 请求 乱码解决

由于现在的 request 属于接收客户端的参数,所以必然有其默认的语言编码,主要是由于在解析过程中默认使用的编码方式为 ISO-8859-1(此编码不支持中文),所以解析时一定会出现乱码。要想解决这种乱码问题,需要设置 request 中的编码方式,告诉服务器以何种方式来解析数据。或者在接收到乱码数据以后,再通过相应的编码格式还原。

方式一:

这种方式只针对 POST 有效(必须在接收所有的数据之前设定)

方式二:

借助了 String 对象的方法,该种方式对任何请求有效,是通用的。

Tomcat8 起,以后的 GET 方式请求是不会出现乱码的。

4. 请求转发

请求转发,是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的 URL 地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。实现方式如下,达到多个资源协同响应的效果

5. request 作为 域对象

通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。

request.setAttribute():设置域对象内容;request.getAttribute(String name):获取域对象内容;request.removeAttribute(String name): 删除域对象内容。

request 域对象中的数据在一次请求中有效,则经过请求转发,request 域中的数据依然 存在,则在请求转发的过程中可以通过 request 来传输/共享数据

. HttpServletResponse 对象

1. 介绍

Web 服务器收到客户端的 http 请求,会针对每一次请求,分别创建一个用于代表请求的 request 对象和 代表响应的 response 对象。

request 和 response 对象代表请求和响应:获取客户端数据,需要通过request 对象; 向客户端输出数据,需要通过 response 对象。

HttpServletResponse 的主要功能用于服务器对客户端的请求进行响应,将Web 服务器处理后的结果返回给客户端。service()方法中形参接收的是HttpServletResponse 接口的实例化对象,这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。

2. 常用方法

 

3. 刷新和页面自动跳转

所有头信息都是随着请求和回应自动发送到服务器端(客户端),在

response 中一个比 较常用的头信息就是刷新的指令,可以完成定时刷新的功能。resp.setHeader("refresh","2");

对于刷新的头信息,除了定时的功能外,还具备了定时跳转的功能,可以让一个页面定时跳转到一个指定的页面。(已经注册成功,两秒后跳转到登陆页面)

response.setHeader("refresh","3;URL=ok.html");

但是这种跳转不是万能的,有时候根本就无法进行跳转操作,返回后刷新不会跳转;对于这种定时跳转的头信息,也可以采用 HTML 的方式进行设置,HTML本身也可以设 置头信息。(客户端跳转)

4. 数据响应

接收到客户端请求后,可以通过 HttpServletResponse 对象直接进行响应,响应时需要获取输出流,有两种形式 getWriter() 获取字符流( 只能响应回字符);getOutputStream() 获取字节流( 能响应一切数据)。响应回的数据到客户端被浏览

器解析。注意:两者不能同时使用。

5. 乱码解决

我们会发现在上述的响应中,如果我们响应的内容中含有中文,则有可能出现乱码。这是因为服务器响应的数据也会经过网络传输,服务器端有一种编码方式,在客户端也存在一种编码方式,当两端使用的编码方式不同时则出现乱码。getWriter() 的字符乱码对于 getWriter()获取到的字符流,响应中文必定出乱码,由于服务器端在进行编码时默认会使用 ISO-8859-1 格式的编码,该编码方式并不支持中文。所以要解决该种乱码只能在服务器端 告知服务器使用一种能够支持中文的编码格式,比如我们通常用的“UTF-8” resp.setCharacterEncoding("UTF-8");,此时还只完成了

一半的工作,要保证数据正确显示,还需要 指定客户端的解码方式

resp.setHeader("content-type", "text/html;charset=UTF-8");,和服务器一致。两端指定编码后,乱码就解决了。一句话:保证发送端和接收端的编码一致以上两端编码的指定也可以使用一句替代,同时指定服务器和客户端resp.setContentType("text/html;charset=utf-8");

getOutputStream() 字节乱码对于 getOutputStream()方式获取到的字节流,响应中文时,由于本身就是传输的字节, 所以此时可能出现乱码,也可能正确显示,这就看人品了^_^。当服务器端给的字节恰好和客户端使用的编码方式一致时则文本正确显示,否则出

现乱码。无论如何我们都应该准确掌握服务器和客户端使用的是那种编码格式,以确保数据正确显示。指定客户端和服务器使用的编码方式一致即可.

posted @ 2020-01-02 16:02  数据阮小白  阅读(216)  评论(0编辑  收藏  举报