CGI编程学习之浅入HTML

http协议属于应用层协议,全称为超文本传输协议。 hyper text transfer protocol
是用于browser(浏览器)和server(服务器)之间进行数据交互的传输协议 是基于TCP协议的,一般工作与B/S架构
默认端口号是80,也可以自己修改为8080或其他端口

三点注意事项:

1.无连接:指的是限制每次连接只处理一个请求。服务器处理完用户的请求,并收到用户的应答后,即断开连接。 采用这种方式可以节省传输时间。
2.媒体独立的:只要客户端和服务器知道如何处理的数据,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
3.无状态:HTTP采用的是无状态协议。 无状态是指协议对于事务处理没有记忆能力。 缺少状态意味着如果后续处理需要签名的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
另一方面,服务器不需要先前信息时它的应答就较快。

http协议格式
在这里插入图片描述

客户端请求消息格式:

客户端发送一个http请求到服务器的请求消息包括以下格式: 请求行、请求头部、空行和请求数据。
请求头部可以多行,所以空行的目的就是区分请求头部和请求数据的。
请求行中包括请求方法,URL(浏览器地址栏的一个访问地址),http协议版本(目前使用的是http1.1版本)

请求行是由请求方法字段、URL字段、http协议版本字段三个部分组成,请求行定义了本次请求的方式。
格式如下:GET/example.html HTTP/1.1(CRLF)

http中共定义了八种请求方式:

OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT
其中最常用的就是get和post,其他请求方式都可以通过这两种方式间接的实现

get和post方法的区别?

get通常用来从服务器上获得数据,而非修改信息;post用来向服务器传递数据
1.请求数据时带参数时:get请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。post请求会把请求的数据放置在http请求包的包体中。
因此,get请求的数据会暴露在地址栏中,而post请求则不会。
2.传输数据的大小:在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。 但是在实际开发过程中,对于get,特定的浏览器和服务器对URL的长度有限制。因此,在使用get请求时,传输数据会受到URL长度的限制。
对于post,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对post提交数据大小进行限制,Apache、IIS都有各自的配置。
3.安全性:post的安全性比get的高。因为get所传输的数据都会显示在浏览器的地址栏里。

请求头:也被称作消息报头,请求头是由一些键值对组成,每行一对,关键字和值用英文冒号“:” 分隔。允许客户端向服务器发送一些附加信息或者客户端自身的信息
典型的请求头如下:

Accept:作用:指定客户端能够接收的内容类型;示例:Accept:text/html
Accept-Charset:作用:浏览器可以接受的字符编码集;示例:Accept-Charset:utf-8
Accept-Language:作用:浏览器可接受的语言;示例:Accept-Language:en
Connection:作用:表示是否需要持久连接,注意HTTP1.1默认进行持久连接;示例: Connection:close
Content-Length:作用:请求的内容长度:示例:Content-Length:348
Content-Type:作用:请求与实体对应的MIME信息

服务器响应消息格式:
在这里插入图片描述

http响应消息也由四个部分组成 状态行、消息报头、空行和响应正文 状态行有三部分构成,HTTP协议的版本号、状态码、以及对状态码的文本描述
如:HTTP/1.1 200 OK(CRLF) 200表示请求已经成功
一般状态行都是由服务器自动添加的,一般不需要人工添加。

HTML(hyper text Markup language)超文本标记语言

HTML不是一种编程语言,而是一种标记语言,是用来描述网页的一个语言。
web浏览器的作用是读取HTML文档,并以网页的形式显示出他们,浏览器不会显示HTML标签,而是使用标签来解释页面的内容。

HTML语言的使用
首先需要布置网页框架
在Visual Studio Code里打开.html文件,然后输入html,选择html:5回车,会自动补全框架。
在这里插入图片描述

或者直接输入!,回车,也可以自动补全。
在这里插入图片描述

补全之后:在这里插入图片描述
<title>是浏览器页面的标题
<head>是头,用来编写协议数据
<body>是数据体,用来编写网页显示内容

1.标签格式:

