学习Java之前,我们需要了解一定的前端知识。毕竟页面才是用户真正看到的,而且也是体现Java后端逻辑结果的地方。
学习HTML后,能够制作界面美观大方的静态网站(更复杂的功能需要JavaScript脚本一起来实现)。
HTML制作的网页。
所需要的Html开发工具,可使用Hbuilder。
下载路径:https://www.dcloud.io/
第一次写文章,不知道链接会不会被屏蔽,如果看不到可以自行百度,直接搜索Hbuilder,进入官网下载安装,安装完打开软件后,点击暂不登陆,你懂的(免费使用)。
网页一般使用Chrome,IE的兼容性比较差,学习建议使用Chrome。
下载路径:https://www.google.cn/chrome/
作者推荐的学习用软件,都为免费,放心下载使用。
一、在Hbuilder中如何来创建页面
1、文件->新建->web项目
2、给项目起名(也可以修改路径,命名用英文或者拼音缩写,用中文可能开发会出错)
Hbulider创建项目
3、完成
4、右击新建的项目:新建->HTML文件
5、为新的文件重命名,以html作为后缀
6、完成
Hbuilder创建Html文件
7、选择页面,点击在浏览器中运行按钮
在浏览器中运行按钮
以下新手笔试或者面试容易考
HTML是HyperText Markup Language缩写,意为超文本标记语言,“超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。
特点:
1、简易性
2、可扩展性
3、平台无关性
4、通用性
HTML的结构
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<h1>Hello Java</h1>
<h2>Hello Html</h2>
</body>
</html>
HTML的结构详解:(了解即可,一般开发软件会自动生成,如不生成,那就找个会生成的软件,复制黏贴)
<!DOCTYPE html>:文件类型声明,H5中就这么一种写法。
<html>:告知浏览器其自身是一个 HTML 文档,限定了文档的开始点和结束点
<head>:文档的头部描述了文档的各种属性和信息,包括文档的标题、字符集等信息。绝大多数文档头部包含的数据都不会真正作为内容显示给读者。在head中可以定义样式,引用样式,也可以定义脚本和引用脚本
<body>:文档的主体部分,包含文档的所有内容(比如文本、超链接、图像、表格和列表等等。),body部分的内容一般就是直接呈现给用户的部分
网页中的乱码问题:
<!DOCTYPE html>
<html>
<head>
<meta charset="gb2312">
<title></title>
</head>
<body>
<h1>Hello Java</h1>
<h2>Hello Html</h2>
你好
</body>
</html>
运行以上代码,可以在网页中看到,“你好”两个字为乱码。这是<meta charset="gb2312">搞的鬼。
当文件本身的字符集编码以与网页head部分指定的字符集编码不一致时,就会产生乱码问题,可以在head部分的meta标签中指定和文件一样的字符集编码来解决这一问题。<meta charset="utf-8" />
从执行上面的代码也可以看出,html是按从上到下的顺序来显示的。
下一篇内容:Html各种标签的认识和使用。
些日子将自己的网站升级为HTTPS,这次再设置支持HTTP2.0。本篇文章不讲述HTTP2的具体原理,但关于HTTP的相关知识会简单讲述一下,关于HTTP2的详细内容可以参看HTTP2基础教程。
基础不牢,地动山摇。为了优化HTTP1,开发人员们最大化的发挥了自己的聪明才智。
如Steve Souders这种大牛,写了《高性能网站建设指南》和姊妹篇《高性能网站建设进阶指南》,堪称Web性能科学的奠基之作。
开发人员们也想出了各种实用方案,经常使用的Web性能优化技术有:
还有一些反模式的方案
我们做这一切,不管多么麻烦多么艰辛,主要是为了优化性能,填HTTP1给我们埋的坑,虽然治标不治本。幸运的是,HTTP2来了。
1.二进制协议
2.HTTP/2是完全多路复用的,而非有序并阻塞的
3.首部压缩
4.HTTP/2让服务器可以将响应主动“推送”到客户端缓存中
现在让我们看看没有升级前,https://www.asap2me.top/显示的结果
Chrome显示协议为http/1.1
目前环境是:Centos7.6
Web服务:GoLang
Web服务端口号:8080
反向代理:Nginx
系统已经配置好Nginx,也支持HTTPS,关于如何安装Nginx和配置HTTPS可以参考HTTPS配置实战
因为证书已经安装成功,这里主要讲解Nginx如何支持HTTP2。
1.查看当前模块/usr/local/nginx/sbin/nginx -V
2.进入nginx源码包目录/home/work/nginx-1.12.0
3.重新编译,增加httpv2模块。./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module
4.make编译,这里不要进行 make install,否则就是覆盖安装。
5.修改nginx配置:listen 443 ssl http2;
6.重启nginx:sudo ./nginx -s reload (如果不生效就kill进程,重启nginx)
1.直接使用curl请求
curl --http2 -v https://www.asap2me.top -k
2.使用线上资源 https://myssl.com/http2_check.html
3.谷歌浏览器直接请求
使用HTTP2的性能未必会比HTTP1好,有时候也需要看业务场景。跟其他任何性能调优尝试一样,HTTP2可能也要经历编码、测试、分析以及优化的迭代过程。总体来说通过不断的优化,终会比HTTP1好。
使用ab对http1进行压力测试:
ab -k -c 10 -t 180 -n 10000 https://www.asap2me.top/
ab -k -c 10 -t 180 -n 10000 https://www.asap2me.top/
This is ApacheBench, Version 2.3 <$Revision: 1874286 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking www.asap2me.top (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.12.0
Server Hostname: www.asap2me.top
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
Server Temp Key: ECDH P-256 256 bits
TLS Server Name: www.asap2me.top
Document Path: /
Document Length: 12 bytes
Concurrency Level: 10
Time taken for tests: 30.967 seconds
Complete requests: 10000
Failed requests: 0
Keep-Alive requests: 9905
Total transferred: 1749525 bytes
HTML transferred: 120000 bytes
Requests per second: 322.93 [#/sec] (mean)
Time per request: 30.967 [ms] (mean)
Time per request: 3.097 [ms] (mean, across all concurrent requests)
Transfer rate: 55.17 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 9.5 0 121
Processing: 25 30 3.0 30 266
Waiting: 25 30 3.0 30 266
Total: 25 31 10.0 30 266
Percentage of the requests served within a certain time (ms)
50% 30
66% 30
75% 31
80% 31
90% 32
95% 33
98% 35
99% 115
100% 266 (longest request)
使用h2load对HTTP2进行压力测试:
h2load -n 10000 -c 6 -T 180 https://www.asap2me.top/
h2load -n 10000 -c 10 -T 180 https://www.asap2me.top/
starting benchmark...
spawning thread #0: 10 total client(s). 10000 total requests
TLS Protocol: TLSv1.2
Cipher: ECDHE-RSA-AES128-GCM-SHA256
Server Temp Key: ECDH P-256 256 bits
Application protocol: h2
progress: 10% done
progress: 20% done
progress: 30% done
progress: 40% done
progress: 50% done
progress: 60% done
progress: 70% done
progress: 80% done
progress: 90% done
progress: 100% done
finished in 31.71s, 315.37 req/s, 27.74KB/s
requests: 10000 total, 10000 started, 10000 done, 10000 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 10000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 879.55KB (900660) total, 585.94KB (600000) headers (space savings 47.37%), 117.19KB (120000) data
min max mean sd +/- sd
time for request: 26.66ms 262.63ms 29.48ms 3.05ms 98.04%
time for connect: 97.46ms 106.95ms 99.53ms 3.16ms 80.00%
time to 1st byte: 127.59ms 141.29ms 130.75ms 4.77ms 80.00%
req/s : 31.54 35.41 33.82 1.14 80.00%
HTTP1.1和HTTP2压测后,在总时间上差别不大,主要是因为测试的接口不合适。不过我们仍能看出,在机器CPU和流量上,HTTP2是有大幅提升的。
将服务升级为支持HTTP2.0,需要考虑如下问题:
写文章的过程中,突然报这个错误,还以为配置的问题,后来发现是需要备案。
大家如果在腾讯云买的域名,备案方法:https://icp-faq.dnspod.cn/why
如果是新的服务,建议一开始就部署HTTP2,对于老的服务,也推荐升级为HTTP2。对于性能测试,推荐一个网站https://www.webpagetest.org/。
写博客是一个好事情,写完这个文章,至少又有几点值得写:
下一篇文章可以写写多路复用的具体实现。
大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)
我的个人博客为:https://shidawuhen.github.io/
往期文章回顾:
技术
读书笔记
思考
ttps://www.w3school.com.cn/js/index.asp
1.javascript 运算符
JavaScript 使用(=)复制运算符。
JavaScript 使用算数运算符(+ - * / % ++ --)来计算值。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript">
function suanshu(){
//声明变量
var num1=10;
var num2=3;
document.getElementById("h1").innerHTML=num1+"+"+num2+"="+(num1+num2);
document.getElementById("h1").innerHTML=num1+"-"+num2+"="+(num1-num2);
document.getElementById("h1").innerHTML=num1+"*"+num2+"="+(num1*num2);
document.getElementById("h1").innerHTML=num1+"/"+num2+"="+(num1/num2);
document.getElementById("h1").innerHTML=num1+"%"+num2+"="+(num1%num2);
//++[自动加1]
//变量++ 【先用后加】
//num1++; //10
//document.getElementById("h6").innerHTML=num1; //11
// ++变量 [先加后用]
//++num1; //11
//document.getElementById("h6").innerHTML=num1; //11
// -- [自动减1]
// 变量-- [先用后减]
//num1-- ; //10
//document.getElementById("h6").innerHTML=num1; //9
// -- 变量
--num1; // 9
document.getElementById("h6").innerHTML=num1; //9
}
</script>
</head>
<body>
<input type="button" name="" id="" value="测试算数运算符" onclick="suanshu()" /><br>
<h1 id="h1"></h1>
<h1 id="h2"></h1>
<h1 id="h3"></h1>
<h1 id="h4"></h1>
<h1 id="h5"></h1>
<h1 id="h6"></h1>
</body>
</html>
JavaScript 使用(> < == >= <= !=)比较运算符运算符。
比较运算符的结果一定是布尔值【true/false】
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>javascript中的比较运算符</title>
<script>
//测试比较运算符的函数
function test1(){
//定义参与运算的变量
var num1=10;
var num2=3;
document.getElementById("h1").innerHTML=num1+">"+num2+" = "+(num1>num2);//true
document.getElementById("h2").innerHTML=num1+"<"+num2+" = "+(num1<num2);//false
document.getElementById("h3").innerHTML=num1+">="+num2+" = "+(num1>=num2);//true
document.getElementById("h4").innerHTML=num1+"<="+num2+" = "+(num1<=num2);//false
document.getElementById("h5").innerHTML=num1+"=="+num2+" = "+(num1==num2);//false
document.getElementById("h6").innerHTML=num1+"!="+num2+" = "+(num1!=num2);//true
}
</script>
</head>
<body>
<input type="button" value="测试比较运算符" onclick="test1();" />
<h2 id="h1"></h2>
<h2 id="h2"></h2>
<h2 id="h3"></h2>
<h2 id="h4"></h2>
<h2 id="h5"></h2>
<h2 id="h6"></h2>
</body>
</html>
JavaScript 使用(|| && ! )逻辑运算符运算符。
|| [逻辑或] true || false --> true
false || true --> true
true || true --> true
false || false --> false
只要有true结果就是true
&& [逻辑与] true && false --> false
&emspfalse && true --> false
&emspfalse && false --> false
&emsptrue && true --> true
&emsp只要有false结果就是false
![取反] !ture–>false
!false->true
逻辑运算符的运算值和运算结果一定是布尔值【true/false】
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript">
测试逻辑运算符
function test1(){
var num1=10;
var num2=3;
document.getElementById("h1").innerHTML="("+num1+">"+num2+") || ("+num1+"<"+num2+")=="+((num1>num2)||(num1<num2));
//(10>3) || (10<3)== true
document.getElementById("h2").innerHTML="("+num1+">"+num2+") && ("+num1+"<"+num2+")=="+((num1>num2)&&(num1<num2));
//(10>3) && (10<3)== false
document.getElementById("h3").innerHTML="!(("+num1+">"+num2+") && ("+num1+"<"+num2+"))=="+!((num1>num2)&&(num1<num2));
//!((10>3) && (10<3))== true
}
</script>
</head>
<body>
<input type="button" value="测试逻辑运算符" onclick="test1();" />
<h2 id="h1"></h2>
<h2 id="h2"></h2>
<h2 id="h3"></h2>
</body>
</html>
比较与逻辑运算符通常都是用来做判断的。
}
例如:`
function test4(num1,num2){
var res=num1*num2;
return res;
}
function test5(){
var res=test4(100,123);
alert("res=="+res);
}
`4.JavaScript 对象
对象也是变量。但是对象包含很多值。
对象包含很多值1.属性 2.方法
对象就是用来描述具有相同属性和方法的变量。
属性----变量 【var】【属性名称:属性值】
方法----函数 【function】 【方法名称:function(){}】
格式:
var 对象名称={属性:属性值,…,
方法名称:函数};
例如:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>创建并使用对象</title>
<script>
//创建一个汽车对象
var car={
carName:"bmw",
carcolor:"红色",
start:function(){
alert("启动--"+car.carcolor+","+car.carName+"汽车");
},
stop:function(){
alert(this.carcolor+","+this.carName+"汽车停止了");
}
};
function startcar(){
car.carName="奔驰";
car.start();
}
function stopcar(){
car.carcolor="蓝色";
car.stop();
}
</script>
</head>
<body>
<input type="button" value="启动" onclick="startcar();"/><br>
<input type="button" value="停车" onclick="stopcar();"/><br>
</body>
</html>
var str=”hello”; 字符串
var num1=123; 数字
var num2=”123”; 字符串
var boo=true; 布尔
function test1(){ }–函数
用javascript表示一个学生
var student={
name:”zhangsan”,
age:23,
addres:”西安”,
sex:true,
xuexi:function(){
alert(“我是学生,我在学习!!!”);
}}
student.name=”lisi”; //修改对象的属性值
student.name; //获取对象的属性值。
student[“name”]
student.xuexi(); //访问学生的学习方法
通过对象的名称就可以访问对象中保存的变量和方法。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script>
//创建一个学生对象
var student={
stuid:1001,
stuname:"zhangsan",
stuage:23,
stuaddress:"西安",
getInfo:function(){
return student.stuid+"-"+student.stuname;
},
getInfo2:function(id,name){
student.stuid=id;
student.stuname=name;
return student.stuid+"-"+student.stuname;
}
};
var person={
personname:"wangwu",
mystudent:{
stuid:1001,
stuname:"zhangsan",
getInfo:function(){
return person.mystudent.stuid+"-"+person.mystudent.stuname;
}
}
}
function test1(){
var info1=student.getInfo();
alert(info1);
}
function test2(){
var info2=student.getInfo2(1002,"lisi");
alert(info2);
}
function test3(){
var name=person.personname;
//person.mystudent.stuid=1002;
//person.mystudent.stuname="lisi";
var info=person.mystudent.getInfo();
alert(name+"----"+info);
}
</script>
</head>
<body>
<input type="button" value="测试学生对象的getInfo方法" onclick="test1();"/>
<input type="button" value="测试学生对象的getInfo2方法" onclick="test2();"/>
<input type="button" value="测试Person对象" onclick="test3();"/>
</body>
</html>
请将下面的汽车做成一个对象
*请认真填写需求信息,我们会在24小时内与您取得联系。