JavaWeb——Servlet、HTTP、XML

Servlet

Servlet发展从复杂到简单,功能单一到功能强大。
 发展史
第一阶段:
JAVAEE规定了javax.servlet.Servlet规范,实现了servlet接口的类就是一个Servlet类
实现了该接口需要重写方法:
Init():执行初始化,servlet第一次被访问时执行。
destroy():执行销毁,服务器正常关闭的时候执行。
getServletConfig():获取servlet配置信息。
Service():处理每一个请求。
getServletInfo():获取servlet信息。
Servlet 需要实现接口内所有方法,但不会每个方法都用到,比较繁琐。

第二阶段:
定义了抽象类javax.servlet.GenericServlet实现了Servlet接口,
重写了出service()方法之外的其他几个方法。继承该类之后,只需要重写service()处理用户请求就可以了。
通过浏览器发送http请求的,判断是get请求还是post请求,分别处理。

第三阶段:
定义了抽象类javax.servlet.HttpServlet继承了GenericServlet,提供了doGet()处理get请求,doPost()处理post请求。
遵循http协议。

Servlet的生命周期:

  1. 客户端请求该 Servlet;
  2. 加载 Servlet 类到内存;
  3. 实例化并调用init()方法初始化该 Servlet;
  4. service()(根据请求方法不同调用doGet() 或者 doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions()、destroy())。
  5. 加载和实例化 Servlet。这项操作一般是动态执行的。然而,Server 通常会提供一个管理的选项,用于在 Server 启动时强制装载和初始化特定的 Servlet。

<load-on-startup>1</ load-on-startup >正数表示是启动服务器即加载

Servlet配置文件中的<url-pattern> </url-pattern>

1、全路径匹配;
请求路径需写完整的指定的请求。

  <servlet>

    <servlet-name>One</servlet-name>
    <servlet-class>ink.longpress.www.One</servlet-class>
    
  </servlet>
  
  <servlet-mapping>
  
    <servlet-name>One</servlet-name>
    <url-pattern>/Onea</url-pattern>
    
  </servlet-mapping>
请求路径:http://主机名/Onea
http://127.0.0.1:8080/2019-8-2_One/Onea

2、通配符匹配;
*作为通配符去使用