(1)有尖括号包围的关键字,如:<html>(单标签)
(2)通常成对存在,如:<body></body>(双标签)
(3)上面的标签前面是开始标签,后面是结束标签

2.标签分类:

(1)单标签:也称空标签 <标签名 /> 如:<br/>
(2)双标签:成对存在 <标签名> 内容 </标签名>(相当于C语言里的大括号)

3.自动补全标签解释:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
</html>

(1)HTML标签:作用所有HTML中标签的一个根节点。 最大的标签 根标签 ,可以嵌套一些标签
(2)head标签:文档的头部;文档的头部描述了文档的各种属性和信息,包括文档的标题、在 Web 中的位置以及和其他文档的关系等。绝大多数文档头部包含的数据都不会真正作为内容显示给读者。 比如说用于存放title、meta、base、style、script、link 注意:在head标签中我们必须要设置的标签是title
(3)title标签:文档的标题,作用:让页面拥有一个属于自己的标题
<title>Document</title>
在这里插入图片描述

(4)body标签:文档的主体 以后我们的页面内容 基本都是放到body里面的 body 元素包含文档的所有内容(比如文本、超链接、图像、表格和列表等等。),页面的主体部分, 用于存放所有的html标签:a、p、h、div、span、img…

常用标签:
1.h1~h6标题标签

格式:<hn> 标题文本 </hn>

举例:

<h1>这是标题标签</h1> 
<h2>这是标题标签</h2> 
<h3>这是标题标签</h3> 
<h4>这是标题标签</h4> 
<h5>这是标题标签</h5> 
<h6>这是标题标签</h6>

在这里插入图片描述

2.p段落标签
一个段落中会根据浏览器窗口的大小自动换行

格式:<p> 文本内容 </p>

<p>单片微型计算机简称单片机(MCU(MicrbControl Unit)),我们自己的个人计算机中,CPU、RAM、ROM、I/O这些都是单独的芯片,然后这些芯片被安装在一个主板上,这样就构成了我们的PC主板,进而组装成电脑,而单片机只是将这所有的集中在了一个芯片上而已。单片机又有8位的如51单片机、16位的如MSP430、32位的如STM32,通常我们说的多少位通常指的是内核(CPU)一次处理的数据宽度。也就是说内核一次处理的位数越多单片机的计算速度就越快,性能也就越强悍。</p>
<p>ARM公司只设计内核不生产芯片,他会将有关内核的技术授权给各半导体厂商例如ST、TI、Atme1、NXP等厂商。这些厂商都是基于这个内核自己设计片上外设如SRAM、ROM、FLASH、USART、GPIO等,然后集成到一个硅片上,这就是我们现在用的芯片。</p>
    

在这里插入图片描述

3.br换行标签

格式:<br />

hello world

在这里插入图片描述

hello <br/>world

在这里插入图片描述

4.div标签:(相当于是个盒子,定义了一个模块,可以理解为C语言中的函数封装)
是一个块级元素,可以把文档分割为独立的、不同的部分,可以在div中嵌套标签
举例:

<div class="news"> 
<h2>News headline 1</h2> 
<p>some text. some text. some text...</p> 
</div>

在这里插入图片描述

注:可以给div设置class或id,通过选择器设置属性,则内部成员具有相同属性
这里将div里的标签设置了一个class选择器,并规定这个类选择器的名字为news,之后再给这个类选择器设置样式等属性的时候,就可以直接对整体进行操作。

5.input表单标签,是输入的意思,单标签

格式:<input type=”” name=”” value=”” id=””…>

这里重点讲type为text、radio

当type为text,表示是文本输入框 用法:
当type为radio,表示是单选框 用法:

解释:
name:控件名称,同一组单选框设置相同名称 
Value:必须要有,是当点击时会提交的数据 
Onclick:点击时会执行双引号中的处理函数 
Checked:默认选中,同一组中只设置一个即可


举例:text 文本框,radio 单选按钮

<input type="text" name="username" value="admin">
<br/><input type="radio" name="sex" checked="checked"><input type="radio" name="sex" >

