用JAVA实现的webServer开发流程

Apache Tomcat服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Tomcat服务器时,可利用它响应HTML页面的访问请求。
所以所有网站想要能被用户访问到就必须挂载到服务器上,然后通过服务器来响应用户的访问请求,传输HTML页面到客户端的浏览器上。
从大三开始学习网站后台开发,然后发现其实我们现在所写的网页也就是jsp页面,其实只是一个java类而已,而为什么响应客户端的请求,到达浏览器解析出来的数据是html界面呢?通过查找资料发现将jsp转换成html页面以及根据不同的请求调动不同的jsp来对用户进行响应的功能是由服务器提供的,在这里我说的服务器就是Apache Tomca
服务器,于是我觉得做服务器比做网站更加厉害,只要掌握了服务器的构造原理的话,就能开发出性能更加优越的网站,所以我开始萌生了一个想法,那就是自己制作服务器,然后通过自己的服务器来响应浏览器的请求。到现在虽然我自己写的服务器项目还没有彻底完善,但感觉它就像足迹一样记录了我的每一个阶段的学习知识,在每次学习完新的学习知识之后,
都在考虑学习的知识能否给自己的服务器项目带来优化。
我写的服务器最初原型只是一个简单的Socket(套接字)通信模型,就是用一个ServerSocket的对象来监听8088端口,然后浏览器通过8088端口与ServerSocket连接,当连接成功之后就会产生Socket实例,然后我们通过这个Socket的输入流来获得浏览器的请求数据包。
浏览器与服务器的通讯是通过http协议来完成的,所以浏览器的请求数据包也遵循http协议,根据http协议的定义请求数据包分为三部分分别为请求行,消息头,消息正文,他们之间通过LRCF进行分割开,所以可以分别获得请求行,消息头,以及消息正文,根据http定义请求行一般包含提交类型和请求资源,通过解析请求资源可以获得浏览器想要访问的页面。这时响应页面的传输可以通过Socket的输出流,为了让浏览器能够解析出输出流形成相应的页面,所以输出流必须也遵守http协议所以也必须划分为三部分,分别为状态行,响应正文,以及响应头,其中状态行主要是状态码以及状态描述,浏览器通过它来获取访问是否成功,然后响应头是键值对,主要是告诉浏览器一些必要的消息,比如文件类型,以及字符集编码,响应正文则是html代码。
最开始的服务器只是单纯接收请求流,然后不进行分析,响应同样的数据。在学习了线程以后,采用线程池,使服务器每当接收一次访问请求时,便会创建一个线程任务加入线程池中,这样使得服务器能够响应多个浏览器的同时访问。然后通过学习字符串方法,运用字符串的剪切对请求资源的剪切,获得浏览器要访问的资源页面,在同时我也在这个项目中创建了这些资源请求对应的HTML页面,当服务器根据请求能找到对应的资源时,便返回状态码200,并将HTML页面代码通过Socket输出流输出到浏览器,若找不到则返回404状态码
在之后学习了数据库后,因为我响应的html页面存在表单提交,也就是类似于登录验证的功能,所以我考虑设置一个类,让它来接收表单的参数,并连接数据库获得数据进行对比来验证它的合法性,若其合法则该类返回合法的页面,若不合法则返回不合法的处理页面,那时感觉这种通过java代码写入html代码到浏览器的写法很神奇,现在学了jsp才发现原来这是一种简单servlet。
在之后学了properties文件,为了配置和修改方便,以及考虑到数据库的可移植性,所以,我将数据库连接要用到配置参数,例如url,usename,以及password,都写在了properties文件中,通过Properties对象来获得这些参数,然后进行数据库连接方便了数据库的可移植性。
然后发现了当浏览器频繁访问需要数据验证的页面时,使得数据库需要不停地连接以及关闭,降低了服务器的效率,所以我将数据库连接的功能改由数据库连接池来实现,用有限的连接来为尽可能的请求提供访问。
其实到这里服务器的基本功能已经基本完善了,但后来研究发现还存在不少问题,比如状态码的问题,http协议定义的状态码不止有200以及404,还有500、405等,因为状态码还有对应的键值对,所以我就使用Map对象用键值对的形式来存储这些状态码以及状态值,然后根据响应请求的不同状况在状态行中返回给不同的状态码以及状态描述,同样道理,返回给浏览器的数据类型不单只有html,也有xml,png等,他们对应的文本类型为text/html , text/xml image/png等,所以也需要一个Map对象以键值对的形式来存储数据类型,以及对应的文本类型,然后在响应请求时,修改响应头中的charset的值,使浏览器能够识别出响应数据包的真正类型,也使服务器能够传输不同的文本类型。
然后在最近学完反射原理以及Servlet以后,发现Tomcat服务器是通过反射来创建以及调用Servlet的,然后我也开始尝试用反射的原理动态创建调用我的响应类,我之前创建请求资源的响应类是采用静态创建以及调用的方式,也就是解析出请求资源所要请求的页面名,然后通过if进行判断哪个是它的响应界面,若满足条件,就执行if条件的执行语句也就是创建对应的响应类。所以现在就开始改成采用反射的原理来调用这些响应类。在Tomcat中有一个部署描述文件是web.xml,这个文件主要是加载到容器当中,让容器能根据不同的请求调用和实例化Servlet,我采用Map对象来充当这个web.xml功能,将请求页名,以及响应类名作为键值对,添加Map中,然后只要通过请求页面,我们在Map中就能找到对应的类名,然后通过反射就能创建调用这些响应类,不用再使用多个if来判断。
这个是我目前服务器的主要功能,它还存在很多的不足,例如只能传输静态页面,没法自动讲jsp转换成对应的Servlet,以及设置拦截器,和监听器等,在接下来的日子我会慢慢实现它。不过通过这个简单的项目,我感觉我对网站后台有了更深的认识,所以能够更好地学习这些知识,所以我也希望这份开发流程能帮助其他人更好的了解网站服务器,更好地学习网站开发

你可能感兴趣的:(用JAVA实现的webServer开发流程)