Java web实现原理
说明
最近在看一本java web和tomcat技术介绍的书籍。故此,希望通过文字总结的方式总结自己学习所获,本篇主要介绍java实现web基本的信息浏览的方法原理。
web的本质
由于技术能力有限,或许我的表述存在某些问题,仅供参考。web网页技术其本质包括三个要素:访问用户、浏览器(软件)、访问地址(Url).三个基本的要素构成了一次简单的网页浏览的过程。其中访问用户为数据被动接收者,浏览器为数据加工者(根据既定规则展示数据),访问地址为数据获取(也可以理解为数据提供方)。由此可见,web的基础就是对于数据的获取和数据的展示,展示本篇不做介绍,主要介绍浏览器如何通过url获取网页数据的。
web实现
web构成主要就两个部分:服务端和客户端。而web的访问其实就是一次简单的net间的数据传输,web是基于TCP/IP协议簇的HTTP来规范通信过程,而基本的通信过程其实就是一次tcp方式连接get的请求过程。浏览器通过get方式获取当前的浏览信息(html或者其他资源文件信息)。如下,简单介绍有关http协议的的基本格式信息内容以及如何通过java程序模拟实现一次简单的网页访问。
1) HTTP协议
HTTP(HyperText Transfer Protocol)为超文本传输协议,这是万维网通信文件均需要遵循的标准。初期是为了专门处理超文本(html)数据传输的方法,后来慢慢规范,现在已经成为网络通信的一个基础的请求应答通信协议,成为首选的通信协议。HTTP规范了net请求过程中数据格式,规定了请求数据和响应数据格式。HTTP主要将通信数据分为三个部分方法(method)、头部(Header)、正文(Body)其中通过”\r\n”将正文与方法和头部进行分离。如下简单介绍一些常用的请求格式:
请求格式
请求格式分为三个部分组成:请求方法、请求头、请求体,如下给出一个简单的请求格式示例:GET / HTTP/1.1
Host: www.enjoytoday.cn
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://www.enjoytoday.cn/posts/326
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: bdshare_firstime=1466032270994; UM_distinctid=15c4ef2ac4e2e4-0d13269271b947-1b2a120b-1fa400-15c4ef2ac4f7b5; un=aGZjYWk=; comment_author=aGZjYWk=; comment_author_email=1710600212@qq.com; comment_author_url=http://www.enjoytoday.cn; c_id=dUhIaTlndmc4MVVYbjRQTGxMRTotMTpFODg3QjgzQjg1NjgxQjQxRUYxNjg2QzJFRkMyQjI2QQ==; JSESSIONID=ADBC8C3DADF6C815D778450C193C6637.ajp13_worker; Hm_lvt_ce55bfda158556585a8b7b246346c8ba=1498560244,1498739070,1498833193,1498917432; Hm_lpvt_ce55bfda158556585a8b7b246346c8ba=1498917597; CNZZDATA1262047894=1598545996-1495973145-%7C1498917578 username=hfcai&sex=man
如上,首行为请求方法、URI、和http协议版本号;请求头为和请求正文以及请求返回信息相关的一一些信息,包括数据编码、请求agent、连接类型、接受数据类型等。
响应格式
响应格式也是由三部分组成:相应状态码、响应头、响应体。其格式如下所示:HTTP/1.1 200 OK
Date: Sat, 01 Jul 2017 14:51:26 GMT
Server: Apache/2.4.7 (Ubuntu)
Set-Cookie: JSESSIONID=84C993F5E433C4DE9BFBA57150FFC065.ajp13_worker;path=/;HttpOnly
Content-Language: zh-CN
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 7333
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html;charset=UTF-8 <html>
<head>
<title>title of html.</html>
</head>
<body>
<h1>Hello world!</h1>
</body>
</html>如上,首行为Http协议版本号和返回状态码、返回描述信息(状态码由3位数字组成,200为成功接收返回),响应头包括服务器使用的服务容器类型版本、响应体数据类型、编码、长度等信息,最后响应体就是我们需要请求返回的数据,url访问返回的也就是html文本信息了。
2) Java实现一个简单的url访问web
为了能让浏览器通过url直接访问到我们的网页,我们需要通过java完成一个socket服务端,来模拟返回,代码如下:
public class HTTPServer {
public static void main(String[] args) {
int port=9000;
if (args!=null && args.length>0 && args[0]!=null && args[0].trim().length()>0) {
port=Integer.parseInt(args[0]);
}
ServerSocket serverSocket=null;
try {
serverSocket=new ServerSocket(port);
System.out.printf("[*] Listener success,and address %s",serverSocket.getLocalSocketAddress().toString());
while (true) {
Socket socket=serverSocket.accept();
System.out.printf("[*]Receiver Request,from %s:%d",socket.getInetAddress().getHostAddress(),socket.getPort());
handl_client(socket);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
System.out.printf("[*] Listener failed,and address %s",serverSocket.getLocalSocketAddress().toString());
try {
serverSocket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
private static void handl_client(Socket socket) throws Exception{
DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
DataOutputStream outputStream=new DataOutputStream(socket.getOutputStream());
int size=dataInputStream.read();
byte[] bs=new byte[size];
dataInputStream.read(bs);
String request=new String(bs);
System.out.println("[*]Request content is:"+request);
String requestParams=request.substring(0,request.indexOf("\r\n")).split(" ")[1];
String contentType;
if (requestParams.indexOf("html") !=-1 || requestParams.indexOf("htm")!=-1){
contentType="text/html";
}else if(requestParams.indexOf("jpg")!=-1 || requestParams.indexOf("jpeg")!=-1) {
contentType="image/jpeg";
}else if(requestParams.indexOf("gif")!=-1){
contentType="image/gif";
}else {
contentType="application/octet-stream";
}
String firstLine="HTTP/1.1 200 ok\r\n";
String responseHeader="Content-Type:"+contentType+"\r\n\r\n";
InputStream in=HttpServer.class.getResourceAsStream("html"+File.separator+requestParams);
outputStream.write(firstLine.getBytes());
outputStream.write(responseHeader.getBytes());
int len=0;
bs=new byte[128];
if (in!=null) {
while ((len=in.read(bs))!=-1) {
outputStream.write(bs,0,len);
}
}
in.close();
outputStream.close();
dataInputStream.close();
socket.close();
}
}
编译生成HTTPServer.class 运行监听请求,通过浏览器访问:http://localhost:9000/index.html, 浏览器返回显示如下:
Java web实现原理的更多相关文章
- 第一章 Java Web工作原理
一:在本章我们将学到如下的内容 >HTTP协议原理 >服务器端Web编程原理 >Servlet与Web容器 >Java Web应用程序的组成 >Tomcat介绍 一:1. ...
- Java Web工作原理(转载)
知识要点: 1.HTTP协议 2.web服务器的缺陷及其解决方案 3.对Servlet的认识 4.Servlet的主要任务 5.web容器对Servlet的支持包括的内容 HTTP协议---(Hype ...
- Java Web工作原理
解析HTTP协议 HTTP:超文本传输协议(HyperText Transfer Protocol) HTTP是一种无状态的协议,意思是指在Web浏览器和Web服务器之间不需要建立持久的连接. HTT ...
- Java Web程序工作原理
Web开发的最重要的基本功能是HTTP:Java Web开发的最重要的基本功是Servlet Specification.HTTP和Servlet Specitication对于Web Server和 ...
- Java web每天学之Servlet工作原理详情解析
上篇文章中我们介绍了Servlet的实现方式以及Servlet的生命周期,我们这篇文章就来介绍一下常用对象. 点击回顾:<Java Web每天学之Servlet的工作原理解析>:<J ...
- Java Web每天学之Servlet的原理解析
Java Web每天学之Servlet的工作原理解析,上海尚学堂Java技术文章Java Web系列之二上一篇文章Java Web每天学之Servlet的工作原理解析是之一,欢迎点击阅读. Servl ...
- Java Web文件上传原理分析(不借助开源fileupload上传jar包)
Java Web文件上传原理分析(不借助开源fileupload上传jar包) 博客分类: Java Web 最近在面试IBM时,面试官突然问到:如果让你自己实现一个文件上传,你的代码要如何写,不 ...
- SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。
熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...
- 使用Intellij idea新建Java Web项目(servlet) 原理及初步使用
准备 JDK (配置JDK_HOME\bin 和 CLASSPATH) 注:JDK8下载已经需要注册了,请使用JDK11(现在是官方长期支持的版本) 对于我们新手来说,JD ...
随机推荐
- MAC 软件提示已损坏,需要移到废纸篓的解决方法
解决方法一: 允许任何来源的应用.在系统偏好设置里,打开“安全性和隐私”,将“允许从以下位置下载的应用程序”设置为“任何来源“.当然,这个设置已经无法在Mac OS Sierra上完成了. 在Mac ...
- Kotlin Parameter specified as non-null is null
报错信息如下: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.j ...
- python数据库模块
安装数据库 [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.3/centos7-amd64 gpgkey=https://yu ...
- Linux IO协议栈
图片来源自网络,保持更新:更多内容请关注 cnblogs.com/xuyaowen 参考链接: https://zhuanlan.zhihu.com/p/39721251 http://blog.yu ...
- HTML Rendering Error
刚下载的markdown弹窗提示html渲染错误 去官网 http://markdownpad.com/faq.html#livepreview-directx 页面搜索 This view h ...
- SPA项目之CRUD+表单验证
1. 表单验证 Form组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则, 并将Form-Item的prop属性设置为需校验的字段名即可 <el-dialog :titl ...
- 【poj2661】Factstone Benchmark(斯特林公式)
传送门 题意: 给出\(x,x\leq 12\),求最大的\(n\),满足\(n!\leq 2^{2^x}\). 思路: 通过斯特林公式: \[ n!\approx \sqrt{2\pi n}\cdo ...
- 如何在Markdown格式下插入动图/gif
上传GIF动图与上传普通图片是一样的,都需要以下在markdown语法中 ![]() 的小括号内填写图片的地址.问题在于如何获取本地gif的地址呢? 核心的东西就是要把这个gif动图传上网络,这样图片 ...
- acwing 902. 最短编辑距离
地址 https://www.acwing.com/problem/content/904/ 给定两个字符串A和B,现在要将A经过若干操作变为B,可进行的操作有: 删除–将字符串A中的某个字符删除. ...
- Java内存中的常量池
1,java内存模型简介 <深入理解java虚拟机>里将java内存分为如下五个模块: 堆-堆是所有线程共享的,主要用来存储对象. 其中,堆可分为:新生代和老年代两块区域.使用NewRat ...