<servlet>
    <description></description>
    <display-name>Two</display-name>
    <servlet-name>Two</servlet-name>
    <servlet-class>ink.longpress.www.Two</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Two</servlet-name>
    <url-pattern>/two/*</url-pattern>
  </servlet-mapping>
请求路径:http://主机名/two/*
*表示任意内容
http://127.0.0.1:8080/2019-8-2_One/two/fghjk
http://127.0.0.1:8080/2019-8-2_One/two/999

3、扩展名匹配

<servlet>
    <servlet-name>Three</servlet-name>
    <servlet-class>ink.longpress.www.Three</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Three</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>

只要请求Html结尾的任意请求,就调用此响应。

 请求路径:http://主机名/*.html
*表示任意内容
http://127.0.0.1:8080/2019-8-2_One/1.html
http://127.0.0.1:8080/2019-8-2_One/fghjk.html

4、缺省匹配

如果以上三种匹配方式都没有找到对应的映射路径,就由缺省匹配处理。类似于switch结构的default;
一般不使用,会拦截的静态资源。

<servlet>
    <servlet-name>Four</servlet-name>
    <servlet-class>ink.longpress.www.Four</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Four</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

该方式将匹配所有请求。
http://127.0.0.1:8080/2019-8-2_One/fghjk.htmldsfdgfefdv

HTTP协议

包含:
请求协议:浏览器发送请求到服务器遵循的协议。
响应协议:服务器回送协议到浏览器遵循的协议。

HTTP协议的特点: 一次请求,一次响应。

HTTP是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。HTTP是一种协议规范,这种规范记录在文档上,为真正通过HTTP协议进行通信的HTTP的实现程序。

HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。

发展阶段
0.9
0.9协议是适用于各种数据信息的简洁快速协议,但是远不能满足日益发展的各种应用的需要。0.9协议就是一个交换信息的无序协议,仅仅限于文字。由于无法进行内容的协商,在双发的握手和协议中,并有规定双发的内容是什么,也就是图片是无法显示和处理的。

1.0
到了1.0协议阶段,也就是在1982年,TimBerners-Lee提出了HTTP/1.0。在此后的不断丰富和发展中,HTTP/1.0成为最重要的面向事务的应用层协议。该协议对每一次请求/响应建立并拆除一次连接。其特点是简单、易于管理,所以它符合了大家的需要,得到了广泛的应用。


到了1.0协议阶段,也就是在1982年,TimBerners-Lee提出了HTTP/1.0。在此后的不断丰富和发展中,HTTP/1.0成为最重要的面向事务的应用层协议。该协议对每一次请求/响应建立并拆除一次连接。其特点是简单、易于管理,所以它符合了大家的需要,得到了广泛的应用。

1.1
在1.0协议中,双方规定了连接方式和连接类型,这已经极大扩展了HTTP的领域,但对于互联网最重要的速度和效率,并没有太多的考虑。毕竟,作为协议的制定者,当时也没有想到HTTP协议会有那么快的普及速度。

2.0
HTTP2.0的前世是HTTP1.0和HTTP1.1。虽然之前仅仅只有两个版本,但这两个版本所包含的协议规范之庞大,足以让任何一个有经验的工程师为之头疼。网络协议新版本并不会马上取代旧版本。实际上,1.0和1.1在之后很长的一段时间内一直并存,这是由于网络基础设施更新缓慢所决定的。

HTML请求包含三个部分,请求行、请求头、请求体

post和get的区别:

1.使用Get请求时,参数在URL中显示,而使用Post方式,则不会显示出来
2.使用Get请求发送数据量小,Post请求发送数据量大

get请求:

请求行:

请求头:

请求体无数据。

post请求:

请求行:

请求头:

请求体:

username=jack&password=1234

常见的请求头:

常见请求头 描述
Referer 浏览器通知服务器,当前请求来自何处。如果是直接访问,则不会有这个头。常用于:防盗链 请求的来源。  
Cookie 与会话有关技术,用于存放浏览器缓存的cookie信息。(后面课程主讲)  
User-Agent 浏览器通知服务器,客户端浏览器与操作系统相关信息 用户-代理  
Connection 保持连接状态。Keep-Alive 连接中,close 已关闭
Host 请求的服务器主机名
Content-Length 请求体的长度
Content-Type 如果是POST请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码
Accept: 浏览器可支持的MIME类型。 MIME类型:互联网上为了具体传递文件类型的一种方式。 扩展名类型:硬盘上为了保存数据的一种文件类型方式,例如:*.html,*.jpg MIME格式:大类型/小类型[;参数] 例如:    text/html ,*.html,html格式的文本    text/css,*.css, css格式的文本    image/JPEG,*.jpg , JPEG格式的图片
Accept-Encoding 浏览器通知服务器,浏览器支持的数据压缩格式。如:GZIP压缩
Accept-Language 浏览器通知服务器,浏览器支持的语言。各国语言(国际化i18n)
If-Modified-Since 浏览器通知服务器,本地缓存的最后变更时间。与另一个响应头组合控制浏览器页面的缓存。(目前使用频率不高)

常见响应头:

由响应行、响应头、响应体组成

 响应行,

例如:HTTP/1.1 200 OK
Http/1.1 http的版本
状态码:
200: 响应成功
404: 请求路径错误
500: 服务中发生异常(代码写错了)
302: 重定向(明天讲)
304:缓存(校验码)
状态码描述:Ok

分类分类描述
1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

 响应头
响应头也是用的键值对k:v
服务器通过响应头来控制浏览器的行为,不同的头浏览器操作不同。

常见响应头 描述
Location 重定向的路径 指定响应的路径,需要与状态码302配合使用,完成跳转。(后面课程主讲)
Content-Type 响应正文的类型(MIME类型) 取值:text/html;charset=UTF-8
Content-Disposition 正文-配置。   在文件下载时才会使用 通过浏览器以下载方式解析正文(后面课程主讲) 取值:attachment;filename=xx.zip
Set-Cookie 与会话相关技术。服务器向浏览器写入cookie(后面课程主讲) 服务器和浏览器之间传递的一张小纸条
Content-Encoding 服务器使用的压缩格式 取值:gzip
Content-length 响应正文的长度
Server 指的是服务器名称,默认值:Apache-Coyote/1.1。可以通过conf/server.xml
Last-Modified 服务器通知浏览器,文件的最后修改时间。与If-Modified-Since一起使用。(目前不用)

响应体:

服务器对浏览器的响应。

XML

可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。

它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。
是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。

  1. 标签是自定义的
  2. 现在主要用来写配置文件
  3. 储存数据(已弃用)
  4. 传递参数(已弃用)

格式:

  1. 文档声明
  2. 元素
  3. 属性
  4. 注释
  5. CDATA

常见转义

字符十进制转义字符
"&#34;&quot;
&&#38;&amp;
<&#60;&lt;
>&#62;&gt;
不断开空格(non-breaking space)&#160;&nbsp;
<?xml version="1.0" encoding="utf-8"?>
<!-- 文档申明 -->

<!-- 元素 属性 -->
<root>
	<book id="x11">
		<name>F##k</name>
		<author>Jack</author>
		<price>9999999.99</price>
		
		<!-- CDATA -->
		<![CDATA[< >]]>
	</book>
	
	<book id="x22">
		<name>Kick</name>
		<author>Queen</author>
		<price>7777777.77</price>
		
		<!-- CDATA -->
		<![CDATA[<\>]]>
	</book>
	<foot>
		<message>完成</message>	
	</foot>
</root>

可通过IO流获取文件,
但使用解析更加方便。

  1. DOM:将整个XML文件解析到内存中
    解析成一个Document对象
    a)优点:元素与元素之间保留结构关系,故可以进行增删改查操作。 b)缺点:XML文档过大,可能出现内存溢出
  2. SAX:是一种速度更快,更有效的方法。她逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进 行具体解析,没执行一行,都触发对应的事件。(了解)
    a)优点:处理速度快,可以处理大文件
    b)缺点:只能读,逐行后将释放资源,解析操作繁琐
  3. PULL:Android内置的XML解析方式,类似SAX。

解析器:

在开发过程中一般会使用解析器来读取XML文档。

常见的解析器:

  • JAXP:sun公司提供支持DOM和SAX开发包Dom4j:比较简单的的解析开发包
  • JDom:与Dom4j类似
  • Jsoup:功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便。

Jsoup解析器

package ink.longpress.www;

import java.io.File;
import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.junit.Test;

public class Four_readXML {
	
	@Test
	public void readXML() throws IOException {
		File file = new File("src/demo.xml");
		Document document = Jsoup.parse(file, "utf-8");
		
		//获取XML中的所有name内容
		Elements elementsByTag = document.getElementsByTag("name");
		
		for (Element element : elementsByTag) {
			System.out.println(element.text());
		}
		System.out.println("_______________________________________________________________");
		
		//获取XML中的第二name内容
		Element element = document.getElementsByTag("name").get(1);
		System.out.println(element.text());
		System.out.println("_______________________________________________________________");
		
		//获取Book属性元素内容
		Elements elementsByTag2 = document.getElementsByTag("book");
		String attr = elementsByTag2.attr("id");
		System.out.println(attr);
	}
}

Dom4j解析器

package ink.longpress.www;

import java.io.File;
import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

public class Five_dom4j {

	@Test
	public void readXML() throws DocumentException {
		//创建SAXReader对象
		SAXReader saxReader = new SAXReader();
		
		//加载读取XML文件
		Document read = saxReader.read(new File("src/demo.xml"));
		
		//获取根标签内的文件
		Element rootElement = read.getRootElement();
		
		//遍历根标签下的文件
		Iterator elementIterator = rootElement.elementIterator();
		while (elementIterator.hasNext()) {
			Element element = (Element) elementIterator.next();
			Iterator ei = element.elementIterator();
			//获取子节点
			while (ei.hasNext()) {
				Element element2 = (Element) ei.next();
				System.out.println(element2.getText());
			}
		}
	}
}

jingsongchan

一条回应:“JavaWeb——Servlet、HTTP、XML”

  1. 一稿计划说道:

    踩踩,记得回踩哦
    🤭🤭🤭🤭🤭🤭🤭🤭🤭🤭🤭🤭🤭🤭🤭🤭🤭🤭

发表评论

电子邮件地址不会被公开。 必填项已用*标注