value为默认值
checked表示默认选中

在这里插入图片描述

6.label标签
label标签可以绑定input标签,做input标签的标注,相当于是一个表单元素,当点击label标签的时候,被绑定的表单元素就会获得输入焦点。
举例:

 <label for="male"> Male </label> 
 <input type="radio" name="sex" id="male" value="male">

注:这里for要跟input中的id一致,标签的显示内容要在双标签之间。
在这里插入图片描述

此时点击Male也可以选中单选框




全部代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <h1>这是标题标签</h1> 
    <h2>这是标题标签</h2> 
    <h3>这是标题标签</h3> 
    <h4>这是标题标签</h4> 
    <h5>这是标题标签</h5> 
    <h6>这是标题标签</h6>
    <p>单片微型计算机简称单片机(MCU(MicrbControl Unit)),我们自己的个人计算机中,CPU、RAM、ROM、I/O这些都是单独的芯片,然后这些芯片被安装在一个主板上,这样就构成了我们的PC主板,进而组装成电脑,而单片机只是将这所有的集中在了一个芯片上而已。单片机又有8位的如51单片机、16位的如MSP430、32位的如STM32,通常我们说的多少位通常指的是内核(CPU)一次处理的数据宽度。也就是说内核一次处理的位数越多单片机的计算速度就越快,性能也就越强悍。</p>
    <p>ARM公司只设计内核不生产芯片,他会将有关内核的技术授权给各半导体厂商例如ST、TI、Atme1、NXP等厂商。这些厂商都是基于这个内核自己设计片上外设如SRAM、ROM、FLASH、USART、GPIO等,然后集成到一个硅片上,这就是我们现在用的芯片。</p>
    hello <br/>world
    <div class="news"> 
        <h2>News headline 1</h2> 
        <p>some text. some text. some text...</p> 
    </div>
    <input type="text" name="username" value="admin">
    <br/><input type="radio" name="sex" checked="checked"><input type="radio" name="sex" >
    <br/>
    <label for="male">Male</label> 
    <input type="radio" name="sex" id="male" value="male">
</body>
</html>




那么如何实现对数据的传输呢
比如以上的单选框,在选择男或者女时执行对应的操作,或者文本框的值被利用。

需要在标签中加入onclick属性,onclick需要绑定fun函数进行使用,fun()函数的参数用id和value都可以

<label for="male"> Male </label> 
<input type="radio" name="sex" id="male" value="male" onclick="fun(value)">
<label for="female"> Female </label> 
<input type="radio" name="sex" id="female" value="female" onclick="fun(value)">

fun函数需要自己编写,位置位于head标签和body标签之间。
需要包含js的一个脚本文件 src=“文件路径/xhr.js”

<script src="./xhr.js"></script>
<script>
    function fun(obj) {
        var v = "set " + obj;
        console.log(v);
    }
</script>


按f12打开后台,在console中查看所得数值

在这里插入图片描述

在这里插入图片描述


使用post函数

this.post = function(url, data, callback)
url:访问地址
data:提交的数据
callback:回调函数

 <script>
    function fun(obj) {
        var v = "set " + obj;
        console.log(v);
		
		if(obj == "male")
		{
			XHR.post('/cgi-bin/web.cgi',v,function(x,info){})
		}else
		{
			XHR.post('/cgi-bin/web.cgi',v,function(x,info){})
		}
    }
</script>

因为只需要给服务器发送数据,不需要处理服务器回复的数据,所以function函数的处理为空就可以了


此时html页面为
在这里插入图片描述
完整代码为:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<script src="./xhr.js"></script>
<script>
    function fun(obj) {
        var v = "set " + obj;
        console.log(v);
    }
</script>

<body>
        <label for="male"> Male </label> 
        <input type="radio" name="sex" id="male" value="male" onclick="fun(value)">

        <label for="female"> Female </label> 
        <input type="radio" name="sex" id="female" value="female" onclick="fun(value)">
</body>

</html>

