本文共 1891 字,大约阅读时间需要 6 分钟。
我们平时说的Servlet看上去很神秘,其实本质很简单,
先说结论: Servlet就是一个Java接口interface而已。那servlet是干嘛的?很简单,接口的作用是什么?规范呗!
servlet接口定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法,
其中最主要的是两个生命周期方法 init()和destroy(),还有一个处理请求的service(),
也就是说,所有实现servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:这是Java给的一种规范!就像阿西莫夫的机器人三大定律、行尸走肉里Rick的那三个问题一样,规范!
servlet是一个规范,那实现了servlet的类,就能处理请求了吗?
答案是,不能。
你可以随便谷歌一个servlet的hello world教程,里面都会让你写一个servlet,
相信我,你从来不会在servlet中写什么监听8080端口的代码,servlet不会直接和客户端打交道!那请求怎么来到servlet呢?
答案是servlet容器,比如我们最常用的tomcat,
同样,你可以随便谷歌一个servlet的hello world教程,里面肯定会让你把servlet部署到一个容器中,不然你的servlet压根不会起作用。
tomcat才是与客户端直接打交道的家伙,他监听了端口,请求过来后,根据url等信息,确定要将请求交给哪个servlet去处理,然后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。
比如:一个简单的自己实现的Servlet(不管请求是什么都返回404)
class TeacherServlet implements Servlet{ @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { OutputStream out = res.getOutputStream(); out.write(("HTTP/1.1 404 Not Found\r\n" + "Content-Type: text/plain\r\n" + "Content-length: 10\r\n\r\n" + "Not Found").getBytes()); } @Override public void init(ServletConfig config) throws ServletException { } @Override public ServletConfig getServletConfig() { return null;} @Override public String getServletInfo() { return null;} @Override public void destroy() { }}
自己实现的Servlet容器:相当于Tomcat,jetty…
ServerSocket ss = new ServerSocket();//创建服务器Socket socket = ss.accept();//监听客户端连接/* 读取客户端数据 .............*/OutputStream soutput = socket.getOutputStream();Servlet servlet = new TeacherServlet();ServletResponse res = new ServletResponse(soutput);servlet.service(null, res);res.end();
所以Servlet的本质就是:
为java程序提供一个统一的web应用的规范。
参考:
https://www.zhihu.com/question/21416727 https://zhuanlan.zhihu.com/p/34518314
转载地址:http://jikzi.baihongyu.com/