34岁!100天!学会Java编程(Day29-Day38)—Web后端编程

96
魏小筠
2017.12.04 23:18* 字数 1763
色彩

“我不想改变世界,我只是不喜欢平庸。”

小小地装了个13,不过照片里不是我,是我前两天看到的一张网图,不过我很喜欢。我们每天熙熙攘攘,庸庸碌碌,留给世界的只是背影,但是有谁知道我们的内心是如此丰富而充满渴望的呢。
转眼10天过去,每天晚上看书编程,除了留下苍老了10天的自己,还有什么呢,我想是希望。
好了,停止文艺,开始码字。

(一)后端编程从零开始—ServerSocket服务器

准备工作还是从技术地图开始查起,找到目的地,优化路线,然后上路。不过后端跟前端不同,技术地图要更复杂,除了软件层面,还涉及硬件层面,以及一堆看不见摸不着的运行机制,总之有点玄之又玄的感觉。没办法,还是从最简单的1+1=2开始学起吧,看了半天,就只有TCP编程我还能看明白点,就从这开始吧。
这部分主要操作两个通信类Socket和ServerSocket,分别用于创建C/S软件结构中的客户端实例和服务器端实例,然后由他们完成一个基本TCP会话。两者的介绍内容有点多,具体请看J2SE的API说明文档:SocketServerSocket,这里我只介绍两者的使用步骤如下图:
[图片上传失败...(image-abd5eb-1512400127676)]
参照该图操作步骤可以分别实现一个简单的往返字符串通信会话,就像发短信一样,不需要任何其他协议支持。但是如果要利用制作好的html/css/js网站来做服务器,使用字节流经典循环读写法,在Edge浏览器/IE中也可以实现。但是这种方法在Chrome浏览器中就不行了,此时在浏览器中显示的是html文件的代码文本,而不是图像。查了下原因,是因为chrome要求得到的信息中必须包含http字头,否则无法识别数据类型(它不知道这是一个html文件,需要http协议来告诉它)。
此时,我们就需要一个http服务器了!!!

理论稍后做介绍,这时候我们有两个解决办法,一是自己查阅http协议格式要求,编程实现一个http服务器,来对TCP通信的消息进行包装和解包;二是找一个现成的http服务器。

这里我自己实现了一个对GET请求的解包和包装程序,分别对应requestProcess和responseProcess两个方法,前者对浏览器发过来的请求进行分解处理,得到想要的信息(主要是requestMethod, requestURI, requestFileType);后者是在向浏览器发送数据之前,先发送一个http格式消息(主要包括response status,content-Type)。
嗯,这个过程我复盘写得很简单,实际过程则是充满各种坑,没办法自学嘛,就只有不停地掉坑填坑。不过还是强烈建议自己编程实现一次,就会对TCP/IP通信,http协议有很深的理解和印象。

网络通信基础知识

进行第一阶段的过程中,强烈地感觉到基础知识的欠缺,这时候就需要缺啥补啥,吃哪补哪大法了。我也没花时间去读大部头书,先上网搜集了一些基础概念,总结如下:


网络通信基础知识

其中重点了解网络结构的TCP/IP五层模型以及HTTP协议格式与消息类型,对于理解前端与后端之间的沟通机制,和对于深入理解ServerSocket以及后面的其他几种服务器实现方式很有帮助。

(二)后端编程进阶—Sun HttpServer服务器

HttpServer是由Sun公司开发的内嵌于JDK的一款简易款服务器,而且是一款真正意义上的http服务器,尽管功能略显简陋,但是运用得当,仍然可以很好地承担超文本静态网站的服务器功能。具体的API接口参见com.sun.net.httpserver包的定义,这里我主要用到了HttpServerHttpExchange两个类。具体使用步骤如下:

Sun HttpServer服务器

该服务器总的来说比较成熟,肯定比我自己编的http服务器代码强,不过对于初学者有一点不利,就是网上搜索学习资料极少,演示代码更少,只有一个展示向浏览器输出简单文本的演示代码,拷贝过来改成网站需要较大的修改和优化。这部分自己摸索也有不少坑,尤其是一个sendResponseHeaders方法中len的长度设置,就花了我不少时间进行尝试,甚至一度放弃用来做网站服务器。不过掌握了之后,测试该服务器的速度性能还是不错的(并发和均衡性能曾被人吐槽,未测)。

这个服务器可以完美地实现不用JSP等动态网页的静态网站,对于
(1)信息展示型网站(中小企业);
(2)有数据交互但是没有网页动态生成的网站(可以对数据库进行数据操作和呈现,但是业务逻辑很简单,所有页面文件已提前用html/css/js编好)的建站都已经足够;
(3)甚至稍简单的动态网页也可以用拼接html字符串的方式或逐行输出生成,但是跟后面介绍的JSP网页比较起来仍然太过原始。

(三)后端编程再进阶—Servlet/JSP服务器

Servlet与JSP是一枚硬币的两面,在某种程度上是等价的。
Servlet面向Java工程师,JSP面向前端工程师,JSP在执行时会被翻译为Servlet程序执行,由Servlet向浏览器输出页面(浏览器无法直接识别.jsp文件)。
其实在学习前端编程的时候,我一直不明白为什么需要动态生成网页,然后转身来到后端发现,对于业务逻辑较复杂的网站,在后端需要将客户端的请求和数据库的数据,按照预设的业务流程进行复杂的处理,需要根据分支条件以显示不同的页面,或者在同一页面有不同的呈现。
所以,对于逻辑复杂网站,动态页面就很有用了!
下面是整理的Servlet/JSP知识点:

Servlet服务器与JSP动态页面

在Java中实现Servlet服务器之前,还有一点准备工作,需要下载一个Tomcat,方法是{Eclipse>窗口>首选项>树节点server>runtime environments>添加>Apache Tomcat v9.0},需注意最好是下载9.0版本,我开始下了一个7.0版本,结果每次运行都报错。
Tomcat是Servlet的一种容器,而Servlet必须运行在容器之上。
有了对前两种服务器的操作和理解,实现一个基本Servlet服务器比较容易,但是要想深入掌握Servlet提供的http服务器之外的各种逻辑处理机制,还是需要找本书看看,我看的是《JSP&Servlet学习笔记(第2版)》,不过建议练习完前两种服务器之后,再看这本书,否则不太好懂。
对于Servlet服务器,简而言之,在实现了HttpServer的功能基础上,还提供了页面调派、重定向、会话管理、监听器、过滤器、异步响应等功能,结合线程池使用,可以称为真正意义上一款强大的服务器软件。
基础的JSP页面编写,需要工程师既懂Java也懂html,这样的综合性人才较少,因此又发展出了EL、JSTL、TagFile等标签语言实现了Java的功能,EL能将运算表达式标签化、JSTL能将循环条件等控制语句便签化,TagFile便签甚至能像对象那样实现标签的继承。如此,前端工程师只要懂标签语言就好了,能更加专注于页面呈现。

(四)CE项目V5.0

本阶段CE项目升级的目标是实现从前端浏览器、后端服务器、数据库全部打通,并根据需要对软件进行重构(按照新的软件架构,重新搭建后端Java代码),并编写必要的JSP页面。
(1)软件架构重构
参照MVC(Model 2)架构模式对应用程序进行重构,软件结构及基本模块重新设计为:


软件重构CEV5.0

模块的功能设计为:


MVC模块功能定义

软件更新实现未完待续…

参考书目:
《JSP&Servlet学习笔记(第2版)》
《Java从入门到精通》

日记本
Web note ad 1