- 模拟请求表单;
- 简易服务器代码获取请求;
- HTTP协议;
- 抽象封装Response和Request;
- 将与客户端的交互封装成Servlet;
- 使用分发器多线程处理各种业务;
- 分发器使用的上下文及全局变量;
- 利用反射优化代码;
- 在配置文件中设置路径与Servlet的对应关系;
- 完整源码下载链接
一、请求表单
首先在前端模拟一个注册请求表单,代码如下:
method是请求方式,默认为get,其数据量小,安全性不高,而post量大,安全性相对高;
action为请求的服务器路径;id用于前端区分唯一性;
name用于服务器区分唯一性,如要提交数据给后台,必须声明name;
此处fav的值对应多个,用于测试服务器解析参数。
二、简易服务器
用一个简易的服务器代码输出来自浏览器的请求信息。
开启上述服务器,以默认或GET方式发送表单,服务端接收到的信息是:
以POST方式发送表单,服务端接收到的信息是:
三、HTTP协议
上述两段请求信息由于请求方式不同导致略有差别,而这些固定格式的信息是由遵从HTTP协议的浏览器负责生成的。服务端响应的信息也要遵从HTTP协议,否则客户端无法解析返回的数据。HTTP响应格式与请求一样,由三个部分构成,分别是:
1、HTTP协议版本、状态代码、描述
2、响应头(Response Head)
3、响应正文(Response Content)
可以用代码方式拼接响应字符串:
HTTP协议中常用的一些信息:
1、状态代码:
200 OK
400 Bad Request
404 Not Found
405 Method Not Allowed
500 Server Error
2、内容类型:
超文本:Content-type:text/html;charset=GBK
纯文本:Content-type:text/plain;charset=GBK
下载流:Content-type:application/octet-stream
响应信息都是固定格式,不必每次都要拼字符串,可抽取共性封装成Response对象。Request如是。
四、Response
|
|
五、Request
主要解析请求信息中的请求方式和参数,并将结果封装成Request对象。
需要注意参数值为中文、一参多值的情况。
六、Servlet
客户端与服务器端的交互形式不定,如登录、注册、查看信息等。可抽象出一个抽象类,如下:
具体的交互业务类Servlet继承抽象类,利用JAVA的多态优化其他代码。示例如下:
七、分发器Dispatcher
既然交互方式不定,同一种交互方式的交互次数不定,需要借助分发器(多线程)进行优化处理。
八、上下文ServletContext和全局变量WebApp
分发器需要根据请求参数中的url,从上下文中找出对应的Servlet来做相应的处理。
创建WebApp,保存全局变量(上下文),以及对应的操作(解析、获取)
如果将上下文中存放的Servlet对象,改成存放对象全类名字符串。需要对象时,利用JAVA中的反射技术创建对象,这将极大优化内存。
九、反射
|
|
十、Xml配置文件
将请求资源路径与Servlet的对应关系写死在程序中,不便于代码维护扩展。最好的方式将其配置的xml文件中,程序负责解析而不用经常修改代码。配置文件格式如下:
从文件中抽象出2个对象
具体子类实现DefaultHandler中的方法:
解析配置文件代码如下: