软件体系结构 B/S、C/S
1.常见软件体系结构
1.1 C/S
- C/S结构即客户端/服务器,例如QQ;
- 需要编写服务器端程序,以及客户端程序,例如我们安装的就是QQ的客户端程序;
- 缺点是两端都需要更新,麻烦。优点就是安全性高
1.2 B/S (重点)
- B/S结构即浏览器/服务器(Browser/Server);
- 优点只需要编写服务器端程序;
- 缺点是安全性差一些;
2.WEB资源
2.1 Web资源介绍
- html:静态资源(浏览器可以看的懂)
- JSP/Servlet:动态资源,有变量(需要先转换成html,再给浏览器)
2.2 静态资源和动态资源的区别
3 Web服务器
(1)Web服务器的啥作用是接收客户端的请求,给客户端作出相应。对于JavaWeb程序而言,还需要有JSP/Servlet容器,将动态资源转换成静态资源。当然容器的功能不止这些。所以需要使用的是Web服务器和JSP/Servlet容器,通常两者会集于一身。Tomcat(Apache)是当前应用的很广的JavaWeb服务器
(2)下载并配置Tomcat环境变量…
修改Tomcat端口号:打开其文件夹下的conf
找到这一项,并将8080改为需要的值
(3)Web应用(重点)
静态网站:
- 在webapps目录下创建一个目录(命名必须不包含中文和空格),这个目录被称为项目目录;
- 在项目目录下创建一个html文件;
- 启动Tomcat;
启动Tomcat后在地址栏里输入http://localhost:8080/hello1/index.html即可看到自定义的html页面
动态网站:
- 在webapps目录下创建一个目录(命名必须不包含中文和空格),这个目录被称为项目目录;
- 在项目目录下创建如下内容:
- WEB-INF目录;并在这个目录下创建web.xml文件;
- 创建静态或者动态页面;
- 启动Tomcat;
这样还没有体现动态网页的效果;在这个目录下创建个jsp文件,并写入相应的内容:
<%@page pageEncoding='utf-8'%>
<html>
<head>
<title>Hello2</title>
</head>
<body>
<h1>Hello2</h1>
<h3>${header['User-Agent']}<h3>
</body>
</html>
在效果图里就可以看到一些由变量产生的值:
以上就是一些简单的使用Tomcat的例子,没有太多技术含量。
HTTP协议
协议:协议的甲乙双方分别是客户端和服务端,理解成双方通信的格式(无状态协议:一次一个请求,完事儿即结束)
- 请求协议:客户端发送请求时;
- 响应协议;
例如在浏览器中输入百度的地址,打开了百度的页面,这个页面的html是服务器给我们发送的一部分信息被称为响应体(响应正文)。当向百度搜索时,打开了一个页面,这个页面已经下载到了浏览器当中。打开浏览器的开发者工具查看
头的内容很多,选择性的记忆一些重要的:比如Accept-Language、Connection、Host等
(1)无状态:服务器给反馈以后,就断开了链接。再次访问时,再发送一个请求。每次请求服务器都不知道是谁发送的。而有状态则是保持链接,说明每次请求服务器都知道是谁发送的,例如FTP协议。
(2)一个get请求的格式:
- 请求行
- 多个请求头信息:头名称:头值
- 空行
- 请求体
浏览器并不会将以上内容显示出来,只是显示了响应正文这部分信息。
(3)用intellij写一个页面并打开,用表单标签提交到自定义的html页面并查看相应的请求和响应
有关intellij的tomcat部署还有使用请参考Mr_OOO的博客
打开开发者工具并查看请求及响应
正文(体),表单是一大堆内容,而发送给服务器的只有一行字符串:usr=123&pwd=sss,多个参数之间用&隔开。
(4)个别请求头介绍
- Referer:请求来自哪个页面,例如你在百度上点击链接到了这里,那么Referer:https://www.baidu.com/;如果在浏览器的地址栏中直接输入地址,就没有Referer这个请求头;例子:比如直接输入某些网站的地址无法访问,然后在其所属的主页中点击超链接就可以访问,这就是通过设置Referer来实现的,通过判断是否是从其主页发出的请求;这个请求头可以统计访问量
- Content-Type:application/x-www-form-urlencoded:表单的数据类型,说明会使用url格式编码数据;url编码的数据都是以%为前缀,后面跟随两位的16进制
- Content-Length:请求体的长度
Referer是一个比较有用的请求头,它可以应该做统计工作,也可以用来做防盗链。
统计工作:公司在百度上做了广告,但是不知道在百度的广告对访问量是否有影响,那么可以对每个请求中的Referer进行分析,如果百度的很多就说明用户都是通过百度找到的。
防盗链:一个公司网站上有一个下载链接,而其他网站盗链了这个地址,那么其他网站就盗本公司的资源。这是就可以使用Referer进行防盗链,在资源被下载前,对Referer进行判断。如果请求来自本网站,则允许下载。
(5)常用响应头介绍
响应协议的格式如下:
- 响应行(协议/版本 状态码 状态码的解析),状态码以2开头都是成功
- 响应头(key/value的格式)
- 空行
- 响应正文
对一些响应进行解释:
- HTTP/1.1 200 OK:响应协议是HTTP1.1,状态码200表示请求成功,OK是对状态码的解释;
- Server:Apache-Coyote/1.1:服务器的版本信息;
- Content-Type:text/html;charset=UTF-8:响应体使用的编码为UTF-8;
- Cookie:JSESSIONID=EC0A658A9BB4B186CC4900F39A170CB7:响应给客户端的Cookie;
- Date:Thu, 01 Jun 2017 07:03:25 GMT:响应时间,这可能会有8小时的时区差;
响应码:响应头对浏览器来说很重要,它说明了响应的真正含义。例如200表示响应成功了,302表示重定向,这说明浏览器需要再发一个新的请求。
- 200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
- 404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;
- 500:资源找到了,但服务器内部出现了错误;
- 302:重定向,当响应码为302时,表示服务器要求浏览器重新再发送一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址;
- 304:当用户第一次请求index.html时,服务器会添加一个名为Last-Modified响应头,这个头说明了index.html的最后修改时间,浏览器会把index.html和最后响应时间缓存下来,当用户第二次请求index.html时,在请求中包含一个名为If-Modified-Since请求头,它的值就是第一次请求时服务器通过Last-Modified响应头发送给浏览器的值。If-Modified-Since请求头就是在告诉服务器,我这里缓存的index.html最后修改时间是这个,你看看现在的最后修改时间是不是这个,如果还是那么就不用响应这个index.html内容了,浏览器直接将缓存显示出来,而服务端会获取If-Modified-Since值,与index.html最后修改时间比对,如果相同服务器就会响应304,表示index.html与浏览器上次缓存的相同,无需再次发送,浏览器可以显示自己的缓存页面;如果比对不同,说明这个页面做了修改,服务端会响应200。
404的效果:访问一个不存在的页面
500效果:提交表单的页面中插入了一段Java代码,这个代码的运行结果有错
html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>
Hello1
</h1>
<%
int a = 10/0;
%>
</body>
</html>
在第一个页面填写用户名和密码:
点击sub以后:
以及响应:
302效果:暂时以图片的形式解释一下原理;302的重点是记住Location响应头
304效果:暂时以图片的形式解释一下原理:
(6)其他响应头
告诉浏览器不要缓存的响应头:
- Expires:-1;
- Cache-Control:no-cache
- Pragma:no-cache
自动刷新响应头,浏览器会在3秒之后请求www.baidu.com
- Refresh:3;url=http://www.baidu.com
(7)HTML中指定响应头
在html页面中可以使用<meta http-equiv=” content=”>来指定响应头,例如上例中就可以写成<meta http-equiv=’Refresh’ content=’3;url=http://www.baidu.com‘>
以上都是一些简单的演示和介绍,详细的操作会在后面的学习笔记中写
本人是菜鸟一枚,当做学习笔记写博客。谢谢各路大咖驻足审阅