【Java】基于敏捷开发的简易Web服务器(附下载)
这是一款简易的Web服务器,使用JavaSE的基本工具,实现了主页、404页面、登录、注册、动态页面等最原始的功能。
github地址:https://github.com/541380000/Easy-Web-Server-Java
通过敏捷开发的方式,14个小版本快速更迭,能够看到代码的快速变化与结构调整。
项目实现的具体功能有:
1、对Http请求的解析、基本的Http响应的发送
2、多线程接收Http请求,进行响应
3、针对不同的业务请求,将具体的servlet业务处理类与服务器代码分开,将动态数据和静态页面模板分开,大大减小了耦合
4、支持中文编解码,能够使用thymeleaf生成动态网页
下面是项目后期版本的结构:
Java代码:
网页代码及配置文件:
下面是14个版本具体进行的工作:
版本号 | 包名 | 添加类 | 该版本实现的功能 |
1.0 | com.webserver.core | WebServer.java | 程序入口,在主函数中,初始化整个服务器所需的类,并开始监听Http请求 |
ClientHandler.java | 客户端响应类,该类将开启端口,监听TCP连接请求。连接成功时,将接收Http请求,根据Http请求所请求的资源,转向Servlet处理业务,或者转向其他资源 | ||
com.webserver.http | HttpRequest.java | Http请求类,客户端类接收到Http请求时,在这里进行处理。实现了接收Http请求行,Http消息头,消息体。 | |
HttpRespond.java | Http响应类,返回一个固定的文件"1.txt" | ||
2.0 | com.webserver.core | ClientHandler.java | 加入了当找不到资源时,返回固定的404页面 |
3.0 | com.webserver.core | ClientHandler.java | 加入了对主页请求(main.html)的响应,由于加载一个页面需要多次请求,所以,将原来的只响应一次Http请求,改为在多个线程中响应多次Http请求 |
4.0&5.0 | com.webserver.http | HttpContext.java | 新建该类。HTTP协议规定了某种特定类型文件对应的响应头的content-type,在发送特定类型响应时,应该修改该属性。这个类中包含一个映射,可以将文件后缀名映射到content-type属性的值 |
com.webserver.exception | EmptyHttpRequestException.java | 新建了空请求异常类,当接收到空请求时,抛出异常不响应,解决了空请求问题 | |
6.0 | com.webserver.http | HttpContext.java | 通过Tomcat服务器提供的web.xml文件,把所有类型文件对应的Content-Type导入 通过Dom4J的SAXReader解析XML,实现了大部分后缀名到content-type的映射 |
7.0 | webapps/myweb文件夹 | reg.html | 注册页面,用到表单和表格 |
8.0 | com.webserver.servlet | RegServlet.java | 服务器通过request得到用户提交的数据并保存,需要提前判断用户是否已经存在。响应客户端注册结果页面(包括注册成功,用户名已存在) |
9.0 | com.webserver.http | HttpRequest.java | 解决URL中,中文传递时的编码问题,HTTP协议的传输内容只能按照ISO8859-1字符集编码,不能包含中文,浏览器的做法一般是将字符按照UTF-8转换成3个字节,将每个字节以%XX的形式发送,因此在服务端请求解析类需要先将16进制转化成二进制,再进行UTF-8的解码 |
10.0 | webapps/myweb文件夹 | login.html | 登录界面和登录结果返回页面 |
login_success.html | |||
login_fail.html | |||
com.webserver.servlet | LoginServlet.java | 获取登录信息,与数据库比对,成功则响应成功login_success.html,否则响应失败login_fail.html | |
11.0 | com.webserver.servlet | HttpServlet.java | 重构代码,新建HttpServlet类,将所有公共代码放入其中。所有业务处理的Servlet都继承该类 |
com.webserver.http | HttpRequest.java | 加入对登录时,输入用户名和密码时post方式提交数据的支持 | |
12.0 | com.webserver.servlet | ShowAllUserServlet.java | 实现thymeleaf的动态网页支持,能够根据数据库内容,显示所有用户的信息。修改主页,将所有已完成的网页内容加入主页 |
13.0 | com.webserver.core | ServletContext.java | 加入反射,能够动态的根据请求的业务,实例化Servlet。将业务与对应的Servlet放在xml文件中,大大减小了业务代码和web容器代码的耦合性。在ServletContent类中放置静态map,实现请求路径到servlet的映射。 |
14.0 | com.webserver.core | ClientHandler.java | 将独立的多线程并发改为线程池并发 |
个人作品,请勿转载