采集cgi数据到文本框(刷新时请求)
首先添加声明window,代码默认是从上到下加载的,添加声明之后可以先加载下部分的标签,再执行函数

<script>
	window.onload = function()
	{
		init_fun();//引用函数
		function init_fun()//定义函数功能
		{
			//获取数据
			var req = document.getElementById("1");
			//document是固定的,input标签就用document
			console.log(req);//打印
			var r = "get=" + req.id;//单个数据不需要加下标
			console.log(r);
			XHR.post('cgi-bin/web.cgi',r,
			function(x,info)
			//服务器回复的数据放在info中
			//x是回复的整个信息,可以不用
			{
				console.log(info);
				req.value = info;//将获取得到数据在文本框中打印
			});
			//console.log(req[0].name);
			//req为一个数组,如果有多个元素的get值相同,那么req会存储多个数值
			//var req = document.getElementByName("sex");
			//这里如果有男女两个input的name都为sex的话req就会有两条数据
		}
	}
</script>
<body>
<label for="1"> 数据 </label>
<input type="text" name="40001" value="" id="1">
</body>

在这里插入图片描述
此时cgi进程没有运行,所以收不到info数据

xhr.js文件

/*

 * xhr.js - XMLHttpRequest helper class

 * (c) 2008-2010 Jo-Philipp Wich

 */



XHR = function()

{

	this.reinit = function()

	{

		if (window.XMLHttpRequest) {

			this._xmlHttp = new XMLHttpRequest();

		}

		else if (window.ActiveXObject) {

			this._xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

		}

		else {

			alert("xhr.js: XMLHttpRequest is not supported by this browser!");

		}

	}



	this.busy = function() {

		if (!this._xmlHttp)

			return false;



		switch (this._xmlHttp.readyState)

		{

			case 1:

			case 2:

			case 3:

				return true;



			default:

				return false;

		}

	}



	this.abort = function() {

		if (this.busy())

			this._xmlHttp.abort();

	}



	this.get = function(url,data,callback)

	{

		this.reinit();



		var xhr  = this._xmlHttp;

		var code = this._encode(data);



		url = location.protocol + '//' + location.host + url;



		if (code)

			if (url.substr(url.length-1,1) == '&')

				url += code;

			else

				url += '?' + code;



		xhr.open('GET', url, true);



		xhr.onreadystatechange = function()

		{

			if (xhr.readyState == 4) {

				var json = null;

				if (xhr.getResponseHeader("Content-Type") == "application/json")

				{

					try {

						json = eval('(' + xhr.responseText + ')');

					}

					catch(e) {

						json = null;

					}

				}

				else if (xhr.getResponseHeader("Content-Type") == "text/html")

				{

					json = xhr.responseText;

				}



				callback(xhr, json);

			}

		}



		xhr.send(null);

	}



	this.post = function(url, data, callback)

	{

		this.reinit();



		var xhr  = this._xmlHttp;

		var code = this._encode(data);

		

		

		xhr.onreadystatechange = function()

		{

			if (xhr.readyState == 4)

			{

				var json = null;

				var header = xhr.getResponseHeader("Content-Type");

				if (header == "application/json")

				{

					try

					{

						json = eval('(' + xhr.responseText + ')');

					}

					catch(e)

					{

						json = null;

					}

				}

				else if (header == "text/html")

				{

					json = xhr.responseText;

				}

			

				callback(xhr, json);

			}

		}



		xhr.open('POST', url, true);

		

		//xhr.setRequestHeader('Content-length', code.length);

		//xhr.setRequestHeader('Connection', 'close');

		xhr.send(code);

	}





	this.postwait = function(url, data, callback)

	{

		this.reinit();



		var xhr  = this._xmlHttp;

		var code = this._encode(data);

		

		xhr.onreadystatechange = function()

		{

			if (xhr.readyState == 4)

			{

				var json = null;

				var header = xhr.getResponseHeader("Content-Type");

				if (header == "application/json")

				{

					try

					{

						json = eval('(' + xhr.responseText + ')');

					}

					catch(e)

					{

						json = null;

					}

				}

				else if (header == "text/html")

				{

					json = xhr.responseText;

				}

			

				callback(xhr, json);

			}

		}



		xhr.open('POST', url, false);

		

		//xhr.setRequestHeader('Content-length', code.length);

		//xhr.setRequestHeader('Connection', 'close');

		xhr.send(code);

	}

	

	this.cancel = function()

	{

		this._xmlHttp.onreadystatechange = function(){};

		this._xmlHttp.abort();

	}



	this.send_form = function(form,callback,extra_values)

	{

		var code = '';



		for (var i = 0; i < form.elements.length; i++)

		{

			var e = form.elements[i];



			if (e.options)

			{

				code += (code ? '&' : '') +

					form.elements[i].name + '=' + encodeURIComponent(

						e.options[e.selectedIndex].value

					);

			}

			else if (e.length)

			{

				for (var j = 0; j < e.length; j++)

					if (e[j].name) {

						code += (code ? '&' : '') +

							e[j].name + '=' + encodeURIComponent(e[j].value);

					}

			}

			else

			{

				code += (code ? '&' : '') +

					e.name + '=' + encodeURIComponent(e.value);

			}

		}



		if (typeof extra_values == 'object')

			for (var key in extra_values)

				code += (code ? '&' : '') +

					key + '=' + encodeURIComponent(extra_values[key]);



		return(

			(form.method == 'get')

				? this.get(form.getAttribute('action'), code, callback)

				: this.post(form.getAttribute('action'), code, callback)

		);

	}



	this._encode = function(obj)

	{

		obj = obj ? obj : { };

		obj['_'] = Math.random();



		if (typeof obj == 'object')

		{

			var code = '';

			var self = this;



			for (var k in obj)

				code += (code ? '&' : '') +

					k + '=' + encodeURIComponent(obj[k]);



			return code;

		}



		return obj;

	}

}



XHR.get = function(url, data, callback)

{

	(new XHR()).get(url, data, callback);

}



XHR.post = function(url, data, callback)

{

	(new XHR()).post(url, data, callback);

}



XHR.postwait = function(url, data, callback)

{

	(new XHR()).postwait(url, data, callback);

}



XHR.send_form = function(form,callback,extra_values)

{

	(new XHR()).send_form(form,callback,extra_values);

}



XHR.poll = function(interval, url, data, callback)

{

	if (isNaN(interval) || interval < 1)

		interval = 5;



	if (!XHR._q)

	{

		XHR._t = 0;

		XHR._q = [ ];

		XHR._r = function() {

			for (var i = 0, e = XHR._q[0]; i < XHR._q.length; e = XHR._q[++i])

			{

				if (!(XHR._t % e.interval) && !e.xhr.busy())

					e.xhr.post(e.url, e.data, e.callback);

			}



			XHR._t++;

		};

	}



	XHR._q.push({

		interval: interval,

		callback: callback,

		url:      url,

		data:     data,

		xhr:      new XHR()

	});



	XHR.run();

}



XHR.halt = function()

{

	if (XHR._i)

	{

		/* show & set poll indicator */

		try {

			document.getElementById('xhr_poll_status').style.display = '';

			document.getElementById('xhr_poll_status_on').style.display = 'none';

			document.getElementById('xhr_poll_status_off').style.display = '';

		} catch(e) { }



		window.clearInterval(XHR._i);

		XHR._i = null;

	}

}



XHR.run = function()

{

	if (XHR._r && !XHR._i)

	{

		/* show & set poll indicator */

		try {

			document.getElementById('xhr_poll_status').style.display = '';

			document.getElementById('xhr_poll_status_on').style.display = '';

			document.getElementById('xhr_poll_status_off').style.display = 'none';

		} catch(e) { }



		/* kick first round manually to prevent one second lag when setting up

		 * the poll interval */

		XHR._r();

		XHR._i = window.setInterval(XHR._r, 1000);

	}

}



XHR.running = function()

{

	return !!(XHR._r && XHR._i);

}


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有只小白叫岳飒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值